[英]How to set size of swing components
我想自定義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....//
setSize()
方法僅在將布局管理器設置為null時有效。
讓布局管理器照顧您的Swing組件的尺寸,但是如果絕對必要,請結合使用setPreferredSize
和尊重該屬性的布局管理器。
我不確定這是否能回答原始發布者的問題,但希望它將對其他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組件的大小設置為相同,也可以執行類似的操作。
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代替。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.