14

私が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 に適切なパネルを配置することは実行可能なオプションですか? これは、標準的な慣行のように見えます。

4

2 に答える 2

9

まず、メソッド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);

    }
}
于 2012-09-18T23:08:33.940 に答える
3

このでは、 のコンテンツの優先サイズは、JSplitPane最初は のコンポーネントの優先サイズの小さな倍数に設定されていgetPreferredSize()ます。JSplitPaneは、同封の で管理されるパネルの最小サイズよりも小さくならないことに注意してくださいJlabel

画像

于 2012-09-18T23:52:27.200 に答える