当前位置: 首页 > 知识库问答 >
问题:

如何通过按Enter跨JTextField到下一个JTextField

须景胜
2023-03-14

当选中复选框在第二个文本域上设置启用(false)并按回车键时,需要将焦点放在第三个文本域
,如果没有选中任何复选框,则按回车键可以将焦点放在文本域上作为流。我应该添加任何代码或如何使其工作

我的GUI:

private void chk1ActionPerformed(java.awt.event.ActionEvent evt) {                                     
    // Set action perform for check box:
    if(chk1.isSelected()){
        p1.setEnabled(false);
    } else{
        p1.setEnabled(true);
    }
}

private void chk2ActionPerformed(java.awt.event.ActionEvent evt) {                                     
    // Set action perform for check box:
    if(chk2.isSelected()){
        p2.setEnabled(false);
    } else{
        p2.setEnabled(true);
    }
}

private void chk3ActionPerformed(java.awt.event.ActionEvent evt) {                                     
    // Set action perform for check box:
    if(chk3.isSelected()){
        p3.setEnabled(false);
    } else{
        p3.setEnabled(true);
    }
} 

private void p_numKeyPressed(java.awt.event.KeyEvent evt) {                                 
    // TODO add your handling code here:
    if(evt.getKeyCode()==KeyEvent.VK_ENTER){
        p1.requestFocus();
    }
}

private void p1KeyPressed(java.awt.event.KeyEvent evt) {                                 
    // TODO add your handling code here:
    if(evt.getKeyCode()==KeyEvent.VK_ENTER){
        p2.requestFocus();
    }
}

private void p2KeyPressed(java.awt.event.KeyEvent evt) {                                 
    // TODO add your handling code here:
    if(evt.getKeyCode()==KeyEvent.VK_ENTER){
        p3.requestFocus();
    }
}

共有1个答案

刘狐若
2023-03-14

我想你要找的是聚焦子系统。这负责按焦点遍历键时组件获得焦点的顺序。例如,您可以定义获取焦点的组件的顺序,还可以添加只将焦点转移到启用的组件的检查。您似乎还想添加Enter键作为焦点遍历键(即按下它时,焦点将被转移到另一个组件--根据当前的焦点遍历策略)。所有这些都可以通过焦点子系统来完成。

下面的代码似乎可以通过使用focus子系统来完成您所要求的工作:

