我做了一些菜单,它是更新conmmon变量(对于网格上的文本),然后离焦对话框必须重新绘制网格。这是截图:
主控制面板始终位于顶部位置,“数据显示”面板始终位于其后面。按前面板上的按钮时,数据显示器必须更新其网格。目前,网格上的公共变量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 :(得分: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);
}