我有一个面板null布局,并有以下代码
int k=130;
int h=10;
for (int i=0; i<22; ++i) {
jTextFieldArray[i] = new JTextField();
jTextFieldArray[i].setBounds(k, h, 120, 25);
String s = Integer.toString(i+1);
jTextFieldArray[i].setText(s);
h+=30;
panel.add(jTextFieldArray[i]);
if (i==10) k=430;
if (i==10) h=10;
}
当我按TAB键时,光标将移动到下一个水平Textfield。如何使其移动或指向下一个水平Textfield
答案 0 :(得分:2)
如果我对问题的解释是正确的,您可以自定义焦点遍历。您可以提供自己的焦点遍历策略以覆盖默认焦点循环顺序。请查看如何使用焦点子系统教程中的Customizing Focus Traversal主题。它有一个示例说明如何安装自定义策略。
另外,正如评论中已经提到的那样,绝对定位(空布局)有许多缺点,应该特别小心。在大多数情况下,应该/可以避免空布局。如Doing Without a Layout Manager (Absolute Positioning)中所述:
虽然可以不使用布局管理器,但您应该使用 布局经理,如果可能的话。布局管理器使其更容易 调整依赖于外观和感觉的组件外观 不同的字体大小,容器的大小变化,以及不同的 语言环境。布局管理器也可以被其他人轻松重用 容器,以及其他程序。
查看A Visual Guide to Layout Managers以熟悉Swing布局。
答案 1 :(得分:0)
作为示例 - 使用Customizing Focus Traversal已经提到的如何使用焦点子系统教程中的Aqua主题:
private void tryCustomFocusTraversal() {
final JFrame frame = new JFrame("Stack Overflow: vertical tab order");
frame.setBounds(100, 100, 800, 600);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
final JPanel panel = new JPanel(null);
final JTextField[] jTextFieldArray = new JTextField[22];
int k = 130;
int h = 10;
for (int i = 0; i < jTextFieldArray.length; ++i) {
jTextFieldArray[i] = new JTextField();
jTextFieldArray[i].setBounds(k, h, 120, 25);
String s = Integer.toString(i + 1);
jTextFieldArray[i].setText(s);
h += 30;
panel.add(jTextFieldArray[i]);
if (i == 10) k = 430;
if (i == 10) h = 10;
}
frame.getContentPane().add(panel);
frame.setFocusTraversalPolicy(new CustomFocusTraversalPolicy(Arrays.asList(jTextFieldArray)));
frame.setVisible(true);
}
使用CustomFocusTraversalPolicy
类:
import java.awt.Component;
import java.awt.Container;
import java.awt.FocusTraversalPolicy;
import java.util.ArrayList;
import java.util.List;
public class CustomFocusTraversalPolicy extends FocusTraversalPolicy {
private final List<Component> componentOrder = new ArrayList<>();
public CustomFocusTraversalPolicy(final List<Component> componentOrder) {
this.componentOrder.addAll(componentOrder);
}
public Component getComponentAfter(final Container focusCycleRoot, final Component aComponent) {
return componentOrder.get((componentOrder.indexOf(aComponent) + 1) % componentOrder.size());
}
public Component getComponentBefore(final Container focusCycleRoot, final Component aComponent) {
final int currentIndex = componentOrder.indexOf(aComponent);
return componentOrder.get(currentIndex > 0 ? currentIndex - 1 : componentOrder.size() - 1);
}
public Component getFirstComponent(final Container focusCycleRoot) {
return componentOrder.get(0);
}
public Component getLastComponent(final Container focusCycleRoot) {
return componentOrder.get(componentOrder.size() - 1);
}
public Component getDefaultComponent(final Container focusCycleRoot) {
return getFirstComponent(focusCycleRoot);
}
}