2012-02-24 2 views
2

Я сделал несколько меню, и он должен обновить переменные conmonon (для текста на сетке), тогда диалоговое окно вне фокуса должно перерисовать сетку. Вот скриншот:Как перерисовать диалоговое окно фокуса без фокуса?

enter image description here

Главная панель управления всегда в верхнем положении и «Отображение данных» панель всегда сидит за ним. При нажатии кнопки на передней панели Data Display должен обновить свою сетку. В настоящее время общая переменная 0.4 на сетке обновляется путем добавления слушателя и работает нормально. Но сама сетка больше не перекрашивается. Как перерисовать диалоговое окно вне фокуса в режиме реального времени?

Вот код на передней панели:

public class MainDisplayForm extends javax.swing.JFrame { 

Storage st = new Storage(); 
DisplayForm dF = new DisplayForm(); 
.... 
public MainDisplayForm() { 
    initComponents(); 
    Btn_IncreaseGain.addActionListener(new ButtonListener_IncreaseGain()); 
} 
.... 
} //MainDisplayForm ends here. 

class ButtonListener_IncreaseGain implements ActionListener { 

DisplayForm dF = new DisplayForm(); 
Storage st = new Storage(); 

ButtonListener_IncreaseGain() 
{ 

} 

public void actionPerformed(ActionEvent e) {  

    st.iGain = 20; 

    dF.revalidate(); 
    dF.repaint(); 
    System.out.println("Testing"); 
    } 
}//Listener ends here. 

Вот код отображения данных:

public void paint(Graphics g) 
{   
    g2 = (Graphics2D) g; 
    paintComponents(g2); 

    //added numbers are for adjustment. 
    int x = this.jPanel1.getX()+8; 
    int y = this.jPanel1.getY()+30; 
    int width = this.jPanel1.getWidth()+19; 
    int height = this.jPanel1.getHeight()+40; 


    //labelling voltages 
    label0.setText(st.zero); 
    label1.setText(st.v1); 
    label2.setText(st.v2); 
    label3.setText(st.v3); 
    label4.setText(st.v4); 
    label5.setText(st.v3); 
    label6.setText(st.v4); 


    g2.setColor(Color.darkGray); 

    for(int i=x; i<width; i=i+80) 
    {  
     g2.drawLine(i, y, i, height);   
    }    

    int j = 0; 
    for(int i=y; i<height; i=i+80) 
    { 
     j++; 
     //st.iGain 
     g2.setColor(Color.orange); 
     if(j==1) 
     { 
      double k1 = st.iGain * 0.4; 
      st.v1 = Double.toString(k1); 

      g2.drawString(st.v1, x+5, y+10); 
     }    

     if(j==2) 
     {    
      double k2 = st.iGain * 0.3; 
      st.v2 = Double.toString(k2); 

      g2.drawString(st.v2, x+5, y+90); 
     } 
     g2.setColor(Color.DARK_GRAY); 
     g2.drawLine(x, i, width, i); 
     ....   

    } //grid info is not completed yet. 

Спасибо,

+0

ли Вы проверить SwingWorker http://docs.oracle.com/javase/6/ docs/api/javax/swing/SwingWorker.html? – VirtualTroll

+0

@Amine, спасибо за комментарий. Я попробую. – user1098761

+0

См. ** изменить 1 ** на мой ответ ниже. Я * думаю * Я вижу, где твоя проблема. –

ответ

3

Фокус не проблема и не имеет ничего чтобы справиться с вашей текущей проблемой. Решение заключается в изменении свойств сетки данных путем обновления полей, которые он содержит с помощью методов setter, и вызова перерисовки на JComponent (возможно, JPanel или какой-либо другой компонент, который в конечном итоге получается из JComponent), хранящегося в сетке данных. Метод paintComponent этого компонента должен использовать его поля классов для обновления того, что он рисует.

Вы почти никогда не рисуете в методе краски JComponent и, конечно же, не хотите рисовать прямо в окне верхнего уровня. Вы также, вероятно, не хотите устанавливать текст JLabels, JTextFields или любого другого JTextComponent. изнутри краски/paintComponent.

Не могу понять, почему ваш код не работает и может только предположить, что вероятная причина вашей проблемы в коде не показана.

Edit 1:
Просто угадать, но вы можете иметь проблемы ссылок. Я заметил, что ваш класс слушателя создает DisplayForm и объекты хранения:

DisplayForm dF = new DisplayForm(); 
Storage st = new Storage(); 

Там хорошая вероятность того, что эти объекты не отображаются те, особенно если вы создаете эти объекты в другом месте и отображать их. Опять же, я просто догадываюсь, так как я не вижу остальной части вашего кода, но, возможно, вам стоит передать ссылки на эти объекты в DisplayForm через параметры конструктора или сеттера.

Edit 2:
например,

public void setDisplayForm(DisplayForm dF) { 
    this.dF = dF; 
} 

// same for Storage 

И в основной программе:

public MainDisplayForm() { 
    initComponents(); 
    ButtonListener_IncreaseGain btnListenerIncreaseGain = new ButtonListener_IncreaseGain(); 
    btnListenerIncreaseGain.setDisplayForm(....); 
    btnListenerIncreaseGain.setStorage(....); 
    Btn_IncreaseGain.addActionListener(btnListenerIncreaseGain); 
} 
+1

+1 См. Также этот [пример] (http://stackoverflow.com/a/9346946/230513). – trashgod

+1

@ user1098761 для рисования для Swing JComponents будет выполняться в paintComponent() not paint() method +1 – mKorbel

+0

Я сделал эти объекты здесь, тоже открытый класс MainDisplayForm расширяет javax.swing.JFrame {} (класс рамки на передней панели). Поскольку они разные классы, я сделал dF, st в классе слушателя. – user1098761

Смежные вопросы