paintComponent自己绘画

0 java swing paintcomponent

我的问题是,当我按下一个按钮时,应该调用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

运行程序

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

cam*_*ckr 6

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

private Boolean buttonPressed = false;
Run Code Online (Sandbox Code Playgroud)

然后在actionListener中将值设置为true.

并在您的paintComponent()方法中添加如下代码:

if (buttonPressed)
    g.drawOval(...);
Run Code Online (Sandbox Code Playgroud)

更好(更复杂的解决方案)是保持一个List对象的绘制.最初列表将为空,当您按下按钮时,您将向列表添加一个对象.然后绘制代码只是遍历List来绘制对象.

查看自定义绘画方法以获取更多创意.示例代码并不完全如此,但它确实显示了如何从List绘制.