Java - Swing表单在被调用时显示为空

时间:2017-10-18 05:49:02

标签: java swing

我有一个鼠标点击事件,在点击时调用并显示一个新的JFrame表单。但是当我点击时,表单中显示的内容中没有任何元素。在我的项目中有两种类型的事件,我使用相同的机制处理它们。第一个工作完美,但第二个工作得到了问题。我也使用pack()但问题仍然存在。任何人都可以告诉我如何解决这个问题吗?非常感谢!我的项目是越南语,所以如果有人想提及代码或用户界面中的任何元素,那么只写一下没有任何符号就足够了!

以下是事件处理程序:

//The first event

private void tblClientResultMouseClicked(java.awt.event.MouseEvent evt) {                                             
    // TODO add your handling code here:
    DefaultTableModel dm = (DefaultTableModel) tblClientResult.getModel();
    int row = tblClientResult.getSelectedRow();
    int col = tblClientResult.getSelectedColumn();

    if (col == 7) {
        SearchTruyenFrm searchTruyenFrm = new SearchTruyenFrm(listKH.get(row));
        searchTruyenFrm.setVisible(true);
    }
}


//The second one

private void tblTruyenResultMouseClicked(java.awt.event.MouseEvent evt) {                                             
    // TODO add your handling code here:
    DefaultTableModel dm = (DefaultTableModel) tblTruyenResult.getModel();
    int row = tblTruyenResult.getSelectedRow();
    int col = tblTruyenResult.getSelectedColumn();

    if (col == 6) {
        MuonTruyen muonTruyen = new MuonTruyen();
        muonTruyen.setTruyen(listTruyen.get(row));
        muonTruyen.setPhieuMuon(phieuMuon);

        //Trouble here (?)
        ThueTruyenInfoFrm infoFrm = new ThueTruyenInfoFrm(listTruyen.get(row));
        infoFrm.setVisible(true);

        while (infoFrm.isVisible()) {

        }

        muonTruyen.setDieuKien(infoFrm.getTxtDieuKien().getText());
        muonTruyen.setGiaMuon(Float.parseFloat(infoFrm.getTxtGiaThue().getText()));
        muonTruyen.setTienPhat(0);
        muonTruyen.setPaid(false);
    }
}

构造函数内部:

public ThueTruyenInfoFrm(Truyen selected) {
    initComponents();

    txtTenTr.setText(selected.getTen());
    txtTacGia.setText(selected.getTacGia());
    pack();
}

如何发生: how the trouble goes

期望的结果: enter image description here

1 个答案:

答案 0 :(得分:3)

欢迎来到“亲爱的,我已经阻止事件调度线程(现在没有任何作用)的精彩世界”

鼠标事件(就像所有基于GUI的事件一样)是在EDT的上下文中传递的,所以做了类似......

的事情。
private void tblTruyenResultMouseClicked(java.awt.event.MouseEvent evt) {                                             
   //....
   while (infoFrm.isVisible()) {
   }
}

将阻止EDT并阻止任何进一步处理事件,包括绘制事件,基本上挂起你的程序。

我建议您首先阅读The Event Dispatch Thread,以便更加了解整体问题。

要解决您的问题,您需要使用模态对话框,该对话框将在对话框可见时等待,并在关闭后继续执行。

查看How to make dialogs

这是一个重要的教训,因为你永远不应该从一个顶级容器(如JFrame)开始,而是将所有GUI基于JPanel之类的东西,这会让你更大自由决定何时以及如何显示这些组件。

表单编辑器不会教您生成可重用或自包含代码的技术,我强烈建议您考虑花一些时间手工编写代码。