这是我想要的概念证明:我想要一个带有文本字段的框架和一个按钮。用户在文本字段中键入的任何内容都将被忽略,但如果单击该按钮,则会在文本字段中设置文本。你会怎么做?
我提前做了一些研究,并提出了一个解决方案,我将作为答案发布。但我担心的是,有一种更简单的方法可以做到这一点。我问这个问题,看看是否有更好的方法。
以下是我试图构建此概念证明的原因截图:
我正在尝试像这样构建一些东西。当用户输入文本时,我想忽略他们所说的内容,捕获它并进行自己的解释。例如,如果用户按 control + Y ,我希望它这样说:
我不想简单地让JTextField不可编辑,因为它会使框灰化并隐藏光标。我希望人们知道他们应该点击文本字段并输入。
答案 0 :(得分:3)
如果要维护光标,可以按照here所述拦截击键。
以上链接的代码:
myTextField.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
if (!Character.isDigit(c)) {
e.consume(); // Stop the event from propagating.
}
}
});
或者,您可以禁用输入,然后轻松恢复背景颜色,但会丢失光标:
textField.setEditable(false);
textField.setBackground(Color.WHITE);
答案 1 :(得分:1)
使文本字段不可编辑。用户无法输入数据,但程序仍然可以:
textField.setEditable(false);
答案 2 :(得分:1)
这是hendalst' code的编辑版本。它还会阻止 Ctrl + V 之类的内容,因为该事件也会在keyPressed
和keyReleased
方法中使用。
myTextField.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent ke) {
ke.consume();
// do what you want:
myTextField.setText(...);
}
@Override
public void keyPressed(KeyEvent ke) {
ke.consume();
}
@Override
public void keyReleased(KeyEvent ke) {
ke.consume();
}
});
答案 3 :(得分:0)
这段代码完全符合我的要求。但我希望有一个更简单的方法:
package com.sandbox;
import javax.swing.*;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Sandbox {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
final JTextField text = new JTextField();
((AbstractDocument) text.getDocument()).setDocumentFilter(new DocumentFilter() {
@Override
public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
// super.remove(fb, offset, length);
}
@Override
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
// super.insertString(fb, offset, string, attr);
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
// super.replace(fb, offset, length, text, attrs);
}
});
JPanel panel = new JPanel();
BoxLayout layout = new BoxLayout(panel, BoxLayout.Y_AXIS);
panel.setLayout(layout);
panel.add(text);
JButton jButton = new JButton("Click to change text");
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DocumentFilter old = ((AbstractDocument) text.getDocument()).getDocumentFilter();
((AbstractDocument) text.getDocument()).setDocumentFilter(new DocumentFilter());
text.setText("You clicked!");
((AbstractDocument) text.getDocument()).setDocumentFilter(old);
}
});
panel.add(jButton);
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
}
}