Paint 组件在调整大小 window 或使用滚动条后消失

Paint component disappear after resizing window or use scrollbar

我编写了一个程序,在单击“确定”按钮后绘制 50 个矩形。但我不明白为什么它在调整 window 大小后消失,使用滚动条或再次单击“确定”。 这是我的代码(我有两个 类:drawingPanel 和 Main) drawingPanel.java:

import javax.swing.*;
import java.awt.*;

public class drawingPanel extends JPanel 
{
    public boolean drawIt = false;
    public int x = 140,y = 0;

    public void paintIt()
    {
        drawIt = true;
        repaint();
    }

    public void paintComponent(Graphics g)
    {

        if (drawIt == true)
            {   
                super.paintComponent(g);    
                for (int i = 1; i <= 50; i++)
                {

                    g.fillRect(x, y, 50, 50);           
                    y += 70;
                }
            }

    }
}

Main.java:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main extends JFrame 
{
    private drawingPanel draw = new drawingPanel();
    private JPanel controlPanel = new JPanel();
    private JButton ok = new JButton("OK");
    private JScrollPane scroll = new JScrollPane(draw);

    public Main()
    {
        setSize(500,500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Demo");
        setLayout(new BorderLayout());

        controlPanel.setLayout(new FlowLayout());
        controlPanel.add(ok);
        ok.addActionListener(new okListener());

        draw.setPreferredSize(new Dimension(100,1000));

        add(controlPanel, BorderLayout.NORTH);
        add(scroll,BorderLayout.CENTER);
        setVisible(true);
    }

    private class okListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            draw.paintIt();
        }
    }

    public static void main(String[] args) 
    {
        new Main();
    }
}

请帮助我,在此先感谢。

像这样在您的绘制组件方法中重新初始化 x 和 y 字段,这样它们就不会在每次绘制 JPanel 时一直增加到看不见的地方:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);  // move this here

    if (drawIt) {
        x = 140;  // add these guys
        y = 0;

        for (int i = 1; i <= 50; i++) {
            // .... etc....

事情应该会顺利进行。

其他与您的问题无关的小问题:

  • 应该始终调用 super 的绘制方法,因此将其从 if 块中拉出。
  • 将绘图面板 class 重命名为 DrawingPanel 以使其符合 Java 约定。
  • 最好把if (drawIt == true) {改成更简单的if (drawIt) {
  • 小问题:paintComponent 应该是 protected,而不是 public