-1

私はGUIを書いています。そのGUIには、たくさんの形があります(約200)。ペイント法で描きました。

ある状況では、それらを点滅させる必要があります(2つの色を切り替える)。forループでは、色を変更してからfram.repaint();を変更しています。

しかし、いくつかのボタンをクリックすると、しばらくするとプログラムが非常に遅くなります。プロファイルを介して確認しました(Netbeansを使用しています)。しばらくすると、AWT-Event-Queueが常に実行され始めているのがわかりました。

だから、私は2つの解決策を持つことができます:

別の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

このは、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 に答える