web-dev-qa-db-ja.com

Javaで最小サイズを正しく設定する方法は?

Javaで作成しているGUIアプリケーションの場合、次のものがあります。

  • 最小サイズが(300,200)に設定されたJFrame
  • JSplitPane、その中にあります:
    • 左側は、最小サイズが(100,0)のJScrollPane(JTreeを含む)です(幅を200に制限したいだけです)
    • 右側は、最小サイズが(200,0)のJPanelです。

次の条件下では、サイズ設定によって問題が発生することはありません。

  • JSplitPaneのサイズを左端まで(JScrollPaneの最小サイズまで)変更し、その後ウィンドウのサイズを変更します
  • ウィンドウのサイズをある程度変更するだけです

この問題は、JSplitPaneを右に近づけすぎると発生します。ウィンドウのサイズを変更すると、JSplitPaneの右側にあるJPanelが設定した最小幅に準拠しません。

JScrollPaneで最大幅を設定しようとしましたが、まったく役に立たなかったようです。

私がしなければならない最大サイズを含む何かがありますか?または、リスナーをパネルの1つに接続して、目的の動作を強制する方法はありますか?最終的には、JSplitPaneの右側のパネルの幅が200pxを下回らないようにするだけです。

これが私が経験している振る舞いの例です:

import Java.awt.Dimension;
import Java.awt.EventQueue;
import Java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;

public class ResizeTest
{
    private JFrame frame;
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    ResizeTest window = new ResizeTest();
                    window.frame.setVisible(true);
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
    }
    public ResizeTest()
    {
        initialize();
    }
    private void initialize()
    {
        frame = new JFrame();
        frame.setMinimumSize(new Dimension(300, 200));
        frame.setBounds(100,100,450,300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new GridLayout(0, 1, 0, 0));

        JSplitPane splitPane = new JSplitPane();
        frame.getContentPane().add(splitPane);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setMinimumSize(new Dimension(100, 0));
        splitPane.setLeftComponent(scrollPane);

        JTree tree = new JTree();
        tree.setMinimumSize(new Dimension(100, 0));
        scrollPane.setViewportView(tree);

        JPanel panel = new JPanel();
        panel.setMinimumSize(new Dimension(200, 0));
        splitPane.setRightComponent(panel);
    }
}

更新:

SetPreferred()とsetMinimum/Maximum()を避ける方がよいことを除いて、提案されたソリューションでなされようとしているポイントを完全には理解していないのではないかと思います。

これを学んだことに対する私の質問は、これらのメソッドを使用する以外にJSplitPaneディバイダーを制限するための私のオプションは何ですかMadProgrammer componentResizedイベントのリッスンについて言及しましたが、その理由についてもう少し説明する必要があります。このイベントに応答してsetDividerLocation()を呼び出していますか?

添付の質問が完全に別のStackOverflow質問を意味する場合は、事前にお詫び申し上げます。必要に応じて、別の質問を投稿してここにリンクできます。

更新2:

ユーザーがウィンドウのサイズを選択する方法を規制しておらず、JScrollPaneに右側のパネルを配置することは実行可能なオプションではありませんか?これは、私には標準的な方法のように見えます。

10
bitflips

まず、メソッドsetMinimumSizeLayoutManagerAPIへの提案です。無視されるかもしれない提案。

これをサポートすることに近づくことができるようにするには、 ComponentListener のようなものを使用し、 componentResized イベントを監視する必要があります。

私が考えることができる最善の解決策は、LayoutManagerのような最小および最大サイズの制約を実際に使用するGridBagLayoutを使用することです。

これを「コンテンツ」ペインで使用し、JSplitPaneをこの上に配置し(それに応じて最小サイズと最大サイズを設定します)、「コンテンツ」ペインをフレームに追加します。

[〜#〜]更新[〜#〜]

申し訳ありませんが、私はおそらく本当に明白な何かを見逃していますが、私はこの小さなテストをまとめました、それが役立ついくつかのアイデアがあることを願っています:P

public class TestFrameSize extends JFrame {

    public TestFrameSize() throws HeadlessException {

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(600, 600);
        setLocationRelativeTo(null);

        setMinimumSize(new Dimension(250, 250));

        JLabel left = new JLabel("Left");
        JLabel right = new JLabel("Right");

        Dimension pSize = new Dimension(100, 100);
        Dimension mSize = new Dimension(25, 100);

        left.setPreferredSize(pSize);
        left.setMinimumSize(mSize);
        right.setPreferredSize(pSize);
        right.setMinimumSize(mSize);

        JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right);

        JPanel content = new JPanel(new GridBagLayout());
        content.add(pane);

        setLayout(new BorderLayout());
        add(content);

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        new TestFrameSize().setVisible(true);

    }
}
9
MadProgrammer

この では、JSplitPaneのコンテンツの推奨サイズは、最初はgetPreferredSize()のコンポーネントの推奨サイズの小さい倍数に設定されます。 JSplitPaneは、囲まれたJlabelによって管理される、パネルの最小サイズ以上になることに注意してください。

image

3
trashgod