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

标签 java swing focus repaint

我制作了一些菜单,它是为了更新常用变量(对于网格上的文本),然后失焦对话框必须重新绘制网格。这是屏幕截图:

enter image description here

主控制面板始终位于顶部位置,“数据显示”面板始终位于其后面。当按下前面板上的按钮时,数据显示器必须更新其网格。目前网格上的公共(public)变量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.

谢谢

最佳答案

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

您几乎从不使用 JComponent 的 Paint 方法进行绘制,当然您也不想直接绘制到顶级窗口中。您可能也不想设置 JLabels、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);
}

关于java - 如何在不获得焦点的情况下重新绘制失焦对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9433629/

相关文章:

java - 如何停止多线程聊天客户端

java - 具有自定义类的 getFocusOwner

css - 在 CSS 中输入类型文件 + 焦点 + 相邻选择器?

javascript - 更改复选框字段的输入焦点和边距/填充

java - 在 Android 上通过套接字接收实时音频数据

java - 将 APK 与应用程序 bundle 在一起

java - Gradle Failiure:无法通过 '13.0.1'确定Java版本

java - 在 JFrame 中显示 .png 图像?

java通过任务在jtextarea中列出文件名

java - 有没有人想出如何使 javafx tableview 像 jtable 一样工作?