【发布时间】:2011-08-11 21:11:13
【问题描述】:
我正在尝试在 JScrollPane 上绘制一个红色方块。我下面的代码在这方面做得很好,但有时当我滚动视口太快时,红色方块会向上或向下跳跃。
这让我觉得很奇怪,因为 JScrollPane 本身是静止的,所以我认为 Swing 不会尝试在其中绘制的组件周围移动。我猜实际发生的是红色方块与视口相关联,视口显示移动的图形。
无论如何,如何防止红色方块跳来跳去并成功在列表上绘制一个红色方块?也许我完全采取了错误的方法。
package components;
import java.awt.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.*;
@SuppressWarnings("serial")
public class DialogWithScrollPane extends JFrame {
public DialogWithScrollPane() {
super();
setResizable(false);
Container pane = getContentPane();
Vector<Object> listOfStuff = new Vector<Object>();
for (int i = 0; i < 100; i++) {
listOfStuff.add(Integer.toString(i));
}
final JScrollPane scrollPane = new JScrollPane() {
public void paint(Graphics g) {
System.out.println("JScrollPane.paint() called.");
super.paint(g);
g.setColor(Color.red);
g.fillRect(20, 50, 100, 200);
}
};
JList list = new JList(listOfStuff) {
public void paint(Graphics g) {
System.out.println("JList.paint() called.");
super.paint(g);
// Well, I could do this...
//
// scrollPane.repaint();
//
// ...and it would solve the problem, but it would also result in an
// infinite recursion since JScrollPane.paint() would call this
// function again.
}
};
// Repaint the JScrollPane any time the viewport is moved or an item in the
// list is selected.
scrollPane.getViewport().addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
scrollPane.repaint();
}
});
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
scrollPane.repaint();
}
});
scrollPane.setViewportView(list);
pane.add(scrollPane);
setMinimumSize(new Dimension(300, 300));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(500, 250);
setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new DialogWithScrollPane();
}
});
}
}
【问题讨论】:
-
这个解决方案可能太健壮了,但您可以尝试使用
Glass Pane。例如 - stackoverflow.com/questions/6609888/… 但我可能错了,这个解决方案可能不适用。 -
@masson:请参阅我的回答编辑
标签: java swing jscrollpane