[英]Set typed text in a JLabel
我是Swing的新手。 當用戶鍵入文本時,我希望它出現在JLabel中。 我無法訪問label變量,因為它在構造函數中。
另外,我應該在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
,有關詳細信息,請參閱偵聽 DocumentListener
的更改 。
其次,避免使用null
布局,像素完美布局是現代ui設計中的一種幻覺。 影響組件個體大小的因素太多,您無法控制。 Swing旨在與布局管理器一起工作,放棄這些將導致問題和問題的結束,您將花費越來越多的時間來糾正
有關詳細信息,請參閱在容器中布置組件
您遇到的“核心”問題是范圍問題,基本上label
只有構造函數的局部范圍。 基本解決方案是使label
成為類的實例字段。 這是基本的Java 101,與Swing無關。 有關更多詳細信息,請查看了解類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());
}
});
}
}
}
創建類的label
成員變量,並在構造initialize
中initialize
,如下所示
label = new JLabel("New label");
public class One extends JPanel implements KeyListener {
private JTextField textField;
private JLabel jLabel;
/**
* Create the panel.
*/
public One() {
setLayout(null);
textField = new JTextField();
textField.setBounds(88, 81, 258, 53);
add(textField);
textField.setColumns(10);
jLabel = new JLabel("New label");
jLabel.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){
SwingUtilities.invokeLater(() -> {
One one = new One();
JFrame jFrame = new JFrame();
jFrame.add(one);
jFrame.pack();
jFrame.setVisible(true);
});
}
@Override
public void keyTyped(KeyEvent e) {
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.