Java JSpinner:autoselect onFocus
我想在用户通过表单中的JTextFields和jspinner进行制表时实现自动选择。为此,我使用此侦听器:Java JSpinner:autoselect onFocus,java,swing,focus,jspinner,Java,Swing,Focus,Jspinner,我想在用户通过表单中的JTextFields和jspinner进行制表时实现自动选择。为此,我使用此侦听器: public class AutoSelect implements FocusListener { @Override public void focusGained(final FocusEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override
public class AutoSelect implements FocusListener {
@Override
public void focusGained(final FocusEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (e.getSource() instanceof JTextField) {
try {
JTextField t = (JTextField) e.getComponent();
t.selectAll();
} catch (ClassCastException ex) {
//
}
}else if (e.getSource() instanceof JSpinner){
JSpinner spinner = (JSpinner)e.getComponent();
JTextField tf = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();
tf.selectAll();
}
}
});
}
@Override
public void focusLost(FocusEvent e) {
//
}
}
只是它对我的纺纱机不起作用。事件被触发,正确的行被执行,但是什么也没有发生。我怀疑我没有正确使用.getTextField()。有人对此有有效的解决方案吗?tf.selectAll()代码>应该被包装到
,所有内容都带有调用器中
非常异步(有关详细信息,请参阅Oracle教程Focus
)如何使用Focus,FocusSubsystem
- 然后
(并非在所有invokeLater
的所有情况下都是如此,但是 默认情况下)对于JComponents
,将此事件移动到队列末尾, 对我来说很正确JTextComponents
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ComboBoxTwo extends JFrame {
private static final long serialVersionUID = 1L;
private JTextField text = new JTextField(15);
private JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, 15, 1));
public ComboBoxTwo() {
text.setText("Something selectable");
text.addFocusListener(fcsListener);
JFormattedTextField format = ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField();
// or JTextField tf = ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField();
format.addFocusListener(fcsListener);
//or tf.addFocusListener(fcsListener); // depends of type for SpinnerXxxModel
add(text, BorderLayout.NORTH);
add(spinner, BorderLayout.SOUTH);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new ComboBoxTwo();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
//
private FocusListener fcsListener = new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
dumpInfo(e);
}
@Override
public void focusLost(FocusEvent e) {
dumpInfo(e);
}
private void dumpInfo(FocusEvent e) {
System.out.println("Source : " + name(e.getComponent()));
System.out.println("Opposite : " + name(e.getOppositeComponent()));
System.out.println("Temporary: " + e.isTemporary());
final Component c = e.getComponent();//works for editable JComboBox too
if (c instanceof JFormattedTextField) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
((JFormattedTextField) c).setText(((JFormattedTextField) c).getText());
((JFormattedTextField) c).selectAll();
}
});
} else if (c instanceof JTextField) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
((JTextField) c).setText(((JTextField) c).getText());
((JTextField) c).selectAll();
}
});
}
}
private String name(Component c) {
return (c == null) ? null : c.getName();
}
};
}