Как перекрасить не в фокусе диалог, не получая его фокус? - PullRequest
2 голосов
/ 24 февраля 2012

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

enter image description here

Основная панель управления всегда находится в верхнем положении, а панель «Отображение данных» всегда находится позади нее. При нажатии кнопки на передней панели дисплей данных должен обновить свою сетку. В настоящее время общая переменная 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.

Спасибо

1 Ответ

3 голосов
/ 24 февраля 2012

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

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

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

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

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

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

Редактировать 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...