如何在不获得焦点的情况下重新绘制焦点对话框?

时间:2012-02-24 15:46:44

标签: java swing focus repaint

我做了一些菜单,它是更新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 个答案:

答案 0 :(得分:3)

焦点不是问题,与您当前的问题无关。解决方案是通过setter方法更新它包含的字段来更改数据网格的属性,并在数据网格所持有的JComponent(可能是JPanel或最终从JComponent派生的其他组件)上调用repaint。此组件的paintComponent方法应使用其类字段来更新它绘制的内容。

你几乎从不在JComponent的paint方法中绘制,当然你也不想直接绘制到顶层窗口。您可能也不希望设置JLabel,JTextFields或任何其他JTextComponent的文本。来自paint / paintComponent。

我无法理解为什么您的代码无效,只能猜测问题的可能原因是代码未显示。

编辑1:
只是猜测,但你可能有参考问题。我注意到你的监听器类创建了新的DisplayForm和Storage对象:

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

这些对象很可能不是显示的对象,特别是如果您在其他地方创建这些对象并显示它们。我只是猜测,因为我没有看到你的代码的其余部分,但也许你应该通过构造函数或setter方法参数将这些对象的引用传递给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);
}