【问题标题】:Java Swing JTextfield Sizing (Height)Java Swing JTextfield 大小调整(高度)
【发布时间】:2014-10-24 16:10:30
【问题描述】:

我在将程序中的 JTextfield 调整为适当大小时遇到​​了一些问题,我正在尝试使用文本“价格必须是真实值”来修改文本字段。这就是我想要的样子:

这是我目前的样子:

我的代码如下:

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();
    }

}

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

【问题讨论】:

    标签: java swing user-interface layout-manager


    【解决方案1】:

    使用BorderLayout 而不是BoxLayout

    将文本区域放在BorderLayout.CENTER,并用GridLayout(0, 1) 将文本字段和底部面板包裹在另一个面板中。将该面板添加到BorderLayout.PAGE_END。文本字段将与底部面板的大小相同

    一边


    重构

    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));
    

    另一种选择是给wrapper 面板一个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)
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-09
        相关资源
        最近更新 更多