-1

我正在写一个gui。在那个 gui 中,有很多形状(大约 200 种)。我使用绘画方法来绘制它们。

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

但是,当我单击一些按钮时,一段时间后程序变得非常慢。我通过个人资料检查(我正在使用 Netbeans)。我看到一段时间后 AWT-Event-Queue 开始一直运行。

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

有没有办法拆分 AWT-EventQueue 添加另一个 AWT-EventQueue?或者有没有更好的方法让 200 个形状闪烁?

谢谢

注意:详细地,我看到了pumpEvents、pumpEventsForHierarchy、pumpEventsForFilter、pumpOneEventFilters...

这是绘画方法:

@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;
    }
}
4

2 回答 2

1

示例显示了一种方法。它在另一个线程上标记时间javax.swing.Timer,以便调整闪烁的速度。要在您的目标平台上进行分析,可以通过更改N计时器的初始周期来轻松扩展该示例,1000 ms. 因为实例javax.swing.Timer使用共享线程,所以每个组件都可以有自己的计时器,如此所述。

于 2012-05-17T18:00:27.587 回答
0

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

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

在这里,我发布了 MyPanel(那个 bean)的代码:

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);
}



}
于 2012-05-22T13:15:10.013 回答