我有一个鼠标点击事件,在点击时调用并显示一个新的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();
}
答案 0 :(得分:3)
欢迎来到“亲爱的,我已经阻止事件调度线程(现在没有任何作用)的精彩世界”
鼠标事件(就像所有基于GUI的事件一样)是在EDT的上下文中传递的,所以做了类似......
的事情。private void tblTruyenResultMouseClicked(java.awt.event.MouseEvent evt) {
//....
while (infoFrm.isVisible()) {
}
}
将阻止EDT并阻止任何进一步处理事件,包括绘制事件,基本上挂起你的程序。
我建议您首先阅读The Event Dispatch Thread,以便更加了解整体问题。
要解决您的问题,您需要使用模态对话框,该对话框将在对话框可见时等待,并在关闭后继续执行。
这是一个重要的教训,因为你永远不应该从一个顶级容器(如JFrame
)开始,而是将所有GUI基于JPanel
之类的东西,这会让你更大自由决定何时以及如何显示这些组件。
表单编辑器不会教您生成可重用或自包含代码的技术,我强烈建议您考虑花一些时间手工编写代码。