默认情况下,在
现在我该怎么让
NimbusLookAndFeel
模式下的 JFileChooser
并不会在用户键入文件路径的 JTextField
显示焦点。如图所示,JComboBox
是 JFileChooser
的焦点所有者。现在我该怎么让
JFileChooser
打开时 JTextField
获取焦点呢?我尝试通过递归逻辑从 JFileChooser
中获取 JTextField
并对其调用 requestFocusInWindow()
方法。以下是我完成的全部代码。import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class GetFocusForJTextField extends JFrame
{
JButton jb;
JFileChooser jf;
public GetFocusForJTextField()
{
createAndShowGUI();
}
private void createAndShowGUI()
{
// For NimbusLookAndFeel, JTextField is not
// the default focus owner in JFileChooser
try
{
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
}catch(Exception e){}
setTitle("Get Focus for JTextField");
setLayout(new FlowLayout());
setSize(400,400);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
jb=new JButton("Open JFileChooser");
jb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae)
{
showDialog();
}
});
jf=new JFileChooser();
add(jb);
}
// Loop to find the JTextField, the first
// JTextField in JFileChooser
private void grabFocusForTextField(Component[] c)
{
for(Component k:c)
{
if(k instanceof JTextField)
{
JTextField jt=(JTextField)k;
jt.requestFocusInWindow();
break;
}
else if(k instanceof JPanel)
{
JPanel jp=(JPanel)k;
grabFocusForTextField(jp.getComponents());
}
}
}
private void showDialog()
{
jf.showOpenDialog(this);
grabFocusForTextField(jf.getComponents());
}
public static void main(String args[])
{
SwingUtilities.invokeLater(new Runnable(){
public void run()
{
new GetFocusForJTextField();
}
});
}
}
我仍然无法聚焦。为什么我无法做到这一点。
(Note: 该文本已被翻译成中文,保留了HTML标签,并且没有解释。)
NimbusLookAndFeel
上。我已经测试了WindowsLookAndFeel
、WindowsClassicLookAndFeel
、MetalLookAndFeel
和MotifLookAndFeel
。 - JavaTechnical[
标签]
内使用标签,否则您将失去大部分线程==疯狂引擎在第一眼。:-) - mKorbelMy Document
的JComboBox周围绘制焦点吗? - mKorbeldoAncestorChange(..)
,但该方法是...空的。今天我学到了一件事,还有就是JComponent.addNotify()
会触发 propertyChange。 - kleopatra