JTextField没有更新

时间:2013-03-28 17:38:53

标签: java swing jtextfield

我有两个独立的组件,一个是扩展JTable的类,另一个是扩展JPanel的类(包含一个表单)。

当运行该应用程序时,两者都显示在同一视图上,当我单击表格上的一行时,我希望表单上的textfileds更新但没有任何反应 我使用observer(表单类是侦听器)模式将单击的行发送到包含要更新的表单字段的类/面板,接收值但不更新文本字段。

下面的代码在表单类中,它更新表单字段,表单类作为监听器添加到表类中,单击表行时触发下面的方法

public void onTableRowClick(CollectedParcelEvent e)
{
     JOptionPane.showMessageDialog(null,"test", "test", 1);

    txtCost.setText(Double.toString(e.getSource().getCost()));
    txtCustomerName.setText(e.getSource().getCustomer().getName());


    txtCost.repaint();
    txtCost.revalidate();

}

2 个答案:

答案 0 :(得分:1)

public void onTableRowClick(CollectedParcelEvent e)
{
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            //JOptionPane.showMessageDialog(null,"test", "test", 1);
            txtCost.setText(Double.toString(e.getSource().getCost()));
            txtCustomerName.setText(e.getSource().getCustomer().getName());
        }
    });
}

事件在单个事件线程上处理。在那里,GUI对其他事件没有响应,应该推迟以后使用 invokeLater 来做这些事情。

答案 1 :(得分:0)

我不明白你为什么要调用revalidate();,因为它只是告诉布局管理器根据新添加或删除的组件列表重置。

有关using revalidate();also this one

的更多答案,请参阅此链接

也许,repaint();应该足以满足所需的变化。

请检查您的方法,看看它是否真的被解雇了。