我想构建一个Swing组件JTextField,这是我的代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class JTextFieldGui{
JTextField textField;
JLabel labelInput;
JLabel labelOutput;
public static void main(String[] args) {
JTextFieldGui gui = new JTextFieldGui();
gui.go();
}
public void go(){
JFrame frame = new JFrame();
JPanel panelInput = new JPanel();
JPanel panelOutput = new JPanel();
labelInput = new JLabel("Your first name: ");
labelOutput = new JLabel("Enter your name, and you will see it here.");
textField = new JTextField(20);
JButton enter = new JButton("Enter");
JButton selectAll = new JButton("Select all text");
frame.setSize(300,200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panelInput.setLayout(new BoxLayout(panelInput, BoxLayout.X_AXIS));
textField.addActionListener(new LabelActionListener());
enter.addActionListener(new LabelActionListener());
selectAll.addActionListener(new TextFieldActionlistener());
frame.getContentPane().add(BorderLayout.NORTH, panelInput);
panelInput.add(labelInput);
panelInput.add(textField);
panelInput.add(enter);
panelInput.add(selectAll);
frame.getContentPane().add(BorderLayout.CENTER, panelOutput);
panelOutput.add(labelOutput);
}
class LabelActionListener implements ActionListener{
public void actionPerformed(ActionEvent event){
labelOutput.setText(textField.getText());
}
}
class TextFieldActionlistener implements ActionListener{
public void actionPerformed(ActionEvent event){
textField.selectAll();
}
}
}
问题1:我在20列中定义文本字段的宽度,但它总是占用一行,如图像:
问题2:如何使用selectAll()方法,我在按钮selectAll的监听器中使用它,但是当我点击按钮时,没有任何反应,为什么答案 0 :(得分:1)
我在20列中定义文本字段的宽度,但它总是占用一行,
这是BoxLayout的规则。调整组件的大小以填充可用空间。 JTextField没有最大大小,因此它会增长。按钮和标签确实有最大尺寸,因此它们不会增长。
不要使用BoxLayout,只需使用FlowLayout
即可。它会自动在每个组件之间留出空间,这是一个更好的布局。
我在按钮selectAll的监听器中使用它,但当我点击按钮时,没有任何反应,为什么
焦点仍在按钮上。仅当文本字段具有焦点时,才会显示所选文本。
所以在他的监听器代码中你需要添加:
textField.requestFocusInWindow();
以下代码是旧的:
frame.getContentPane().add(BorderLayout.NORTH, panelInput);
您无需获取内容窗格。您只需将组件添加到框架中即可。
约束应该是第二个参数
有新的限制使名称更有意义
所以代码应该是:
frame.add(panelInput, BorderLayout.PAGE_START, panelInput);
有关详细信息,请参阅How to Use BorderLayout上的Swing教程中的部分。