【问题标题】:Java JComponents not repainting after JDialog closedJDialog关闭后Java JComponents不重新绘制
【发布时间】:2012-10-26 01:48:26
【问题描述】:

我有一个 Java 应用程序,它使用 JTable 来显示一些数据。我想输入来自JDialog 的数据。

我面临的问题是JDialog 打开后主窗口 GUI 将不再刷新。我试图将其更改为 JFrame 并且我得到了相同的行为。如果我将JTable 更改为JPanel,也会发生同样的情况。一切正常,直到在主窗口顶部打开一个窗口。此后,GUI 元素不会刷新,但按钮仍会对点击做出反应。

有人可以帮我理解什么是错的。

很抱歉没有分享任何代码。早上 5 点,我完全忘记了。 我有一个带有JTableJButton 的框架。该按钮打开JDialogJDialog 有一个嵌套了JTextFieldJButton 的面板。当我按下JDialog 中的按钮时,它会将数据发送到主框架。在那里,我想用收到的数据填充表格。我可以在调试器中看到数据。问题是在我重新启动应用程序之前它不会显示在表格中。我还在与表格相同的框架中添加了一个按钮来测试数据插入,它工作得很好。

public class GUIRezervari {

private static JButton butonNew;
private static JTable tabelRezervari;
public static DefaultTableModel dtm;
private static JScrollPane scrollPaneTabel;
private static JPanel panelRezervari;

private GUIRezervari(){

}

public static JPanel getGui(){
    setPanelRezervari();

    return panelRezervari;
}

private static void setPanelRezervari(){
    panelRezervari=new JPanel();
    panelRezervari.setLayout(new BoxLayout(panelRezervari, 0));

    Box hBox=Box.createHorizontalBox();
    hBox.add(Box.createHorizontalGlue());
    hBox.add(boxRezervari());
    hBox.add(Box.createHorizontalGlue());

    panelRezervari.add(hBox);
}
private static Box boxRezervari(){
    Box vBox=Box.createVerticalBox();

    vBox.add(Box.createVerticalStrut(20));
    vBox.add(boxButoane());
    vBox.add(Box.createHorizontalStrut(10));
    vBox.add(boxTabel());
    vBox.add(Box.createVerticalStrut(20));

    return vBox;
}

private static Box boxButoane(){
    Box hBox=Box.createHorizontalBox();

    butonNew=new JButton("New");
    butonNew.addActionListener(new RezervareNouaAL());

    hBox.add(Box.createHorizontalStrut(10));
    hBox.add(butonNew);
    hBox.add(Box.createHorizontalGlue());
    hBox.add(Box.createHorizontalStrut(10));

     return hBox;
}

private static Box boxTabel(){
    Box hBox=Box.createHorizontalBox();

    dtm=new DefaultTableModel();
    dtm.addColumn("Date");
    dtm.addColumn("Name");

    tabelRezervari=new JTable(dtm);
    scrollPaneTabel=new JScrollPane(tabelRezervari);

    hBox.add(scrollPaneTabel);

    return hBox;
}
}

public class RezervareNouaAL implements ActionListener{

@Override
public void actionPerformed(ActionEvent ae) {

    GUIRezervare.getFrame((JFrame)GUIRezervari.getGui().getParent());
}

}

