我是 Swing 新手。当用户键入文本时,我希望它出现在 JLabel 中。我无法访问标签变量,因为它在构造函数中。
另外,我应该在 main
方法中放些什么?
public class One extends JPanel implements KeyListener {
private JTextField textField;
/**
* Create the panel.
*/
public One() {
setLayout(null);
textField = new JTextField();
textField.setBounds(88, 81, 258, 53);
add(textField);
textField.setColumns(10);
JLabel label = new JLabel("New label");
label.setBounds(182, 198, 61, 16);
add(label);
}
public void keyPressed(KeyEvent e){
int keyCode = e.getKeyCode();
label.setText(KeyEvent.getKeyText(keyCode));
}
public void keyReleased(KeyEvent e){
}
public static void main(String[] args){
// ??
}
@Override
public void keyTyped(KeyEvent e) {
}
}
最佳答案
您的方法存在许多问题。
首先,一般情况下您应该避免使用 KeyListener
,但是对于文本组件尤其如此,它只是一种不合适的方法来监视文本字段的更改。相反,您应该使用 DocumentListener
,请参阅 Listening for Changes on a Document了解更多详情。
其次,避免使用null
布局,像素完美布局是现代用户界面设计中的一种错觉。影响组件单个尺寸的因素太多,没有一个是您可以控制的。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正
参见 Laying Out Components Within a Container了解更多详情
您遇到的“核心”问题是范围问题,基本上 label
仅具有构造函数的局部范围。基本解决方案是使 label
成为该类的实例字段。这是基本的 Java 101,与 Swing 无关。看看Understanding Class Memebers了解更多详情。
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class TestInput {
public static void main(String[] args) {
new TestInput();
}
public TestInput() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new InputPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class InputPane extends JPanel {
private JTextField textField;
private JLabel label;
public InputPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(4, 4, 4, 4);
gbc.gridwidth = GridBagConstraints.REMAINDER;
textField = new JTextField(20);
label = new JLabel(" ");
add(textField, gbc);
add(label, gbc);
textField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
updateLabel();
}
@Override
public void removeUpdate(DocumentEvent e) {
updateLabel();
}
@Override
public void changedUpdate(DocumentEvent e) {
updateLabel();
}
protected void updateLabel() {
label.setText(textField.getText());
}
});
}
}
}
关于java - 在 JLabel 中设置键入的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33597878/