【问题标题】:How to set size of swing components如何设置摆动组件的大小
【发布时间】:2012-09-04 14:32:09
【问题描述】:

我想自定义 JTextField 对象的高度和宽度。我尝试过使用 setSize 方法,将宽度和高度作为维度和 int 传递。但它们似乎都不起作用。我是否遗漏了某些内容,例如面板上的某些强制方法调用或某些内容以使尺寸自定义有效?请帮忙。提前致谢。

编辑:这里有一些代码:

public class WestPanel extends JPanel{
private JLabel dateL;
private JTextField date;
public WestPanel(){
setBackground(Color.white);
setLayout(new GridLayout(1,2,0,0));
dateL=new JLabel("Date: ");
date=new JTextField("dd/mm/yyyy");
date.setSize(60,10);
add(dateL);
add(date);
//....remaining code....//

【问题讨论】:

  • 最好向我们展示一些代码,我们也许可以为您提供帮助。
  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java swing customization jtextfield


【解决方案1】:

让布局管理器处理您的 Swing 组件的尺寸,但如果您绝对必须,请将setPreferredSize 与尊重该属性的布局管理器结合使用。

【讨论】:

  • +1。我还要补充一点:1)您可以设置 JTextField 的列数(这在某种程度上等同于设置 preferredSize)2)GridLayout 不太适合这种情况(我实际上发现 Layout 很少有用)。正确配置,GridBagLayout 可能会给您最好的结果。还有其他可用的 LayoutManagers 可以帮助您(BorderLayout、FlowLayout、MigLayout,...)
【解决方案2】:

我不确定这是否能回答原始发帖人的问题,但希望它对其他 Swing 开发人员有所帮助。

大多数人希望标签和组件对齐,就像我创建的以下对话框一样。

我使用 Swing 布局管理器 GridBagLayout 来创建这种类型的布局。这里没有大量解释,而是创建此对话框的代码。

package com.ggl.business.planner.view;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;

import com.ggl.business.planner.model.BusinessPlannerModel;
import com.ggl.business.planner.view.extended.EscapeDialog;
import com.ggl.business.planner.view.extended.JFontChooser;

public class OptionsDialog {

    protected static final Insets entryInsets = new Insets(0, 10, 4, 10);
    protected static final Insets spaceInsets = new Insets(10, 10, 4, 10);
    protected static final Insets noInsets    = new Insets(0, 0, 0, 0);
    protected static final Insets iconInsets  = new Insets(0, 4, 0, 0);

    protected BusinessPlannerFrame frame;

    protected BusinessPlannerModel model;

    protected EscapeDialog dialog;

    protected JButton activityTextFontButton;
    protected JButton connectorTextFontButton;

    protected JSpinner borderSizeSpinner;

    protected SpinnerNumberModel spinnerNumberModel;

    protected boolean okPressed;

    public OptionsDialog(BusinessPlannerModel model, BusinessPlannerFrame frame) {
        this.model = model;
        this.frame = frame;
        createPartControl();
    }

    protected void createPartControl() {
        dialog = new EscapeDialog();
        dialog.setTitle("Business Planner Options");
        dialog.setLayout(new GridBagLayout());

        int gridy = 0;
        gridy = createBorderFields(gridy);
        gridy = createFontFields(gridy);
        gridy = createButtonFields(gridy);

        dialog.pack();
        dialog.setBounds(dialogBounds());
        dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
        dialog.setVisible(true);
    }