public class GUIRezervare {

private static JLabel labelName;
private static JLabel labelDate;
private static JTextField fieldName;
private static JTextField fieldDate;
private static JButton butonSalveaza;
private static JButton butonAnuleaza;
private static JPanel panelRezervare;
private static JDialog frame;

private GUIRezervare(){

}

public static void getFrame(JFrame panel) {

    setGui();
    frame = new JDialog(panel, "Rezervare", true);
    frame.add(panelRezervare);
    frame.pack();
    frame.setVisible(true);

    frame.setTitle("Adauga rezervare");

}

public static JPanel getGui(){
    setGui();

    return panelRezervare;
}

private static void setGui(){
    panelRezervare=new JPanel();
    panelRezervare.setLayout(new BoxLayout(panelRezervare, 0));
    panelRezervare.setBorder(BorderFactory.createTitledBorder("Rezervare"));
    panelRezervare.setBackground(new Color(242,197,61));

    Box vBox=Box.createVerticalBox();

    vBox.add(Box.createVerticalStrut(10));
    vBox.add(panelRezervare());
    vBox.add(Box.createVerticalStrut(10));
    vBox.add(boxButoane());
    vBox.add(Box.createVerticalStrut(10));

    panelRezervare.add(vBox);
}
private static JPanel panelRezervare(){
    JPanel panelRezervareT=new JPanel();
    panelRezervareT.setBorder(BorderFactory.createTitledBorder("Date rezervare"));
    panelRezervareT.add(boxRezervare());
    panelRezervareT.setBackground(new Color(169,217,190));

    return panelRezervareT;
}
private static Box boxRezervare(){
    Box hBox=Box.createHorizontalBox();

    hBox.add(Box.createHorizontalGlue());
    hBox.add(boxStanga());
    hBox.add(Box.createHorizontalStrut(10));
    hBox.add(Box.createHorizontalGlue());

    return hBox;
}

private static Box boxStanga(){
    Box vBox=Box.createVerticalBox();

    vBox.add(boxName());
    vBox.add(Box.createVerticalStrut(5));
    vBox.add(boxDate());
    vBox.add(Box.createVerticalStrut(5));

    return vBox;
}

private static Box boxDate(){
    Box hBox=Box.createHorizontalBox();

    labelDate=new JLabel("Date :");
    fieldDate=new JTextField();

    hBox.add(labelDate);
    hBox.add(Box.createHorizontalStrut(10));
    hBox.add(Box.createHorizontalGlue());
    hBox.add(fieldDate);

    return hBox;
}

private static Box boxName(){
    Box hBox=Box.createHorizontalBox();

    labelName=new JLabel("Name :");
    fieldName=new JTextField();

    hBox.add(labelName);
    hBox.add(Box.createHorizontalStrut(10));
    hBox.add(Box.createHorizontalGlue());
    hBox.add(fieldName);

    return hBox;
}


private static Box boxButoane(){
    Box hBox=Box.createHorizontalBox();

    butonSalveaza=new JButton("Salveaza");
    butonSalveaza.addActionListener(new SalveazaClientAL());
    butonAnuleaza=new JButton("Anulaeza");
    butonAnuleaza.addActionListener(new ActionListener(){

        @Override
        public void actionPerformed(ActionEvent ae) {

            frame.dispose();
        }

    });

    hBox.add(butonSalveaza);
    hBox.add(Box.createHorizontalStrut(10));
    hBox.add(butonAnuleaza);

    return hBox;
}

public static String getFieldName() {
    return fieldName.getText();
}

public static String getFieldDate() {
    return fieldDate.getText();
}

public static void inchideFrame(){
    frame.dispose();
}
}

public class SalveazaClientAL implements ActionListener{

@Override
public void actionPerformed(ActionEvent ae) {

    GUIRezervari.dtm.addRow(new Object[]{GUIRezervare.getFieldName(),GUIRezervare.getFieldDate()});
GUIRezervare.inchideFrame();
}

}

这是代码。感谢您的帮助!

【问题讨论】:

  • 能否请您发布一些代码。另外,请解释一下“刷新”是什么意思——您是说您不能再与主 JFrame 交互,或者 JFrame 没有重新绘制(只是显示为纯灰色),还是您期望JTable 会自动更新您的 JDialog 数据吗?说它“不刷新”还不够具体。
  • “有人知道为什么会出现这种奇怪的行为吗?” - 有几个,可能都不会对你产生影响。向我们展示代码
  • 应该可以工作,所以您没有显示的代码似乎有问题......
  • 我添加了代码。我期待JTable 使用来自JDialog 的数据进行更新。谢谢!

标签: java swing user-interface jframe jdialog


【解决方案1】:

如果您的JDialog模态,则可能会发生这种情况。相反,创建一个 modeless 对话框,并让您的主窗口在对话框中注册为PropertyChangeListener。在这个example 中,主窗口中的JPanel 监听对话框中ObservedPanel 的实例。

【讨论】:

  • 嗯...无法复制。 macOS 有什么特别之处吗?
  • 不,我将 不会刷新 误读为 不响应用户手势,就像 modal 可能发生的情况对话。回想起来,前者暗示了一些阻碍或重新启动 EDT 的东西。查看代码的更多理由。
  • 您的示例运行良好。你能看看我的代码并告诉我为什么桌子没有重新粉刷吗?谢谢!
猜你喜欢
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多