【发布时间】:2018-03-29 23:49:18
【问题描述】:
我正在开发一个具有以下结构的应用程序:
- FrmMain(其中包含我要添加“布局”面板的面板)
- PnlNewCase(设置为接收区域特定面板的“布局”面板)
- PnlNewCaseNotes(添加到 PnlNewCase 的面板之一)
- PnlNewPartsSelection(我存在的祸根)
我的想法是,每当我在 PnlNewPartsSelection 中创建一个新页面时,只要它被实例化,就将焦点放在一个特定的 JTextField (tfNom) 上,但每当我尝试这样做时,焦点就会完全设置到另一个 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;
}
如果需要,我也可以发布每个类的代码(我只是认为这应该足够了)。
期待你们的 cmets :)
【问题讨论】:
-
当您呼叫
t.requestFocusInWindow()时,屏幕上不太可能出现PnlNewCase的实体,这会使呼叫静音。你需要先在 UI 上实现PnlNewCase,然后再进行重定向控制。也许在你打电话给add(和revalidate/repaint)之后,打电话给requestFocusInWindow...你可能会发现你需要使用SwingUtilities.invokeLater才能让它工作
标签: java swing focus components setfocus