我的问题是,当我按下一个按钮时,应该调用paintComponent然后应该在JPanel上绘制一个图形,不幸的是paintComponent在加载程序时绘制图形,在这种情况下按钮是无用的。
我制作了我的程序的一个小版本,以便轻松快速地阅读和检测问题。 这里的代码不是原始代码,但它表明了同样的问题。
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class TestPaint extends JPanel implements ActionListener {
private JButton button_1 = new JButton( "Draw Oval" );
public TestPaint() {
add(button_1);
}
@Override
public void actionPerformed(ActionEvent e) {
if ( e.getSource() == button_1 )
repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(10, 10, 100, 100);
}
}
运行程序
import javax.swing.JFrame;
public class RunPaint {
public static void main(String[] args) {
TestPaint paint_g = new TestPaint();
JFrame frame = new JFrame("Testing");
frame.add(paint_g);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
}
}
答案 0 :(得分:6)
作为一个简单的解决方案,您可以为您的类创建一个实例变量:
private Boolean buttonPressed = false;
然后在actionListener中将值设置为true。
并在paintComponent()方法中添加如下代码:
if (buttonPressed)
g.drawOval(...);
更好(更复杂的解决方案)是保持List
个对象的绘制。最初列表将为空,当您按下按钮时,您将向列表添加一个对象。然后绘制代码只是遍历List来绘制对象。
查看Custom Painting Approaches了解更多提示。示例代码并没有做到这一点,但它确实显示了如何从List中绘制。
答案 1 :(得分:3)
让您的actionPerformed()
实现将所需的几何图形添加到List<Shape>
并让paintComponent()
遍历列表以渲染形状。一个完整的例子是here。