import java.awt.Component;
import java.awt.Container;
import java.awt.DefaultFocusTraversalPolicy;
import java.awt.GridLayout;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class FocusHopSystem {
    
    public static class AbsoluteFocusTraversalPolicy extends DefaultFocusTraversalPolicy {
        private final Component[] comps;
        
        public AbsoluteFocusTraversalPolicy(final Component... comps) {
            this.comps = comps.clone();
        }
        
        private int indexOf(final Component comp) {
            for (int i = 0; i < comps.length; ++i)
                if (comps[i] == comp)
                    return i;
            return -1;
        }

        @Override
        public Component getComponentAfter(final Container aContainer, final Component aComponent) {
            final int aIndex = indexOf(aComponent);
            if (aIndex < 0)
                return null;
            for (int i = 1; i < comps.length; ++i) {
                final Component after = comps[(aIndex + i) % comps.length];
                if (after != null && after.isDisplayable() && after.isVisible() && after.isEnabled())
                    return after;
            }
            return null;
        }

        @Override
        public Component getComponentBefore(final Container aContainer, final Component aComponent) {
            final int aIndex = indexOf(aComponent);
            if (aIndex < 0)
                return null;
            for (int i = 1; i < comps.length; ++i) {
                final Component before = comps[(aIndex - i + comps.length) % comps.length];
                if (before != null && before.isDisplayable() && before.isVisible() && before.isEnabled())
                    return before;
            }
            return null;
        }

        @Override
        public Component getFirstComponent(final Container aContainer) {
            for (int i = 0; i < comps.length; ++i) {
                final Component first = comps[i];
                if (first != null && first.isDisplayable() && first.isVisible() && first.isEnabled())
                    return first;
            }
            return null;
        }

        @Override
        public Component getLastComponent(final Container aContainer) {
            for (int i = comps.length - 1; i >= 0; --i) {
                final Component last = comps[i];
                if (last != null && last.isDisplayable() && last.isVisible() && last.isEnabled())
                    return last;
            }
            return null;
        }

        @Override
        public Component getDefaultComponent(final Container aContainer) {
            return getFirstComponent(aContainer);
        }
    }
    
    private static void createAndShowGUI() {
        final String text = "0";
        final int width = 12;
        
        final JTextField tf1 = new JTextField(text, width),
                         tf2 = new JTextField(text, width),
                         tf3 = new JTextField(text, width),
                         tf4 = new JTextField(text, width);
        
        final JCheckBox ck2 = new JCheckBox("jTextField2", true),
                        ck3 = new JCheckBox("jTextField3", true),
                        ck4 = new JCheckBox("jTextField4", true);
        
        final JButton save = new JButton("Save");
        
        ck2.addActionListener(e -> tf2.setEnabled(ck2.isSelected()));
        ck3.addActionListener(e -> tf3.setEnabled(ck3.isSelected()));
        ck4.addActionListener(e -> tf4.setEnabled(ck4.isSelected()));
        
        final JPanel frameContents = new JPanel(new GridLayout(0, 5, 5, 5));
        
        //First row:
        frameContents.add(new JPanel());
        frameContents.add(ck2);
        frameContents.add(ck3);
        frameContents.add(ck4);
        frameContents.add(new JPanel());
        
        //Second row:
        frameContents.add(tf1);
        frameContents.add(tf2);
        frameContents.add(tf3);
        frameContents.add(tf4);
        frameContents.add(save);
        
        //Make the other components unfocusable:
        for (final Component comp: new Component[]{ck2, ck3, ck4, save})
            comp.setFocusable(false);
        
        //Make frameContents the focus cycle root:
        frameContents.setFocusCycleRoot(true);
        
        //Install our FocusTraversalPolicy to the cycle root:
        frameContents.setFocusTraversalPolicy(new AbsoluteFocusTraversalPolicy(tf1, tf2, tf3, tf4));
        
        //Add KeyEvent.VK_ENTER key to the focus traversal keys of the frameContents:
        final Set forwardKeys = frameContents.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS);
        final Set newForwardKeys = new HashSet(forwardKeys);
        newForwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0));
        frameContents.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, newForwardKeys);
        
        final JFrame frame = new JFrame("Focus traversal test.");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(frameContents);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        
        //Start focus on the first text field:
        tf1.requestFocusInWindow();
    }
    
    public static void main(final String[] args) {
        SwingUtilities.invokeLater(FocusHopSystem::createAndShowGUI);
    }
}

在上面的示例中,除了tab之外,我还添加了enter键作为另一个焦点遍历键。

正如我所发现的,它甚至比第一个示例代码更简单,这是因为默认的焦点遍历策略执行您所要求的操作,ie只允许可聚焦和已启用的组件以所需的顺序获得焦点。因此,我们只需要将不需要的组件设置为不可聚焦(即复选框和按钮),并使文本字段保持启用状态。只需将Enter键添加/设置为焦点遍历键,就可以使用了:

