所以我在其中创建了一个带有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");
}
}
答案 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。
示例代码:
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();