gpt4 book ai didi

java - 如何使 JFormattedTextField 在带有默认按钮的表单上正常运行?

转载 作者:行者123 更新时间:2023-12-04 05:59:26 28 4
gpt4 key购买 nike

我在使用表单默认按钮时遇到问题(表单)包含 JFormattedTextField .
在有这样一个字段的表单上,如果它碰巧有焦点(并且被改变了),你必须按 OK 两次 让您的默认按钮“按下”。我想我知道它为什么会发生 - 这是因为首先 Enter 在 Commit 处理中被消耗了。

我也能够做出一个解决方法 - 如果你改变 Formatter提交每个有效的编辑,然后您将获得正确的行为,但这 a) 强制您指定格式化程序,并且 b) 不可能恢复到“旧”值(例如,使用 Escape 或以编程方式)。

下面的代码表明:当您在每次编辑时在顶部提交字段运行它并使用单个 Enter(但您无法恢复)时,底部的字段允许恢复,但需要 两个编辑后进入。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.text.DateFormatter;

public class ExFrame extends JFrame {

private JPanel contentPane;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ExFrame frame = new ExFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public ExFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);

JFormattedTextField ff_1, ff_2;

//ff_1 has modified behavior of commit on each (valid) edit
DateFormatter f=new DateFormatter();
f.setCommitsOnValidEdit(true);

ff_1 = new JFormattedTextField(f);
ff_1.setValue(new Date());

//ff_2 has default behavior
ff_2 = new JFormattedTextField(new Date());

contentPane.add(ff_1, BorderLayout.NORTH);
contentPane.add(ff_2, BorderLayout.SOUTH);

JButton btnDefault = new JButton("I am default button");
contentPane.add(btnDefault, BorderLayout.CENTER);
getRootPane().setDefaultButton(btnDefault);
}
}

所以问题是:有没有办法得到 JFormattedTextField 两者 按 Enter 提交(因此输入 验证但仅一次) 如果成功验证 , 激活默认按钮(单击)?

最佳答案

基本的技巧是让keyBinding 机制愚弄,认为keyStroke 不是由textField 处理的。为了实现这一点,我们需要继承 JFormattedTextField 并覆盖其 processKeyBindings 以返回 false(意思是:“无法使用”)。

就像是:

JFormattedTextField multiplex = new JFormattedTextField() {
KeyStroke enter = KeyStroke.getKeyStroke("ENTER");
@Override
protected boolean processKeyBinding(KeyStroke ks, KeyEvent e,
int condition, boolean pressed) {
boolean processed = super.processKeyBinding(ks, e, condition,
pressed);

if (processed && condition != JComponent.WHEN_IN_FOCUSED_WINDOW
&& enter.equals(ks)) {
// Returning false will allow further processing
// of the bindings, eg our parent Containers will get a
// crack at them and f.i. route to a default button.
return !isEditValid();
}
return processed;
}

};
multiplex.setValue(new Date());

关于java - 如何使 JFormattedTextField 在带有默认按钮的表单上正常运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9101693/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com