我正在设计一个非常简单的GUI,但没有任何运气。基本上外部布局有两列,这是一个拆分窗格(这是我正在编写的IRC客户端)。左侧是服务器/通道/用户树,右侧是聊天窗格。现在我把它拆开,所以在右侧,顶部有输出窗格,底部有一个单行输入框。
这是用于创建整体GUI的代码(这只是一个片段)
ChatModel cm = new ChatModel();
ChatView cv = new ChatView(cm);
treeViewChatSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, serverTreeView, cv);
treeViewChatSplitPane.setSize(500, 500);
treeViewChatSplitPane.setBorder(null);
treeViewChatSplitPane.setDividerSize(3);
this.getContentPane().add(treeViewChatSplitPane);
this.setSize(500, 500);
ChatView构造函数中包含它(它扩展了java.awt.Container)
this.model = model;
this.setLayout(new BorderLayout());
mainTextArea = new JTextArea();
mainTextArea.setLineWrap(true);
mainTextArea.setBackground(new Color(255, 255, 255));
inputField = new JTextField();
this.add(mainTextArea, BorderLayout.CENTER);
this.add(inputField, BorderLayout.PAGE_END);
现在它看起来很好,但我遇到的问题是你可以将分离器向左移动,但不能向右移动。事实上,如果你向左移动它,你就不能再向右移动了。我之前确实让它工作过,但实施效果并不理想,我忘记了我的所作所为。
有什么想法吗?我不明白为什么这不起作用。
答案 0 :(得分:4)
如果我没记错的话,JSplitPanes
始终尊重其组件的最小尺寸。尝试明确将ChatView
的最小尺寸设置为(0,0)
,看看是否有帮助。如果是这样,您可以查看其中的每个组件以查看导致问题的原因。
答案 1 :(得分:1)
在任何地方,您是否为ChatView设置了最小尺寸?如果是这样,这个最小值是否等于帧大小(500 x 500)?
使用所提供的信息很难解决问题,但以下建议始终适用于我(以及使用它的人)
这个想法是从最简单的事情开始,这可能是可行的,并从那里发展。大多数时候,问题在于我们设置的一些愚蠢的财产,并清理它出现的一切。
应该不到1小时。为了这。
答案 2 :(得分:1)
如果两个组件都有合理的首选和最小尺寸,并且您仍然看到奇怪的行为,则可能需要致电setResizeWeight()
上的JSplitPane
。
注意,BTW,以编程方式设置分隔符位置(setDividerLocation()
)几乎不起作用。
答案 3 :(得分:0)
我不确定究竟是什么导致了你的问题,但是从模糊的记忆中我可以告诉你,如果你没有为你的每个窗格设置首选尺寸和最小尺寸,JSplitPane就会疯狂。
我建议这样做只是为了看它是否更好。
答案 4 :(得分:0)
它可能与正确组件的minimunSize有关。在以下示例中,您只需将分隔符移动到左侧。
public static void main(String[] args) {
JLabel barLabel = new JLabel("bar");
JLabel fooLabel = new JLabel("foo");
barLabel.setMinimumSize(new Dimension(150,150));
fooLabel.setPreferredSize(new Dimension(50,50));
JSplitPane treeViewChatSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, fooLabel, barLabel);
treeViewChatSplitPane.setSize(500, 500);
treeViewChatSplitPane.setBorder(null);
treeViewChatSplitPane.setDividerSize(3);
JFrame frame = new JFrame();
frame.add(treeViewChatSplitPane, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200,200);
frame.setVisible(true);
}