JTextField不接受输入

时间:2014-07-17 18:40:20

标签: java jtextfield

所以我在其中创建了一个带有JTextField的测试窗口。我不知道什么是错的。主要代码如下。问题在于,无论我做什么,我都无法编辑文本字段,也无法编辑第二个文本字段。我有一个带有文本字段的示例程序,但它根本不起作用。

我不确定是否需要发布它,但我可以在这里获得完整程序的示例jar。我只发布了处理文本字段

的区域

编辑:完整的来源可在此处获取:GITHUB

我删除了某些内容并且有效,我放弃了...... \

EDIT2:事实证明,我正在调用一个扩展JPanel的类,只是调用一个新的JPanel而不是扩展它的工作

EDIT3:好的,问题是关键事件调度员,我标记为答案的帖子深入解释

 public class Main {
    private static JPanel mainPanel = new JPanel();
    private static JFrame frame;
    public static JTextField textField1 = new JTextField();
    public static JTextField textField2 = new JTextField();
    private static GroupLayout layout = new GroupLayout(mainPanel);

    public static void main(String[] Args) throws InterruptedException{
        frame = new JFrame("Test Window");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainPanel.setLayout(layout);
        layout.setAutoCreateContainerGaps(false);
        layout.setAutoCreateGaps(false);
        GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
        GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
        vGroup.addGap(200).addGroup(layout.createParallelGroup().addComponent(textField1, 25, 25, 25).addComponent(textField2, 25, 25, 25).addGap(350));
        hGroup.addGap(300)
        .addGroup(layout.createParallelGroup().addComponent(textField1, 200, 200, 200).
                addComponent(textField2, 200, 200, 200)).addGap(300);
        layout.setVerticalGroup(vGroup);
        layout.setHorizontalGroup(hGroup);
        frame.add(mainPanel);
        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
        textField1.setText("I am a simple uneditable testbox");
    }
}

2 个答案:

答案 0 :(得分:2)

您的问题是我怀疑KeyEventDispatcher。当您将其添加回来并让它返回true时,JTextField不起作用。根据{{​​3}}:

  

如果此方法的实现返回false,则KeyEvent将传递给链中的下一个KeyEventDispatcher,以当前KeyboardFocusManager结束。如果实现返回true,则假定已调度KeyEvent(尽管不一定是这种情况),并且当前的KeyboardFocusManager将不会对KeyEvent采取进一步操作。

import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class Main {
   private static JPanel mainPanel = new JPanel();
   private static JFrame frame;
   public static JTextField textField1 = new JTextField(20);
   public static JTextField textField2 = new JTextField(20);

   public static void main(String[] Args) throws InterruptedException {
      frame = new JFrame("Test Window");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

      final JCheckBox dispatchKeyEventReturnCheckBox = 
            new JCheckBox("Dispatch Key Event Return Value", true);

      mainPanel.add(textField1);
      mainPanel.add(textField2);
      mainPanel.add(dispatchKeyEventReturnCheckBox);
      frame.add(mainPanel);

      KeyboardFocusManager.getCurrentKeyboardFocusManager()
            .addKeyEventDispatcher(new KeyEventDispatcher() {

               @Override
               public boolean dispatchKeyEvent(KeyEvent evt) {
                  // TODO Fix this!!!
                  // !! return false;
                  return dispatchKeyEventReturnCheckBox.isSelected();
               }
            });

      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
      textField1.setText("I am a simple uneditable testbox");
   }
}

解决方案:1)除非您不希望GUI处理键击,否则不会使dispatchKeyEvent(KeyEvent e)返回true。或2)即使更好,也不要使用此类。而是告诉我们为什么你觉得你需要它,让我们帮你找到更好的方法。

1+您尝试创建和发布MCVE的问题。

答案 1 :(得分:1)

请不要使用Thread.sleep()来暂停整个swing应用程序,而是尝试使用最适合swing应用程序的Swing Timer

了解更多How to Use Swing Timers

示例代码:

private Timer timer;
...

// wait for 10 milli-seconds
timer = new javax.swing.Timer(10, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // next call
    }
});
timer.setRepeats(true); // you can turn off reputation
timer.start();