java - JButton 在 JAVA 中启用后需要单击两次
问题描述
我正在尝试使用四个手动输入JTextField 构建一个 JFrame:描述、小时、分钟、ID 和两个JButton:提交和重置
我需要禁用“提交”按钮,直到所有文本字段都有一些数据。为了实现这一点,我使用了 DocumentListener 并且工作正常,也就是说,最初“提交”按钮被禁用,只有在所有文本字段都有一些输入时才会启用。
问题:启用“提交”按钮后,我需要点击提交按钮两次才能获得实际的动作触发(可能第一次是启用后恢复焦点,第二次做实际工作)。“重置”按钮不会发生此问题。
尝试过但不起作用:我尝试使用恢复焦点submit.requestFocusInWindow()
并将焦点带到“提交”按钮但最后修改的文本字段失去焦点,我不得不再次单击它以恢复对该字段的焦点。
请协助。我对 StackOverflow 很陌生,所以请不要关闭线程。
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
JPanel titlePanel = new JPanel();
JPanel descPanel = new JPanel();
JPanel timeWorkedPanel = new JPanel();
JPanel iDPanel = new JPanel();
titlePanel.add(title);
mainPanel.add(titlePanel);
descPanel.add(desc);
mainPanel.add(descPanel);
timeWorkedPanel.add(hour);
timeWorkedPanel.add(minute);
mainPanel.add(timeWorkedPanel);
iDPanel.add(iD);
mainPanel.add(iDPanel);
JTextArea reqList = new JTextArea();
reqList.setLineWrap(false);
reqList.setEditable(false);
JScrollPane reqListScroll = new JScrollPane (reqList);
reqListScroll.setPreferredSize(new Dimension(400,400));
reqListScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
reqListScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
reqListScroll.setColumnHeaderView(new JLabel(" REQUEST CREATED TIME WORKED"));
mainPanel.add(reqListScroll);
List<JTextField> textFieldList = new ArrayList<>();
textFieldList.add(desc);
textFieldList.add(hour);
textFieldList.add(minute);
textFieldList.add(csiID);
JButton submit = new JButton("SUBMIT");
JButton reset = new JButton("RESET");
buttonPanel.add(submit);
buttonPanel.add(reset);
mainPanel.add(buttonPanel);
mainPanel.add(Box.createVerticalStrut(20)); // a spacer
JFrame mainFrame = new JFrame("Test Frame");
mainFrame.getContentPane().add(mainPanel);
mainFrame.setSize(new Dimension(500,600));
mainFrame.setLocationRelativeTo(null);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
submit.setEnabled(false);
DocumentListener docListener = new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
changedUpdate(e);
}
@Override
public void removeUpdate(DocumentEvent e) {
changedUpdate(e);
}
@Override
public void changedUpdate(DocumentEvent e) {
boolean isEnabled = true;
for(JTextField tf : textFieldList) {
if(tf.getText().isEmpty())
isEnabled = false;
}
submit.setEnabled(isEnabled);
}
};
for(JTextField tf : textFieldList) {
tf.getDocument().addDocumentListener(docListener);
}
final WebDriver newDriver = driver;
final ChromeOptions newOptions = options;
//Click on "SUBMIT" button
submit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
System.out.println("submitting");
mainFrame.setVisible(false);
createTicket(newDriver, newOptions, subportfolio, title, desc , hour, minute, csiID);
mainFrame.setVisible(true);
} catch (InterruptedException e1) {
}
}
});
//Click on "RESET" button
reset.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
desc.setText(null);
hour.setText(null);
minute.setText(null);
csiID.setText(null);
}
});
解决方案
推荐阅读
- python - 文件浏览器和在同一窗口中绘图
- r - 准泊松模型的 Akaike 准则 (AIC)
- rust - 从选项中提取可变引用
- python - 如何通过 Python 将产品导入 Shopware
- python - Pandas df 如何更改特定列以从单元素列表中删除列表
- google-cloud-platform - 打包程序命令卡住了
- python - 转换字典列表中的字符串
- swift - 与 predicateForWorkouts 一起使用时,HKSourceQuery 不返回值
- amazon-web-services - 为什么在使用适用于 Javascript 的 AWS 开发工具包时 iam.listUsers 只检索 100 个用户?
- javascript - 在 Node.js 中处理多个数据事件