如何停止重复调用java paint()来替换最后一个?

如何停止重复调用java paint()来替换最后一个?,java,swing,user-interface,Java,Swing,User Interface,我创建了一个带有自定义面板类的面板的窗口,并基于数组数据在其上绘制圆圈。如何让两组圆都留在屏幕上 import java.awt.Color; import java.awt.*; import javax.swing.*; class DataPaint extends JPanel { static int offsetY = 0; int leftX = 20; int[] guessColours; Color purple = new Color(15

我创建了一个带有自定义面板类的面板的窗口,并基于数组数据在其上绘制圆圈。如何让两组圆都留在屏幕上

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

class DataPaint extends JPanel {
    static int offsetY = 0;
    int leftX = 20;
    int[] guessColours;
    Color purple = new Color(155, 10, 255);
    Color pink = new Color(255, 125, 255);
    Color[] Colours = { Color.blue, Color.cyan, Color.green, Color.orange,
            pink, purple, Color.red, Color.yellow };

    public DataPaint() {
        setBackground(Color.WHITE);
    }

    public void paintClues(int[] guessColours) {
        this.guessColours = guessColours;
        offsetY += 30;
    }

    // naive attempt to make it work !!!!
    // what is diff between paintComponent and paint?
    public void update(Graphics g) {
        paintComponent(g);
    }

    // paint circles based on array data
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2 = (Graphics2D) g;

        for (int i = 0; i < guessColours.length; i++) {
            g2.setPaint(Colours[guessColours[i]]);
            g2.fillOval(leftX + (i * 30), offsetY, 20, 20);
        }
    }

    // create window with panel and paint circles on it based on array data
    public static void main(String args[]) {
        JFrame frame = new JFrame("data paint");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);

        DataPaint panel = new DataPaint();
        frame.add(panel);
        frame.setVisible(true);

        int[] cols = { 2, 4, 5, 3, 6 };
        int[] cols2 = { 1, 3, 7, 3, 4 };
        // the second call replaces the first call on the panel?
        panel.paintClues(cols);
        panel.paintClues(cols2);

    }
}
导入java.awt.Color;
导入java.awt.*;
导入javax.swing.*;
类DataPaint扩展了JPanel{
静态int offsetY=0;
int leftX=20;
int[]颜色;
紫色=新颜色(155、10255);
粉色=新颜色(255、125、255);
颜色[]颜色={Color.blue,Color.cyan,Color.green,Color.橙色,
粉红色,紫色,Color.red,Color.yellow};
公共数据绘制(){
挫折地面(颜色:白色);
}
公共空间(int[]颜色){
this.guesscolors=guesscolors;
偏移量+=30;
}
//天真的尝试让它工作!!!!
//油漆组件和油漆之间的差异是什么?
公共空间更新(图g){
组分(g);
}
//基于数组数据绘制圆
公共组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
for(int i=0;i<0.length;i++){
g2.setPaint(颜色[i]);
g2.椭圆形(左X+(i*30),偏位,20,20);
}
}
//创建带有面板的窗口,并基于阵列数据在其上绘制圆
公共静态void main(字符串参数[]){
JFrame=新JFrame(“数据绘制”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置尺寸(300300);
DataPaint panel=新的DataPaint();
框架。添加(面板);
frame.setVisible(true);
int[]cols={2,4,5,3,6};
int[]cols2={1,3,7,3,4};
//第二次呼叫取代面板上的第一次呼叫?
面板。油漆线(cols);
面板。油漆线(cols2);
}
}

你不能阻止它。Swing和大多数GUI框架的工作方式是,
paintComponent
方法或其类似方法总是被认为可以从头开始绘制所有内容

这有几个原因。一个是,如果窗口被调整了大小,或者发生了任何其他类型的布局更改,或者如果正在绘制的数据集以复杂的方式发生了更改,那么您仍然需要能够重新绘制。此外,一些窗口系统甚至不会永久存储在窗口中绘制的内容,因此,如果您的窗口被覆盖然后被覆盖,则需要能够重新绘制。有可能有一个组件有一个永久的图像,你可以画进去,但这不是通常的方式做事情,效率较低,除非你写,比如说,一个绘画程序

更改数据结构以便保留所有信息,并编写
paintComponent
,以便它每次调用时都能在屏幕上绘制所需的所有内容

(对于复杂图形的部分更新,有一些改进可以提高效率,但您不必担心这些问题,因为这是一个非常简单的例子。如果确实需要这样做,您可以要求Swing重新绘制组件的一个小区域(例如使用
JComponent.repaint(矩形r))
;然后在调用您的
paintComponent
方法时,它会自动禁止绘制到该区域以外的区域。这可以很好地防止闪烁并节省一些填充工作;然后,如果这确实关系到效率,则在paintComponent内部比较该剪辑区域(
Graphics.getClip()
)对于您正在绘制的内容,跳过所有不相交的内容。但是对于这个简单的例子,您确实不应该担心这一点。首先让您的代码正常工作,并正确使用Swing,然后在重要的情况下进行优化。)


在您的特定示例中,我认为这是一个策划人游戏(您应该在前面提到,以帮助我们阅读您的代码),将
cols
cols2
放入
int[]
DataPaint字段,然后使用
paintComponent
中的循环读取该数组中的每个子数组并绘制所有子数组。

很抱歉,我尝试将代码发布到此网站,但无法通过“质量控制”。但它的格式似乎还可以?质量过滤器可能不会抱怨您的代码(除非您没有缩进代码,您可以通过选择它并按下编辑工具栏中的“{}”按钮进行缩进);它抱怨你发布了大量代码,却没有解释。你应该解释更多关于你试图完成的任务。我编辑了你的问题,将其内联到代码中,并将你的实际问题以纯文本形式,而不是在代码中。我曾想过存储数组,但它似乎有点笨拙。如果我使用大量的数组:内存不是开始有点堵塞了吗?我以为东西会一直留在屏幕上,直到你在上面画画,而不是被下一个东西取代。我不能告诉画画方法只画面板的一个区域而不是整个面板。我想java可以做到这一点吗?@Gimli我已经添加了关于如何做到这一点的信息(见附加段落).但是不要担心在这里这样做;这是一个非常简单的程序,不需要这样的优化,并且尝试实现它可能会产生更多令人困惑的bug。谢谢你,凯文。我一直在忙着接受你的建议!!使用数组的arrayList选择“再次绘制所有内容”。差不多了,但是男孩,java绘制是真的我不知道我的中年大脑是否还能应付这种事情。我一直在保存的12年麦芽酒在哪里……重新策划:很好,我知道这是一个简单的游戏,但我认为这将是一个很好的学习项目。二月份才开始使用java。