Java paintComponent自己进行绘制
我的问题是,当我按下按钮时,应该调用paintComponent,然后在JPanel上绘制图形,不幸的是,paintComponent在加载程序时绘制图形,在这种情况下,按钮是无用的 我制作了一个小版本的程序,使其易于快速阅读和检测问题。 这里的代码不是原始代码,但它演示了相同的问题Java paintComponent自己进行绘制,java,swing,paintcomponent,Java,Swing,Paintcomponent,我的问题是,当我按下按钮时,应该调用paintComponent,然后在JPanel上绘制图形,不幸的是,paintComponent在加载程序时绘制图形,在这种情况下,按钮是无用的 我制作了一个小版本的程序,使其易于快速阅读和检测问题。 这里的代码不是原始代码,但它演示了相同的问题 import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import j
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);
}
}
作为一个简单的解决方案,您可以为类创建一个实例变量:
private Boolean buttonPressed = false;
然后在actionListener中将该值设置为true
在paintComponent方法中添加如下代码:
if (buttonPressed)
g.drawOval(...);
更好、更复杂的解决方案是保留要绘制的对象列表。最初,列表将为空,当您按下按钮时,将向列表中添加一个对象。然后,绘制代码只是在列表中迭代以绘制对象
查看更多想法。示例代码并没有完全做到这一点,但它确实显示了如何从列表中绘制。让您的actionPerformed实现将所需的几何图形添加到列表中,并让paintComponent在列表中迭代以渲染形状。一个完整的例子出现了。我的问题是,。。好的,但你真正的问题是什么?例如,如果问题是为什么GUI在我调用代码中的重新绘制之前进行绘制,那么在我看来,这两个答案都没有直接解决这个问题,至少在遵循链接之前没有。。但是再一次,…你的问题是什么?安德鲁·汤普森先生,我希望你花更多的时间阅读我的帖子,而不是写评论,也许你会明白我的问题是什么…也许你会明白我的问题是什么。我为什么要费心去尝试呢?毕竟,有很多人提出问题,我们甚至一刻也不需要思考他们的问题是什么,因为他们很注意形成并提出一个特定的问题。祝你好运。我确实尝试过使用布尔变量,但按下按钮时不会绘制任何图形,也不会显示任何图形。我找到的最简单的解决方案是,使用匿名内部类,并添加一个布尔实例变量来控制paintComponent应绘制的时间和内容。我真正想理解的是为什么原始版本不起作用,以及为什么这个版本起作用。对我来说,让某样东西起作用是好的,但了解它是如何起作用是伟大的。@BilalKorir,你仍然不了解它是如何起作用的。不需要创建匿名内部类。正如我所建议的,所有的绘制逻辑都应该包含在TestPaint类中。如果它不起作用,那么您就错误地实现了该建议。我相信我确实正确地使用了实例布尔变量来实现。即使我完成了我的任务,我仍然想知道为什么。编程就是逻辑,最终问题会被发现。感谢您的评论,谢谢。@BilalKorir我相信我确实正确地使用了实例布尔变量实现了。-它不起作用,那么如何才能正确实施它???我完成了我的任务-用了一个过于复杂的解决方案,所以我想说任务还没有完成。