Java 如何使光标可以进入jtextfield,但给它一个文本的唯一方法是单击按钮?
我有jTextfield和jButton 如何Java 如何使光标可以进入jtextfield,但给它一个文本的唯一方法是单击按钮?,java,swing,jtextfield,Java,Swing,Jtextfield,我有jTextfield和jButton 如何 用户可以单击jTextfield(鼠标可以在jTextfield上进入/退出),但如果用户键入某个内容,则不会执行任何操作(除了将删除整个文本的退格) 当用户单击按钮时,它将 setText(“某物”) 因此,给jtextfield文本的唯一方法是单击按钮 当其中有一个文本时(当光标位于jtextfield内),然后用户键入一个退格,它将删除jtextfield上的整个文本 如何做到这一点 原谅我的英语。。 非常感谢你的帮助 在jTextf
- 用户可以单击jTextfield(鼠标可以在jTextfield上进入/退出),但如果用户键入某个内容,则不会执行任何操作(除了将删除整个文本的退格)
- 当用户单击按钮时,它将
- 当其中有一个文本时(当光标位于jtextfield内),然后用户键入一个退格,它将删除jtextfield上的整个文本
非常感谢你的帮助 在jTextfield的key listener中,在keyTyped事件中,检查e.getKeyChar()如果是backspace,如果不是,则执行e.consume();它将取消活动 backspace的keychar是8 以下是一个例子:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class ConsumeExceptForBackSpace extends JFrame {
private boolean canWrite = false;
public ConsumeExceptForBackSpace() {
super();
JButton b = new JButton("Click");
JTextField f = new JTextField("");
this.setLayout(new BorderLayout());
this.add(b, BorderLayout.CENTER);
this.add(f, BorderLayout.SOUTH);
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
canWrite = !canWrite;
}
});
f.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
if(e.getKeyChar() != KekEvent.VK_BACK_SPACE && !canWrite) e.consume();
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
});
this.pack();
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new ConsumeExceptForBackSpace();
}
}
使用,只需将其添加到JTextField
中,如下所示:
public class Test {
public void initComponents() {
//create frame
//add DoucmentFilter to JTextField
MyDocumentFilter myFilter = new MyDocumentFilter();
JTextField myArea = new JTextField();
((AbstractDocument)myArea.getDocument()).setDocumentFilter(myFilter);
//add components set frame visible
}
}
class MyDocumentFilter extends DocumentFilter {
@Override
public void replace(FilterBypass fb, int i, int i1, String string, AttributeSet as) throws BadLocationException {
super.replace(fb, i, i1, string, as);
}
@Override
public void remove(FilterBypass fb, int i, int i1) throws BadLocationException {
super.remove(fb, i, i1);
}
@Override
public void insertString(FilterBypass fb, int i, String string, AttributeSet as) throws BadLocationException {
super.insertString(fb, i, string, as);
}
}
或者
您可能希望创建一个已具有文档过滤器的文档过滤器(用于可重用性),例如:
public class MyCustomField extends JTextField {
public MyCustomField(int cols) {
super(cols);
}
protected Document createDefaultModel() {
return ((Document) new MyDocument());
}
static class MyDocument extends DocumentFilter {
@Override
public void insertString(FilterBypass fb, int i, String string, AttributeSet as) throws BadLocationException {
super.insertString(fb, i, string, as);
}
@Override
public void remove(FilterBypass fb, int i, int i1) throws BadLocationException {
super.remove(fb, i, i1);
}
@Override
public void replace(FilterBypass fb, int i, int i1, String string, AttributeSet as) throws BadLocationException {
super.replace(fb, i, i1, string, as);
}
}
}
从气垫船编辑
我在这方面想得更多
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.text.*;
public class Test {
public void initComponents() {
JPanel panel = new JPanel();
final MyDocumentFilter myFilter = new MyDocumentFilter();
final JTextField myArea = new JTextField(20);
((AbstractDocument) myArea.getDocument()).setDocumentFilter(myFilter);
panel.add(myArea);
panel.add(new JButton(new AbstractAction("Set Text") {
@Override
public void actionPerformed(ActionEvent arg0) {
myFilter.setFiltering(false);
myArea.setText("Fe Fi Fo Fum");
myFilter.setFiltering(true);
}
}));
JOptionPane.showMessageDialog(null, panel);
// add components set frame visible
}
public static void main(String[] args) {
new Test().initComponents();
}
}
class MyDocumentFilter extends DocumentFilter {
private boolean filtering = true;
@Override
public void replace(FilterBypass fb, int i, int i1, String string,
AttributeSet as) throws BadLocationException {
if (!filtering) {
super.replace(fb, i, i1, string, as);
}
}
@Override
public void remove(FilterBypass fb, int i, int i1)
throws BadLocationException {
int offset = 0;
int length = fb.getDocument().getLength();
super.remove(fb, offset, length);
}
@Override
public void insertString(FilterBypass fb, int i, String string,
AttributeSet as) throws BadLocationException {
if (!filtering) {
super.insertString(fb, i, string, as);
}
}
public void setFiltering(boolean filtering) {
this.filtering = filtering;
}
}
您应该考虑使用<代码>文档过滤器>代码>而不是<代码> Debug监听器。Debug过滤器的优点是它的操作发生在文档被更改之前,这就是它可以过滤的原因。但我看不到你的过滤器目前正在进行任何过滤。@moprmor没有太复杂或太懒之类的事情。。。在我的示例中,没有按键的问题,而是在JTextField
上执行的操作,就像插入、删除或添加/更新文本一样。使用keylister
意味着代码可以粘贴到textfield中,而不需要扩展JTextField
。如果您需要在多个位置创建具有相同过滤功能的文本字段,可以引入实用方法/工厂方法。请参阅我对您答案的编辑,了解如何打开和关闭过滤,以及允许删除整个文本。很抱歉编辑您的答案,请随意删除我的编辑内容。我不认为KeyListener
应该与Swing组件一起用作AWT。有许多较新的Swing选项,如:KeyBindings
、DocumentFilter
和DocumentListener
等。此外,Swing组件应始终在@moprmopr上创建和操作。您不应该喜欢糟糕的编码,有一个KeyEvent
类仅用于此:不是8,这确实是不可读的-1至doctorKiller@moprmopr:您在接受此答案时犯了一个错误,因为您确实不想为此使用KeyListener,并且如果对代码进行修改,这可能会导致以后出现问题,特别是当另一个组件需要焦点时。@HovercraftFullOfEels+1和not遗忘withkeylister
代码可以复制并粘贴到JTextField
中,而无需notification@DavidKroukamp而不是-1,因为iISER 8而不是VK_BACK_空格,只需编辑答案…这就是stackoverflow存在的原因。。。