AWT-EventQueue-0一直在运行,java中的程序变得非常慢

AWT-EventQueue-0一直在运行,java中的程序变得非常慢,java,swing,graphics,awt-eventqueue,Java,Swing,Graphics,Awt Eventqueue,我正在写gui。在这个gui中,有很多形状(大约200个)。我用画法画它们 在一种情况下,我必须让它们眨眼(在两种颜色之间切换)。在for循环中,我正在更改它们的颜色,然后fram.repaint() 然而,当我点击一些按钮时,过了一段时间程序变得非常慢。我通过配置文件进行了检查(我正在使用Netbeans)。我看到AWT事件队列在一段时间后开始一直运行 因此,我可以有两个解决方案: 是否有方法拆分的AWT事件队列添加另一个AWT事件队列?还是有更好的方法让200个形状闪烁 多谢各位 注意:详细

我正在写gui。在这个gui中,有很多形状(大约200个)。我用画法画它们

在一种情况下,我必须让它们眨眼(在两种颜色之间切换)。在for循环中,我正在更改它们的颜色,然后fram.repaint()

然而,当我点击一些按钮时,过了一段时间程序变得非常慢。我通过配置文件进行了检查(我正在使用Netbeans)。我看到AWT事件队列在一段时间后开始一直运行

因此,我可以有两个解决方案:

是否有方法拆分的AWT事件队列添加另一个AWT事件队列?还是有更好的方法让200个形状闪烁

多谢各位

注意:详细地说,我看到了pumpEvents、pumpEvents ForHierarchy、pumpEvents ForFilter、PumponeEventFilter

以下是喷漆方法:

@Override
public void paint(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    g2d.setStroke(bs_3);
    g2d.setColor(currentcolor);
    g2d.draw(line);;

}
这里是线程:

paintTimer = new Timer(1000, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            mframe.repaint();

                for (CircuitPanel cp : mframe.cppL){
                    cp.onOff();
                }
});

paintTimer.start();
以下是颜色变换器方法:

@Override
public void onOff() {
    if(currentcolor.equals(offcolor)){
        currentcolor=oncolor;
    }else{
        currentcolor=offcolor;
    }
}

这显示了一种方法。它在另一个由javax.swing.Timer维护的线程上标记时间,以便调整闪烁的速度。要在目标平台上评测,可以通过更改
N
和计时器的初始周期
1000 ms
轻松缩放示例。因为
javax.swing.Timer的实例使用了一个共享线程,所以正如前面所讨论的,每个组件都可以有自己的计时器。

我想我找到了原因。我在Netbeans中添加了一个bean,它是一个小面板。当我将其从框架中移除时,问题似乎已经解决。(我正在使用frame.repaint()方法,如下所示)

谢谢你的帮助和评论。在你的评论的帮助下,我正在改进我的代码

我在这里发布MyPanel(该bean)的代码:

packagebean;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.geom.Line2D;
导入java.awt.geom.Path2D;
公共类MyParallelPanel扩展了javax.swing.JPanel{
int-x1=300;
int x2=400;
int h=110;
Path2D path=新的Path2D.Double();
Line2D line1=新的Line2D.Double(0,h,(x2-x1)/2,0);
Line2D line2=新的Line2D.Double((x2-x1)/2,0,x2-((x2-x1)/2),0);
Line2D line3=新的Line2D.Double(x2-((x2-x1)/2),0,x2,h);
Line2D line4=新的Line2D.Double(x2,h,0,h);
颜色=新颜色(237236235);
/**创建新窗体MyParallelPanel*/
公共MyParallelPanel(int-x1、int-x2、int-h、彩色){
这是x1=x1;
这个。x2=x2;
这个,h=h;
这个。颜色=颜色;
设置尺寸(x2,h);
设置首选尺寸(新尺寸(x2,h));
}
公共空间设置颜色(颜色){
这个颜色=颜色;
}
公共空间塞斯(内西){
这个,h=h;
}
公共void setX1(int x1){
这是1.x1=x1;
}
公共无效集合x2(整数x2){
这是0.x2=x2;
}
公共事务委员会(){
初始化组件();
}
/**此方法从构造函数中调用,以
*初始化表单。
*警告:请勿修改此代码。此方法的内容为
*始终由表单编辑器重新生成。
*/
@抑制警告(“未选中”)
//                           
私有组件(){
javax.swing.GroupLayout=newjavax.swing.GroupLayout(this);
这个.setLayout(布局);
layout.setHorizontalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,400,短。最大值)
);
layout.setVerticalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,300,短。最大值)
);
}//                         
//变量声明-不修改
//变量结束声明
@凌驾
受保护组件(图形g)
{
Graphics2D g2d=(Graphics2D)g;
append(第1行,true);
append(第2行,true);
append(第3行,true);
append(第4行,true);
g2d.setColor(彩色);
g2d.填充(路径);
}
}

如果您已经在使用探查器,为什么不准确检查该线程中占用CPU的内容?这就是探查器的用途。您的问题可能不是您认为的问题,因此当真正的问题是修复我打赌您已经存在的错误时,“拆分队列”是一个糟糕的难题,我们无法猜测它在哪里,因为我们看不到代码。您是否会以某种方式添加计时器或侦听器,从而使系统陷入困境?只有你的代码才有答案。你能粘贴你的
paint(Graphics g)
method代码吗?你不应该在paint方法中绘制,而应该在JComponent的
paintComponent(…)
方法中绘制。默认情况下,这将提供双缓冲。我看到了你的paintTimer对象,但你在哪里创建它?很抱歉丢失了代码。现在我补充了我的问题。现在我将做出必要的改变,你向我解释过。感谢您的帮助我没有看到您的代码进入
start()
计时器
;请编辑您的问题以包含一个。您的示例远未完成;你可以从我举的例子开始。请注意,“Swing程序应该重写
paintComponent()
,而不是重写
paint()
”。
package beans;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.geom.Path2D;


public class MyParallelPanel extends javax.swing.JPanel {
int x1=300;
int x2=400;
int h=110;
Path2D path = new Path2D.Double();
Line2D line1 = new Line2D.Double(0, h, (x2-x1)/2, 0);
Line2D line2 = new Line2D.Double((x2-x1)/2, 0, x2-((x2-x1)/2), 0);
Line2D line3 = new Line2D.Double(x2-((x2-x1)/2), 0, x2, h);
Line2D line4 = new Line2D.Double(x2, h, 0, h);
Color color = new Color(237, 236, 235);
/** Creates new form MyParallelPanel */
public MyParallelPanel(int x1, int x2, int h,Color color) {
    this.x1=x1;
    this.x2=x2;
    this.h=h;
    this.color=color;
    setSize(x2,h);
    setPreferredSize(new Dimension(x2, h));

}

public void setColor(Color color) {
    this.color = color;
}

public void setH(int h) {
    this.h = h;
}

public void setX1(int x1) {
    this.x1 = x1;
}

public void setX2(int x2) {
    this.x2 = x2;
}
public MyParallelPanel() {

    initComponents();
}

/** This method is called from within the constructor to
 * initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is
 * always regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
    this.setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 300, Short.MAX_VALUE)
    );
}// </editor-fold>                        
// Variables declaration - do not modify                     
// End of variables declaration                   
@Override
protected void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g; 

path.append(line1,true);
path.append(line2,true);
path.append(line3,true);
path.append(line4,true);

g2d.setColor(color);
g2d.fill(path);
}



}