    protected int createBorderFields(int gridy) {
        JLabel borderSizeLabel = new JLabel("Border size:");
        borderSizeLabel.setHorizontalAlignment(SwingConstants.LEFT);
        addComponent(dialog, borderSizeLabel, 0, gridy, 1, 1, spaceInsets,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        spinnerNumberModel = new SpinnerNumberModel(model.getActivityBorder(), 1, 5, 1);
        borderSizeSpinner = new JSpinner(spinnerNumberModel);
        addComponent(dialog, borderSizeSpinner, 1, gridy++, 4, 1, spaceInsets,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        return gridy;
    }

    protected int createFontFields(int gridy) {
        JLabel boxtextFontLabel = new JLabel("Activity text font:");
        boxtextFontLabel.setHorizontalAlignment(SwingConstants.LEFT);
        addComponent(dialog, boxtextFontLabel, 0, gridy, 1, 1, spaceInsets,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        Font font = model.getActivityFont();
        activityTextFontButton = new JButton(getFontText(font));
        activityTextFontButton.setFont(font);
        activityTextFontButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                JFontChooser fontChooser = new JFontChooser();
                fontChooser.setSelectedFont(model.getActivityFont());
                int result = fontChooser.showDialog(dialog);
                if (result == JFontChooser.OK_OPTION) {
                    Font font = fontChooser.getSelectedFont();
                    String text = getFontText(font);
                    model.setActivityFont(font);
                    activityTextFontButton.setText(text);
                    activityTextFontButton.setFont(font);
                    JButton dummy = new JButton(text);
                    setButtonSizes(activityTextFontButton, 
                            connectorTextFontButton, dummy);
                    dialog.validate();
                    dialog.pack();
                }
            }
        });
        addComponent(dialog, activityTextFontButton, 1, gridy++, 4, 1, spaceInsets,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        JLabel connectortextFontLabel = new JLabel("Connector text font:");
        connectortextFontLabel.setHorizontalAlignment(SwingConstants.LEFT);
        addComponent(dialog, connectortextFontLabel, 0, gridy, 1, 1, spaceInsets,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        font = model.getConnectorFont();
        connectorTextFontButton = new JButton(getFontText(font));
        connectorTextFontButton.setFont(font);
        connectorTextFontButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                JFontChooser fontChooser = new JFontChooser();
                fontChooser.setSelectedFont(model.getConnectorFont());
                int result = fontChooser.showDialog(dialog);
                if (result == JFontChooser.OK_OPTION) {
                    Font font = fontChooser.getSelectedFont();
                    String text = getFontText(font);
                    model.setConnectorFont(font);
                    connectorTextFontButton.setText(text);
                    connectorTextFontButton.setFont(font);
                    JButton dummy = new JButton(text);
                    setButtonSizes(activityTextFontButton, 
                            connectorTextFontButton, dummy);
                    dialog.validate();
                    dialog.pack();
                }
            }
        });
        addComponent(dialog, connectorTextFontButton, 1, gridy++, 4, 1, spaceInsets,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        setButtonSizes(activityTextFontButton, connectorTextFontButton);

        return gridy;
    }

    protected String getFontText(Font font) {
        StringBuilder builder = new StringBuilder();

        builder.append(font.getName());
        builder.append(", ");
        builder.append(font.getSize());
        builder.append(" points, ");

        if (font.isPlain()) {
            builder.append("plain");
        } else if (font.isBold()) {
            builder.append("bold ");
        } else if (font.isItalic()) {
            builder.append("italic");
        } 

        return builder.toString();
    }

