【发布时间】:2016-02-27 16:39:24
【问题描述】:
我正在尝试在 JScrollPanel 中放置一个不同大小的 JPanel(可能比标准屏幕宽得多)。目前效果很好,我已经将滚动条配置为手动正常工作,但是我希望 JPanel 不断向左“滚动”,以便随着时间的推移显示整个内容。我找到的所有答案都特定于 JTextArea 并使用 Carets,或使用 rectToVisible。这些都不起作用,因为我试图在内部滚动到单个 JPanel。
我在下面包含了我认为的所有相关代码。
center 是 JPanel(其中 Grid 是一个子类,用于专门绘制带有某些特定单元格颜色的网格),它带有我想自动滚动的 BorderLayout。
public GuiViewFrame(Song playMe) {
String[][] songArray = playMe.to2DArray();
this.displayPanel = new ConcreteGuiViewPanel(playMe);
main = new JPanel();
main.setLayout(new BorderLayout());
displayPanel.setLayout(new BorderLayout());
center = new Grid(playMe);
labels = new Labels(playMe);
horiz = new Horiz(playMe);
center.setPreferredSize(new Dimension(10 * songArray.length, 10 * songArray[0].length));
horiz.setPreferredSize(new Dimension(10 * songArray.length, 10));
horiz.setVisible(true);
main.add(center, BorderLayout.CENTER);
main.add(horiz, BorderLayout.NORTH);
scroll = new JScrollPane(main,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
add(scroll, BorderLayout.CENTER);
labels.setPreferredSize(new Dimension(20, 10 * songArray[0].length));
labels.setVisible(true);
add(labels, BorderLayout.WEST);
JScrollBar horiz = scroll.getHorizontalScrollBar();
InputMap im = horiz.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
im.put(KeyStroke.getKeyStroke("RIGHT"), "positiveUnitIncrement");
im.put(KeyStroke.getKeyStroke("LEFT"), "negativeUnitIncrement");
im.put(KeyStroke.getKeyStroke("HOME"), "minScroll");
im.put(KeyStroke.getKeyStroke("END"), "maxScroll");
this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
this.pack();
}
整个项目是生成一个结合 MIDI 和 GUI 来播放音乐的视图,但是现在一旦 MIDI 播放了足够多的歌曲,相关的音符就会离开屏幕。我想以一定的速度滚动以跟上 MIDI 的步伐。
【问题讨论】:
-
一个 JScrollPane 在内部使用一个 JViewport。我认为直接使用 JViewport 而不是 JScrollPane 会更好地满足您的需求。滚动本身可以使用 javax.swing.Timer 来完成。
标签: java swing jscrollpane