텍스트 필드의 수를 작성했으며 Enter 키를 눌러 필드간에 포커스를 어떻게 전환 할 수 있는지 궁금합니다.Enter 키를 눌러 JTextFields를 전환하십시오.
또한 대상 필드를 제어 할 수 있습니까? 예를 들어, 을 field A
에 입력하면 포커스가 field C
으로 변경됩니다.
텍스트 필드의 수를 작성했으며 Enter 키를 눌러 필드간에 포커스를 어떻게 전환 할 수 있는지 궁금합니다.Enter 키를 눌러 JTextFields를 전환하십시오.
또한 대상 필드를 제어 할 수 있습니까? 예를 들어, 을 field A
에 입력하면 포커스가 field C
으로 변경됩니다.
간단한 예를 들어 전송 키를 설정하는 방법에 대해 설명합니다 How to Use the Focus Subsystem
를 살펴 보자 :
첫 번째JTextField
에 초점을 때, 다른 하나는 그 반대의 경우도 마찬가지 집중 될 것이다
Enter
를 쳤을 때 지금
textField
및
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
textField1.requestFocusInWindow();
}
});
textField1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
textField.requestFocusInWindow();
}
});
textField1
:
는 두 JTextField
의가 있다고 가정.
그것은 초점 서브 시스템
간단한 예를
public class TestFocusTransfersal {
public static void main(String[] args) {
new TestFocusTransfersal();
}
public TestFocusTransfersal() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JTextField field1 = new JTextField("1", 10);
private JTextField field2 = new JTextField("2", 10);
private JTextField field3 = new JTextField("3", 10);
private JTextField field4 = new JTextField("4", 10);
private JTextField field5 = new JTextField("5", 10);
private JTextField field6 = new JTextField("6", 10);
private JTextField field7 = new JTextField("7", 10);
private JTextField field8 = new JTextField("8", 10);
private JTextField field9 = new JTextField("9", 10);
private final MyOwnFocusTraversalPolicy policy;
public TestPane() {
// Set up enter for focus transfer...
Set forwardKeys = getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS);
Set newForwardKeys = new HashSet(forwardKeys);
newForwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0));
setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
newForwardKeys);
setLayout(new GridBagLayout());
add("Field #1: ", field1, 0, 0);
add("Field #2: ", field2, 2, 0);
add("Field #3: ", field3, 4, 0);
add("Field #4: ", field4, 6, 0);
add("Field #5: ", field5, 8, 0);
add("Field #6: ", field6, 2, 1);
add("Field #7: ", field7, 4, 1);
add("Field #8: ", field8, 6, 1);
add("Field #9: ", field9, 8, 1);
policy = new MyOwnFocusTraversalPolicy(
field1,
field6,
field7,
field8,
field9,
field2,
field3,
field4,
field5
);
// You can do this to make life easier, but it may have unexpected
// consequences...
// setFocusCycleRoot(true);
// setFocusTraversalPolicy(policy);
}
@Override
public void addNotify() {
super.addNotify();
// Comment this out if you use focusCycleRoot
SwingUtilities.getWindowAncestor(this).setFocusTraversalPolicy(policy);
}
protected void add(String label, JTextField field, int x, int y) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy = y;
gbc.gridx = x;
gbc.insets = new Insets(2, 2, 2, 2);
gbc.anchor = GridBagConstraints.EAST;
add(new JLabel(label), gbc);
gbc.gridx++;
add(field, gbc);
}
}
public static class MyOwnFocusTraversalPolicy
extends FocusTraversalPolicy {
private List<Component> order;
public MyOwnFocusTraversalPolicy(Component... order) {
this.order = new ArrayList<>(Arrays.asList(order));
}
@Override
public Component getComponentAfter(Container focusCycleRoot,
Component aComponent) {
int idx = (order.indexOf(aComponent) + 1) % order.size();
return order.get(idx);
}
@Override
public Component getComponentBefore(Container focusCycleRoot,
Component aComponent) {
int idx = order.indexOf(aComponent) - 1;
if (idx < 0) {
idx = order.size() - 1;
}
return order.get(idx);
}
@Override
public Component getDefaultComponent(Container focusCycleRoot) {
return order.get(0);
}
@Override
public Component getLastComponent(Container focusCycleRoot) {
return order.size() > 0 ? order.get(order.size()) : null;
}
@Override
public Component getFirstComponent(Container focusCycleRoot) {
return order.get(0);
}
}
}
'JTextField'에 대한 액션 리스너 만 구현하면됩니다. 그래서 Enter 키를 누르면 액션이 완료됩니다. – Maroun
'ActionListener'는 열쇠입니다,하지만 어떻게 포커스 스위치를 제어 할 수 있습니까? –
jTextField.requestFocus() –