如何构造JTextfield,以及如何使用方法selectAll()

时间:2017-01-04 15:55:40

标签: java swing jtextfield

我想构建一个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列中定义文本字段的宽度,但它总是占用一行,如图像:

https://i.stack.imgur.com/l6iQy.png

问题2:如何使用selectAll()方法,我在按钮selectAll的监听器中使用它,但是当我点击按钮时,没有任何反应,为什么

1 个答案:

答案 0 :(得分:1)

  

我在20列中定义文本字段的宽度,但它总是占用一行,

这是BoxLayout的规则。调整组件的大小以填充可用空间。 JTextField没有最大大小,因此它会增长。按钮和标签确实有最大尺寸,因此它们不会增长。

不要使用BoxLayout,只需使用FlowLayout即可。它会自动在每个组件之间留出空间,这是一个更好的布局。

  

我在按钮selectAll的监听器中使用它,但当我点击按钮时,没有任何反应,为什么

焦点仍在按钮上。仅当文本字段具有焦点时,才会显示所选文本。

所以在他的监听器代码中你需要添加:

textField.requestFocusInWindow();

以下代码是旧的:

frame.getContentPane().add(BorderLayout.NORTH, panelInput);
  1. 您无需获取内容窗格。您只需将组件添加到框架中即可。

  2. 约束应该是第二个参数

  3. 有新的限制使名称更有意义

  4. 所以代码应该是:

    frame.add(panelInput, BorderLayout.PAGE_START, panelInput);
    

    有关详细信息,请参阅How to Use BorderLayout上的Swing教程中的部分。