gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:56:42 26 4
gpt4 key购买 nike

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

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 的绘制方法进行绘制,当然您也不想直接绘制到顶级窗口中。您也可能不想设置 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com