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

Java-Swing表单在被调用时显示为空,java,swing,Java,Swing,我得到一个鼠标点击事件,当点击时调用并显示一个新的JFrame表单。但是,当我单击时,表单显示,其中没有任何元素。在我的项目中有两个这种类型的事件,我用相同的机制处理它们。第一个很好用,但第二个有问题。我也使用pack(),但问题仍然存在。谁能告诉我怎么解决这个问题吗?谢谢!我的项目是用越南语写的,所以如果有人想在代码或UI中提及任何元素,只需写它而不带任何符号就足够了 以下是事件处理程序: //The first event private void tblClientResultMouse

我得到一个鼠标点击事件,当点击时调用并显示一个新的JFrame表单。但是,当我单击时,表单显示,其中没有任何元素。在我的项目中有两个这种类型的事件,我用相同的机制处理它们。第一个很好用,但第二个有问题。我也使用pack(),但问题仍然存在。谁能告诉我怎么解决这个问题吗?谢谢!我的项目是用越南语写的,所以如果有人想在代码或UI中提及任何元素,只需写它而不带任何符号就足够了

以下是事件处理程序:

//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();
}
它是如何发生的:

预期结果:

欢迎来到“亲爱的,我已经阻止了事件调度线程(现在什么都不起作用)”的精彩世界

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

private void tblTruyenResultMouseClicked(java.awt.event.MouseEvent evt) {                                             
   //....
   while (infoFrm.isVisible()) {
   }
}
将阻止EDT并阻止任何事件的进一步处理,包括绘制事件,基本上会挂起程序

我建议你从阅读开始,对整个问题有一个更深入的了解

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

看一看

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


<>表格编辑不会教你制作可重用或自给代码的技术,我强烈建议你考虑花些时间手工编码它们。

< P>欢迎来到“亲爱的,我阻止了事件调度线程(现在没有工作)”的世界:

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

private void tblTruyenResultMouseClicked(java.awt.event.MouseEvent evt) {                                             
   //....
   while (infoFrm.isVisible()) {
   }
}
将阻止EDT并阻止任何事件的进一步处理,包括绘制事件,基本上会挂起程序

我建议你从阅读开始,对整个问题有一个更深入的了解

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

看一看

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


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

这看起来有点忙<代码>(iFifrm,ISVISILULL()){}“ScYouDouBAT”,因为当调用的表单不再可见时,我希望这个事件继续下去,但是这会循环消耗你的CPU的100%,也许为什么窗体永远不会显示——考虑增加100毫秒的睡眠。loop@ScaryWombat我添加了
Thread.sleep(100)
但仍然不起作用这看起来有点忙
而(infoFrm.isVisible()){}“ScYouDouBAT”,因为当调用的表单不再可见时,我希望这个事件继续下去,但是这会循环消耗你的CPU的100%,也许为什么窗体永远不会显示——考虑增加100毫秒的睡眠。loop@ScaryWombat我添加了
Thread.sleep(100)
但仍然不起作用,我在等待@MadProgrammer用facts@ScaryWombat啊,但是你做得太好了,你在等待@MadProgrammer来取代我的疯狂猜测facts@ScaryWombat啊,但是你做得太好了