如何设置摆动组件的大小

我想自定义JTextField对象的高度和宽度。 我尝试过使用setSize方法,将width和height作为维度传递,也作为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....// 

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

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

我不确定这会回答原始海报的问题,但希望它对其他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 = fx + margin; bounds.y = fy + margin; return bounds; } public boolean isOkPressed() { return okPressed; } } 

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

我会记下两件事。 第一个是addComponent方法,它简化了向GridBagLayout添加组件的过程。

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

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

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

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

西小组

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

JTextField无法设置大小,事实上,您应该使用JTextArea。