1

JTextFieldオブジェクトの高さと幅をカスタマイズしたいと思います。私はsetSizeメソッドを試してみましたが、幅と高さを寸法と整数として渡しました。しかし、どれも機能していないようです。サイズのカスタマイズが効果的になるように、パネルでの必須のメソッド呼び出しなど、何かが足りませんか?助けてください。前もって感謝します。

編集:ここにコードのビットがあります:

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....//
4

6 に答える 6

6

レイアウトマネージャーにSwingコンポーネントの寸法を管理させますが、どうしても必要な場合は、setPreferredSizeそのプロパティを尊重するレイアウトマネージャーと組み合わせて使用​​します。

于 2012-09-04T14:34:41.090 に答える
5

これが元の投稿者の質問に答えるかどうかはわかりませんが、他の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キーを使用してダイアログを閉じることができます。

私が注意することが2つあります。1つ目はaddComponentメソッドで、GridBagLayoutへのコンポーネントの追加を簡素化します。

2つ目はsetButtonSizesメソッドで、すべてのボタンサイズを均一にします。これらはJButtonコンポーネントであり、JTextFieldコンポーネントではありませんが、JTextFieldコンポーネントを同じサイズにしたい場合は、同様のことを行うことができます。

于 2012-09-04T15:56:03.407 に答える
3

このsetSize()メソッドは、レイアウトマネージャーをnullに設定した場合にのみ機能します。

于 2012-09-04T14:33:25.937 に答える
3

コメントで示唆されているように、テキストフィールドコンストラクターでサイズヒントを使用し、適切なレイアウトマネージャーを使用します。

ウエストパネル

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);
    }
}
于 2012-09-04T15:55:08.147 に答える
2

Swingのコンポーネントのサイズは、使用しているレイアウトマネージャーのタイプによって異なります。UIを完全に制御したい場合は、Freeflowレイアウトを使用できます。

ここで全文を読んでください: http: //docs.oracle.com/javase/tutorial/uiswing/layout/using.html

于 2012-09-04T14:33:15.663 に答える
1

JTextFieldはサイズを設定できません。実際、代わりにJTextAreaを使用する必要があります。

于 2012-09-04T14:36:48.553 に答える