我工作的应用程序中使用的结构如下:,错件(在单独的JPanel类)获得焦点
- FrmMain(里面有我想补充我的“布局”面板,该面板)
- PnlNewCase
- PnlNewCaseNotes (其被添加到PnlNewCase面板之一)(以下简称“布局”,其被设置为接收区特定板面板)
- PnlNewPartsSelection(我的存在的祸根)
我的想法是投入聚焦于特定的JTextField(tfNom)每当我创建PnlNewPartsSelection一个新的页面时,它被实例化,但每当我试着做那个焦点被设置为另一个JTextField(tfAddressDetails)。
What I want in focus (in blue) vs what gets focus (in red)
我试着调试整个事情,一直无法查明,需要做的事情。我也尝试使用更简单的代码来重现问题,但在这种情况下它可以工作。两者之间的唯一显着的区别是,简化代码只由一个JFrame和JPanel的,而更复杂的代码包含:JFrame的 - > JTabbedPane中 - >的JPanel - > JPanel的,所以我不知道这是不是挂JTabedPane以某种方式将JPanel或JPanel与JPanel交互。
下面是我正在使用的方法的概要,我希望能帮助别人弄清楚发生了什么。
的JFrame FrMain:
private void btnNewRepActionPerformed(java.awt.event.ActionEvent evt) {
tabs.addTab("R" + tabNo++, p);
tabs.setSelectedIndex(tabNo);
}
的JPanel PnlNewCase:
public PnlNewCase(boolean isNewRep) {
initComponents();
checkRepStatus(isNewRep);
}
private void checkRepStatus(boolean isNewRep) {
if (isNewRep) {
btnNewNote.setVisible(false);
PnlNewCaseNotes p1 = new PnlNewCaseNotes();
pnlNotes.add(p1);
PnlNewPartsSelection p2 = new PnlNewPartsSelection();
JTextField t = p2.getTfNom();
pnlPartsCustomer.add(p2);
t.requestFocusInWindow();
validate();
}
}
的JPanel PnlNewCaseNotes:
public PnlNewCaseNotes() {
initComponents();
}
的JPanel PnlNewPartsSelection:
public PnlNewPartsSelection() {
initComponents();
}
/* A bunch of method calls to add place holders */
public JTextField getTfNom() {
return tfNom;
}
我也可以发表对每一类的代码如果需要的话(我只是觉得这应该是足够了)。
期待您的意见:)
这是不可能的'PnlNewCase'是有物理屏幕上,当你调用't.requestFocusInWindow()' ,这使得通话静音。您需要首先在用户界面上实现“PnlNewCase”,然后重定向控件。也许在你调用'add'(和'revalidate' /'repaint')后,调用'requestFocusInWindow' ...你可能会发现你需要使用'SwingUtilities.invokeLater'来使它工作,虽然 – MadProgrammer