2015-04-11 4 views
1

У меня есть макет панели утратившим следующий кодНажмите клавишу TAB для следующего Java в вертикальной компоненте оси

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. Как я могу заставить его двигаться или указывать на следующую горизонтальную область текста

+1

Java ГПИ должны работать на разных ОС, размер экрана, разрешение экрана и т. д. Таким образом, они не способствуют идеальной компоновке пикселей. Вместо этого используйте диспетчеры макетов или [их комбинации] (http://stackoverflow.com/a/5630271/418556), а также макет и границы для [пробела] (http://stackoverflow.com/a/17874718/ 418556). * «Как я могу заставить его двигаться или указывать на следующее горизонтальное текстовое поле» * Что? Вы хотите, чтобы фокус переместился в следующее текстовое поле, когда указатель мыши указывает на него, или .. что? –

ответ

2

Если моя интерпретация вопроса верна, вы хотели бы настроить обход фокуса. Вы можете предоставить свою собственную политику обхода фокуса, чтобы переопределить порядок циклического фокуса по умолчанию. Взгляните на Customizing Focus Traversal в разделе Как использовать фокусную подсистему учебник. В нем приведен пример, который иллюстрирует, как установить настраиваемую политику.

На стороне примечания, как уже упоминалось в комментариях, абсолютное позиционирование (нулевой макет) имеет много недостатков и должно учитываться с особой тщательностью. Нулевых макетов следует избегать в большинстве случаев. Как указано в Doing Without a Layout Manager (Absolute Positioning):

Хотя можно обойтись без менеджера компоновки, вы должны использовать менеджер компоновки, если вообще возможно. Менеджер компоновки упрощает , чтобы настроить внешний вид компонентов, зависящих от внешнего вида, до разных размеров шрифта, изменяя размер контейнера и до разных мест. Менеджеры макетов также могут быть легко использованы повторно другими контейнерами , а также другими программами.

Посмотрите на A Visual Guide to Layout Managers, чтобы ознакомиться с макетами Swing.

0

В качестве примера - используя Customizing Focus Traversal тему в Как использовать фокус Subsystem учебник, который уже был упомянут 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); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^