AWT-EventQueue-0 работает все время, и программа работает очень медленно в java

Я пишу графический интерфейс. В этом графическом интерфейсе много форм (около 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;
    }
}

person Emre    schedule 17.05.2012    source источник
comment
Если вы уже используете профилировщик, почему бы вам не проверить, что именно загружает ЦП в этом потоке? Для этого есть профайлер.   -  person Marko Topolnik    schedule 17.05.2012
comment
Ваша проблема, скорее всего, не та, о которой вы думаете, и поэтому разделение очереди — плохой кладж, когда реальная проблема заключается в исправлении ошибки, которая, я уверен, у вас есть, и что у нас нет возможности угадать, где она, поскольку мы можем не вижу кода. Не могли бы вы каким-то образом добавить таймеры или прослушиватели и тем самым затормозить систему? Только ваш код содержит ответы.   -  person Hovercraft Full Of Eels    schedule 17.05.2012
comment
Можете ли вы вставить код метода paint(Graphics g)?   -  person Hakan Serce    schedule 17.05.2012
comment
Вы не должны рисовать в методе рисования, а скорее в методе JComponent (например, JPanel) paintComponent(...). Это даст вам двойную буферизацию по умолчанию. Я вижу ваш объект paintTimer, но где вы его создаете?   -  person Hovercraft Full Of Eels    schedule 18.05.2012


Ответы (2)


В этом примере показан один подход. Он отмечает время в другом потоке, поддерживаемом javax.swing.Timer, чтобы ускорить мигание. Для профилирования на вашей целевой платформе пример можно легко масштабировать, изменив N и начальный период таймера, 1000 ms. Поскольку экземплярыjavax.swing.Timer используют общий поток, каждый компонент может иметь собственный таймер, как описано здесь.

person trashgod    schedule 17.05.2012
comment
Извините за отсутствие кодов. теперь я добавил к своему вопросу. А теперь я внесу необходимые изменения, как вы мне объяснили. Спасибо за помощь - person Emre; 18.05.2012
comment
Я не вижу вашего кода для start() Timer; отредактируйте свой вопрос, включив в него sscce. - person trashgod; 18.05.2012
comment
Ваш пример далек от завершения; Вы можете начать с примера, который я привел. Обратите внимание, что программы Swing должны переопределять paintComponent(), а не paint(). Рисование в AWT и Swing: методы рисования. - person trashgod; 21.05.2012

Я думаю, что нашел причину. Я добавил bean-компонент в Netbeans, который представляет собой небольшую панель. Когда я удаляю его из кадра, кажется, проблема решена. (Я использую метод frame.repaint(), как вы можете видеть ниже)

Спасибо за вашу помощь и комментарии. Я улучшаю свои коды с помощью ваших комментариев.

Здесь я публикую код MyPanel (этого компонента):

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



}
person Emre    schedule 22.05.2012