我有一个框架和一个面板。我永久删除面板并添加另一个面板。添加一个新面板后,我需要JTextField来集中注意力。我该怎么办?
我尝试了panel.requestFocus()
方法,但它没有用。
示例代码:
public class Test{
public static void main(String[] args){
JFrame frame = new JFrame();
// ... frame options
// MyPanel extends JPanel
// and has a JTextField
contentPane.add(new MyPanel());
// Permanently I need to add another panel
contentPane.removeAll();
contentPane.add(new MyPanel());
}
}
答案 0 :(得分:4)
调用panel.requestFocus()
尝试将焦点放在容器本身而不是其任何子组件上。
在将组件添加到JTextField
后,在JFrame
上使用requestFocusInWindow。在MyPanel
中添加一个公共方法来调用此方法。
避免使用requestFocus
。来自docs:
不鼓励使用requestFocus,因为它试图将焦点放在组件的窗口上,这并不总是可行的。从JDK 1.4开始,您应该使用requestFocusInWindow方法,该方法不会尝试使组件窗口集中。
public class Test {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Focus JTextField");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyPanel myPanel = new MyPanel();
frame.add(myPanel);
frame.setVisible(true);
frame.pack();
myPanel.focusTextField();
}
});
}
}
class MyPanel extends JPanel {
private JTextField textField;
public MyPanel() {
textField = new JTextField(20);
add(textField);
}
public void focusTextField() {
textField.requestFocusInWindow();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 100);
}
}
答案 1 :(得分:0)
将这样的方法添加到MyPanel:
public void gainFocus() {
tf.requestFocus();
}
在需要聚焦时,从主方法或其他地方调用它。
答案 2 :(得分:0)
您需要一种方法来从MyPanel
获取TextField,如getTextField
,或者直接关注TextField的方法。这些方法必须在MyPanel
课程内。
示例方法:
public class MyPanel extends JPanel {
private JTextField textField;
//your code here
public void getTextFieldFocus() {
textField.requestFocus();
}
}
然后在需要关注时调用此getTextFieldFocus
方法。
否则,如果使用getTextField方法从MyPanel类中提取TextField,则在需要焦点时调用它:
panel.getTextField().requestFocus();
答案 3 :(得分:0)
使用。 textfield.setText( “”);当你需要获得焦点或尝试类似的东西时,你会控制你的领域,试试