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