Java Swing JTextfield大小调整(高度)

Java Swing JTextfield大小调整(高度),java,swing,user-interface,layout-manager,Java,Swing,User Interface,Layout Manager,我在将程序中的JTextfield设置为适当大小时遇到一些问题,我正在尝试用文本“Price must a real value”来修改textfield。这就是我希望它看起来的样子: 这就是我现在的样子: 我的代码如下: package test1; import java.awt.Container; import java.awt.FlowLayout; import javax.swing.*; public class Test1{ //Should componen

我在将程序中的JTextfield设置为适当大小时遇到一些问题,我正在尝试用文本“Price must a real value”来修改textfield。这就是我希望它看起来的样子:

这就是我现在的样子:

我的代码如下:

package test1;

import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.*;

public class Test1{

    //Should components be final? Should they be defined outside of the class?
    private final JTextArea outputArea = new JTextArea();
    private final JTextField errorReportField = new JTextField();

    private final JPanel inputPanel = new JPanel();

    private final JLabel nameLabel = new JLabel("Item Name");
    private final JLabel numberLabel = new JLabel("Number of units (or Volume in L)");
    private final JLabel priceLabel = new JLabel("Price per unit (or L) in pence");

    private final JTextField nameField = new JTextField(10);
    private final JTextField numberField = new JTextField(10);
    private final JTextField priceField = new JTextField(10);

    private final JButton addVolumeButton = new JButton("Add by Volume");
    private final JButton addNumberButton = new JButton("Add by number of units");         

    public Test1() {
        JFrame frame = new JFrame("Fuel station shop");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        outputArea.setEditable(false);
        outputArea.setRows(30);
        JScrollPane scrollPanel = new JScrollPane(outputArea);
        scrollPanel.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        errorReportField.setEditable(false);

        //Better way of adding multiple components to panel?
        inputPanel.setLayout(new FlowLayout());
        inputPanel.add(nameLabel);
        inputPanel.add(nameField);
        inputPanel.add(numberLabel);
        inputPanel.add(numberField);
        inputPanel.add(priceLabel);
        inputPanel.add(priceField);
        inputPanel.add(addVolumeButton);
        inputPanel.add(addNumberButton);

        Container contentPane = frame.getContentPane();
        //Why is it adding components from bottom to top?
        contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
        contentPane.add(scrollPanel);
        contentPane.add(errorReportField);
        contentPane.add(inputPanel);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Test1 test = new Test1();
    }

}

因此,基本上我希望增加文本字段的高度,同时保持文本居中,以及将背景更改为白色,同时保持其不可编辑。

使用
BorderLayout
而不是
BoxLayout

将文本区域置于
BorderLayout.CENTER
,并使用
GridLayout(0,1)
将文本字段和底部面板包装到另一个面板中。将该面板添加到
BorderLayout.PAGE\u END
。文本字段的大小将与底部面板的大小相同

旁白

  • Swing应用程序应在事件分派线程上运行/启动。看
  • 有关布局管理器的常规信息,请参见
  • 也不确定为什么字段和文本不可编辑

重构

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.*;

public class Test1{

    //Should components be final? Should they be defined outside of the class?
    private final JTextArea outputArea = new JTextArea();
    private final JTextField errorReportField = new JTextField();

    private final JPanel inputPanel = new JPanel();

    private final JLabel nameLabel = new JLabel("Item Name");
    private final JLabel numberLabel = new JLabel("Number of units (or Volume in L)");
    private final JLabel priceLabel = new JLabel("Price per unit (or L) in pence");

    private final JTextField nameField = new JTextField(10);
    private final JTextField numberField = new JTextField(10);
    private final JTextField priceField = new JTextField(10);

    private final JButton addVolumeButton = new JButton("Add by Volume");
    private final JButton addNumberButton = new JButton("Add by number of units");         

    public Test1() {
        JFrame frame = new JFrame("Fuel station shop");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //outputArea.setEditable(false);
        outputArea.setRows(30);
        JScrollPane scrollPanel = new JScrollPane(outputArea);
        scrollPanel.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        //errorReportField.setEditable(false);

        //Better way of adding multiple components to panel?
        inputPanel.setLayout(new FlowLayout());
        inputPanel.add(nameLabel);
        inputPanel.add(nameField);
        inputPanel.add(numberLabel);
        inputPanel.add(numberField);
        inputPanel.add(priceLabel);
        inputPanel.add(priceField);
        inputPanel.add(addVolumeButton);
        inputPanel.add(addNumberButton);

        Container contentPane = frame.getContentPane();
        //Why is it adding components from bottom to top?
        contentPane.setLayout(new BorderLayout());
        contentPane.add(scrollPanel);
        JPanel wrapper = new JPanel(new GridLayout(0, 1));
        wrapper.add(errorReportField);
        wrapper.add(inputPanel);
        contentPane.add(wrapper, BorderLayout.PAGE_END);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                Test1 test = new Test1();
            }
        });  
    }
}

注意

如果希望字段稍微大一点(按高度),可以在
inputPanel
中添加一个空边框,使字段也展开。但这意味着
inputPanel
也会稍微大一点(可能需要也可能不需要)。但无论哪种方式,对于GridLayout,字段和
inputPanel
的大小都是相同的

inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
另一个选项是给
包装器
面板一个
BorderLayout
并将字段添加到中心,给它一个
EmptyBorder
以扩展其大小

contentPane.setLayout(new BorderLayout());
contentPane.add(scrollPanel);
JPanel wrapper = new JPanel(new BorderLayout());
wrapper.add(errorReportField);
wrapper.add(inputPanel, BorderLayout.PAGE_END);

Border border = errorReportField.getBorder();
CompoundBorder compound = BorderFactory.createCompoundBorder(
        border,BorderFactory.createEmptyBorder(10, 10, 10, 10));
errorReportField.setBorder(compound);

contentPane.add(wrapper, BorderLayout.PAGE_END);
这将在字段的左侧提供一个轻微的边距(这可能是或可能不是需要的)。如果不需要,只需更改空边框的值即可

createEmptyBorder(top, left, bottom, right)

如果要增加字段的高度,请修改其首选大小(将方法应用于字段):

private void increaseFieldHeight(JTextField field, int times) {
    Dimension d = field.getPreferredSize();
    d.height = d.height * times;
    field.setPreferredSize(d);
}