import java.awt.Component;
import java.awt.GridLayout;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class FocusHopSystem2 {
    
    private static void createAndShowGUI() {
        final String text = "0";
        final int width = 12;
        
        final JTextField tf1 = new JTextField(text, width),
                         tf2 = new JTextField(text, width),
                         tf3 = new JTextField(text, width),
                         tf4 = new JTextField(text, width);
        
        final JCheckBox ck2 = new JCheckBox("jTextField2", true),
                        ck3 = new JCheckBox("jTextField3", true),
                        ck4 = new JCheckBox("jTextField4", true);
        
        final JButton save = new JButton("Save");
        
        ck2.addActionListener(e -> tf2.setEnabled(ck2.isSelected()));
        ck3.addActionListener(e -> tf3.setEnabled(ck3.isSelected()));
        ck4.addActionListener(e -> tf4.setEnabled(ck4.isSelected()));
        
        final JPanel frameContents = new JPanel(new GridLayout(0, 5, 5, 5));
        
        //First row:
        frameContents.add(new JPanel());
        frameContents.add(ck2);
        frameContents.add(ck3);
        frameContents.add(ck4);
        frameContents.add(new JPanel());
        
        //Second row:
        frameContents.add(tf1);
        frameContents.add(tf2);
        frameContents.add(tf3);
        frameContents.add(tf4);
        frameContents.add(save);
        
        //Make the other components unfocusable:
        for (final Component comp: new Component[]{ck2, ck3, ck4, save})
            comp.setFocusable(false);
        
        //Make frameContents the focus cycle root:
        frameContents.setFocusCycleRoot(true);
        
        ////Install the DefaultFocusTraversalPolicy to the cycle root:
        //frameContents.setFocusTraversalPolicy(new DefaultFocusTraversalPolicy()); //This is not necessary in this case.
        
        //Add KeyEvent.VK_ENTER key to the focus traversal keys of the frameContents:
        final Set forwardKeys = frameContents.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS);
        final Set newForwardKeys = new HashSet(forwardKeys);
        newForwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0));
        frameContents.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, newForwardKeys);
        
        final JFrame frame = new JFrame("Focus traversal test.");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(frameContents);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        
        //Start focus on the first text field:
        tf1.requestFocusInWindow();
    }
    
    public static void main(final String[] args) {
        SwingUtilities.invokeLater(FocusHopSystem2::createAndShowGUI);
    }
}

您也可以阅读AWT聚焦子系统。

 类似资料:
  • 这是我的代码: 我所要做的就是使esc按钮与backspace按钮完全相同。所以我想删除

  • 我需要在Android Studio上帮助回答这个问题。 我如何通过按下后退按钮跳转到片段?我们没有添加任何按钮。只需点击Android手机上的后退按钮。 例如: 我正从activity_main走向支离破碎1 我正从碎片1走向碎片2 当我按下后退按钮时,我想跳转到activity_main,而不是片段1。

  • 问题内容: 我有一个TextField可以输入搜索词,还有一个“ Go”按钮。但是在JavaFX2中,我如何做到这一点,以便在TextField中按Enter键可以执行操作? 谢谢 :) 问题答案: 您可以使用TextField的onAction属性并将其绑定到控制器中的方法。 在您的FXML文件中:

  • 我已经为项目中的多个Jtextfields编写了代码,并为每个字段使用了Enter Key的KeyPressed事件。现在我使用一个触摸监视器。 现在我想使用一个按钮,通过按键盘上的回车键来做同样的事情。 (不想要grabfocus()或任何其他解决方案。只想知道有什么方法可以通过代码按回车键并运行我编码的每个字段的代码。)示例字段 下面是一个示例框架。 如果我的光标在字段1上,我想运行我在中使用

  • 我正在使用套接字为java创建一个聊天。我的问题是,在用户的框架上,当我第一次按enter时,插入符号会转到下一行,之后我必须按backspace,否则会发送一个空白句子和我写的句子。我使用KeyListener来按enter键,并向keyPressed函数输入以下代码。 事情是,这只工作后,我第一次使用聊天。例如,我发送了一些东西,如果我按Enter键,插入符号就会转到下一行。然后,如果我写了什

  • 问题内容: 我最近开始弄乱Java套接字和telnet … 我希望用户能够连接到服务器,只需键入一个字母并将其发送到服务器,而无需按Enter即可发送。我确定服务器没有办法设置它,但是telnet可能有一个参数或可以允许的参数吗? 也许如果我让用户输入文字或在运行telnet之前,这行得通吗?(仅知道UNIX!) 如果我可以通过telnet来执行此操作,那么就不必为此专门编写一个特殊的客户端… 问