Java 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

我的问题是,当我按下按钮时,应该调用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);
    }
}

作为一个简单的解决方案,您可以为类创建一个实例变量:

private Boolean buttonPressed = false;
然后在actionListener中将该值设置为true

在paintComponent方法中添加如下代码:

if (buttonPressed)
    g.drawOval(...);
更好、更复杂的解决方案是保留要绘制的对象列表。最初,列表将为空,当您按下按钮时,将向列表中添加一个对象。然后,绘制代码只是在列表中迭代以绘制对象


查看更多想法。示例代码并没有完全做到这一点,但它确实显示了如何从列表中绘制。

让您的actionPerformed实现将所需的几何图形添加到列表中,并让paintComponent在列表中迭代以渲染形状。一个完整的例子出现了。

我的问题是,。。好的,但你真正的问题是什么?例如,如果问题是为什么GUI在我调用代码中的重新绘制之前进行绘制,那么在我看来,这两个答案都没有直接解决这个问题,至少在遵循链接之前没有。。但是再一次,…你的问题是什么?安德鲁·汤普森先生,我希望你花更多的时间阅读我的帖子,而不是写评论,也许你会明白我的问题是什么…也许你会明白我的问题是什么。我为什么要费心去尝试呢?毕竟,有很多人提出问题,我们甚至一刻也不需要思考他们的问题是什么,因为他们很注意形成并提出一个特定的问题。祝你好运。我确实尝试过使用布尔变量,但按下按钮时不会绘制任何图形,也不会显示任何图形。我找到的最简单的解决方案是,使用匿名内部类,并添加一个布尔实例变量来控制paintComponent应绘制的时间和内容。我真正想理解的是为什么原始版本不起作用,以及为什么这个版本起作用。对我来说,让某样东西起作用是好的,但了解它是如何起作用是伟大的。@BilalKorir,你仍然不了解它是如何起作用的。不需要创建匿名内部类。正如我所建议的,所有的绘制逻辑都应该包含在TestPaint类中。如果它不起作用,那么您就错误地实现了该建议。我相信我确实正确地使用了实例布尔变量来实现。即使我完成了我的任务,我仍然想知道为什么。编程就是逻辑,最终问题会被发现。感谢您的评论,谢谢。@BilalKorir我相信我确实正确地使用了实例布尔变量实现了。-它不起作用,那么如何才能正确实施它???我完成了我的任务-用了一个过于复杂的解决方案,所以我想说任务还没有完成。