3

次の図に示すように、上部にボタン パネルを使用するシンプルな GUIGridBagLayoutと、残りのスペースを占めるサイズ変更可能なカスタム コンポーネントがあります。

起動時の GUI。

カスタム コンポーネント (赤いもの) の推奨サイズは (400, 300) で、最小サイズは (40, 30) で、それ以上の任意のサイズに変更できます。ただし、フレームがボタン パネルの最小サイズを尊重し、ボタンのいずれかが画面に完全に表示されないようにフレームのサイズを変更できないようにしたいと考えています。ここに示すように、これらの境界をはるかに超えてサイズを変更できるため、これは現在の動作ではありません。

GUI のサイズが非常に小さくなりました。

私の現在のコードは次のとおりです。

import javax.swing.*;
import java.awt.*;

public class Example {
    public static void main(String[] args) {
        // Setup JFrame and GridBagLayout.
        JFrame frame = new JFrame("Example");
        Container contentPane = frame.getContentPane();
        GridBagLayout layout = new GridBagLayout();
        contentPane.setLayout(layout);
        layout.rowWeights = new double[] {0.0, 1.0};
        layout.columnWeights = new double[] {1.0};
        GridBagConstraints cons = new GridBagConstraints();

        // Add button panel with a BoxLayout.
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
        panel.add(new JButton("Button 1"));
        panel.add(new JButton("Button 2"));
        panel.add(new JButton("Button 3"));
        cons.anchor = GridBagConstraints.NORTHWEST;
        cons.gridx = 0;
        cons.gridy = 0;
        layout.setConstraints(panel, cons);
        contentPane.add(panel);

        // Add custom component, resizable.
        JComponent custom = new JComponent() {
            public Dimension getPreferredSize() {
                return new Dimension(400, 300);
            }

            public Dimension getMinimumSize() {
                return new Dimension(40, 30);
            }

            public void paintComponent(Graphics g) {
                g.setColor(Color.RED);
                g.fillRect(0, 0, getWidth(), getHeight());
            }
        };
        cons.gridx = 0;
        cons.gridy = 1;
        cons.fill = GridBagConstraints.BOTH;
        layout.setConstraints(custom, cons);
        contentPane.add(custom);

        // Pack and show frame.
        frame.pack();
        frame.setVisible(true);
    }
}

これを Mac OS X 10.8 (Java 6) と Ubuntu 3.2.8 (Java 6) の両方でテストしたところ、同じことがわかりました。

ボタンのいずれかを覆うようにフレームのサイズが変更されないようにするにはどうすればよいですか? GridBagLayoutより一般的には、コンポーネントの最小サイズを実際に尊重するにはどうすればよいですか? フレームの最小サイズを印刷すると、(291, 81)まさに私が望むものですが、フレームのサイズを変更すると、それを超えてしまいます。

注:この関連する質問を見ましたが、私の質問には答えていないようです。

4

3 に答える 3

4

理由はわかりませんが、使用すると...

frame.setMinimumSize(frame.getMinimumSize());

UI が作成された後 (明らかに)、動作します。

((WindowPeer)peer).updateMinimumSize();私はそれがsetMinimumSizeサイズ方法と関係があると「思う」Window...

于 2013-10-22T02:10:11.903 に答える
2

フレームに最小サイズが設定されている場合は、フレームに を追加しComponentListenerてメソッドを実装できますcomponentResized

この例のように

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class Test {
    public static void main(String[] args) 
    {
        final JFrame frame = new JFrame("My Frame");
        frame.setMinimumSize(new Dimension(200,200));
        frame.addComponentListener( new ComponentAdapter()
        {
            public void componentResized(ComponentEvent evt)
            {
                Dimension size = frame.getSize();
                Dimension min = frame.getMinimumSize();
                if (size.getWidth() < min.getWidth())
                {
                    frame.setSize((int)min.getWidth() ,(int) size.getHeight());
                }
                if (size.getHeight() < min.getHeight())
                {
                    frame.setSize((int)size.getWidth() ,(int) min.getHeight());
                }
            }
        });
        frame.setSize(300,300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
于 2013-10-22T02:00:26.300 に答える