我工作的應用程序中使用的結構如下:,錯件(在單獨的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