    protected int createButtonFields(int gridy) {
        JPanel buttondrawingPanel = new JPanel();
        buttondrawingPanel.setLayout(new FlowLayout());

        JButton okButton = new JButton("OK");
        okButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                //TODO Add edits to make sure fields are filled correctly
                setModel();
                okPressed = true;
                dialog.setVisible(false);
            }       
        });
        dialog.setOkButton(okButton);
        buttondrawingPanel.add(okButton);

        JButton cancelButton = new JButton("Cancel");
        cancelButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                okPressed = false;
                dialog.setVisible(false);
            }
        });
        buttondrawingPanel.add(cancelButton);

        setButtonSizes(okButton, cancelButton);

        addComponent(dialog, buttondrawingPanel, 0, gridy++, 5, 1, spaceInsets,
                GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL);

        return gridy;
    }

    protected void addComponent(Container container, Component component,
            int gridx, int gridy, int gridwidth, int gridheight, 
            Insets insets, int anchor, int fill) {
        GridBagConstraints gbc = new GridBagConstraints(gridx, gridy,
                gridwidth, gridheight, 1.0D, 1.0D, anchor, fill, insets, 0, 0);
        container.add(component, gbc);
    }

    protected void setButtonSizes(JButton ... buttons) {
        Dimension preferredSize = new Dimension();
        for (JButton button : buttons) {
            Dimension d = button.getPreferredSize();
            preferredSize = setLarger(preferredSize, d);
        }
        for (JButton button : buttons) {
            button.setPreferredSize(preferredSize);
        }
    }

    protected Dimension setLarger(Dimension a, Dimension b) {
        Dimension d = new Dimension();
        d.height = Math.max(a.height, b.height);
        d.width = Math.max(a.width, b.width);
        return d;
    }

    protected void setModel() {
        model.setActivityBorder(spinnerNumberModel.getNumber().intValue()); 
    }

    protected Rectangle dialogBounds() {
        int margin = 200;
        Rectangle bounds = dialog.getBounds();
        Rectangle f = frame.getFrame().getBounds();

        bounds.x = f.x + margin;
        bounds.y = f.y + margin;

        return bounds;
    }

    public boolean isOkPressed() {
        return okPressed;
    }

}

我扩展的 EscapeDialog 类只允许我使用 Esc 键关闭对话框,就像我左键单击“取消”按钮一样。

有两点我要注意。第一个是 addComponent 方法,它简化了向 GridBagLayout 添加组件的过程。

第二个是 setButtonSizes 方法,它使所有按钮大小统一。即使它们是 JButton 组件,而不是 JTextField 组件,如果您想让 JTextField 组件大小相同,您也可以执行类似的操作。

【讨论】:

    【解决方案3】:

    setSize() 方法仅在将布局管理器设置为 null 时有效。

    【讨论】:

      【解决方案4】:

      按照 cmets 中的建议,在文本字段构造函数中使用大小提示,并使用适当的布局管理器。

      import java.awt.*;
      import javax.swing.*;
      
      public class WestPanel extends JPanel {
      
          private JLabel dateL;
          private JTextField date;
      
          public WestPanel(){
              setBackground(Color.white);
              setLayout(new FlowLayout());
              dateL=new JLabel("Date: ");
              date=new JTextField("dd/mm/yyyy",6);
              add(dateL);
              add(date);
          }
      
          public static void main(String[] args) {
              Runnable r = new Runnable() {
                  @Override
                  public void run() {
                      JPanel gui = new JPanel(new BorderLayout());
                      gui.add(new WestPanel(), BorderLayout.LINE_START);
                      gui.setBackground(Color.ORANGE);
                      JOptionPane.showMessageDialog(null, gui);
                  }
              };
              SwingUtilities.invokeLater(r);
          }
      }
      

      【讨论】:

      • 您如何找到6 作为date JTextField 的列数?
      • @Stephan Drugs.
      【解决方案5】:

      Swing 中组件的大小取决于您使用的布局管理器的类型。如果您想完全控制 UI,可以使用 Freeflow 布局。

      在此处阅读完整的故事: http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

      【讨论】:

        【解决方案6】:

        JTextField 不能设置大小,实际上应该使用 JTextArea 来代替。

        【讨论】:

        • 您可以使用 setPreferredSize 和布局管理器(如 GridBagLayout)设置 JTextField 组件的大小,该管理器尊重组件大小。您可以使用适当的 JTextField 构造函数设置 JTextField 的宽度。但是,您不能将 JTextField 的高度更改为多于一行文本,这是正确的。对于不止一行,您将使用 JTextArea 组件。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-21
        相关资源
        最近更新 更多