【发布时间】:2014-09-24 20:36:46
【问题描述】:
我正在尝试使用 JPanel 绘制一个矩形。问题是,当我单击一个菜单项时,它应该绘制一个新矩形。但是,当我这样做时,只画了一部分。这就是我的意思:
rectangleMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
squares.addSquare(10, 10, 100, 100);
}
});
这样做:
但是当我将 squares.addSquare(...) 放在 ActionListener 的外部时,它会给出正确的形状(只是不是在我想要的时候)
squares.addSquare(10, 10, 100, 100);
rectangleMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
//nothing on click...
}
});
这是正确的矩形:
知道为什么当我将它放入 ActionListener 时它不能正确绘制吗?谢谢。
完整代码
class UMLWindow extends JFrame {
Squares squares = new Squares();
private static final long serialVersionUID = 1L;
public UMLWindow() {
addMenus();
}
public void addMenus() {
getContentPane().add(squares);
//squares.addSquare(10, 10, 100, 100);
JMenuBar menubar = new JMenuBar();
JMenu file = new JMenu("File");
file.setMnemonic(KeyEvent.VK_F);
JMenu shapes = new JMenu("Shapes");
file.setMnemonic(KeyEvent.VK_F);
JMenuItem rectangleMenuItem = new JMenuItem("New Rectangle");
rectangleMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
squares.addSquare(10, 10, 100, 100);
}
});
shapes.add(rectangleMenuItem);
menubar.add(shapes);
setJMenuBar(menubar);
setTitle("UML Editior");
setSize(300, 200);
setLocationRelativeTo(null);
}
}
class Squares extends JPanel {
private static final long serialVersionUID = 1L;
private List<Rectangle> squares = new ArrayList<Rectangle>();
public void addSquare(int x, int y, int width, int height) {
Rectangle rect = new Rectangle(x, y, width, height);
squares.add(rect);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
this.setOpaque(true);
this.setBackground(Color.WHITE);
Graphics2D g2 = (Graphics2D) g;
for (Rectangle rect : squares) {
g2.draw(rect);
}
}
}
【问题讨论】:
-
@Bene:请回答。贝尼?你去哪儿了?
-
是的,这行得通。如果它成为答案,我会接受
-
@Harry 如果 Bene 没有回来,请自行回答
-
我猜有人建议调用重绘?另外,不要从 paintComponent 方法中更改组件的状态,这可能会导致触发另一个重绘......一遍又一遍......
-
@MadProgrammer 你能详细说明一下吗?你的意思是不要设置背景颜色等?
标签: java swing jpanel paintcomponent