Java GUI问题

时间:2009-02-11 18:56:41

标签: java swing

我正在设计一个非常简单的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);

现在它看起来很好,但我遇到的问题是你可以将分离器向左移动,但不能向右移动。事实上,如果你向左移动它,你就不能再向右移动了。我之前确实让它工作过,但实施效果并不理想,我忘记了我的所作所为。

有什么想法吗?我不明白为什么这不起作用。

5 个答案:

答案 0 :(得分:4)

如果我没记错的话,JSplitPanes始终尊重其组件的最小尺寸。尝试明确将ChatView的最小尺寸设置为(0,0),看看是否有帮助。如果是这样,您可以查看其中的每个组件以查看导致问题的原因。

答案 1 :(得分:1)

在任何地方,您是否为ChatView设置了最小尺寸?如果是这样,这个最小值是否等于帧大小(500 x 500)?

使用所提供的信息很难解决问题,但以下建议始终适用于我(以及使用它的人)

  • 创建可能可行的最简单框架,并添加带有两个按钮的SplitPane。
  • 在那里调整大小。
  • 一切正常,请替换您的一个组件。
  • 然后是另一个。
  • 检测哪一个导致奇怪的行为。
  • 在那一个上,开始做同样的事情,将它替换为你能想到的最小组件(例如用JPanel替换它)
BTW,用javax.swing.JComponent替换java.awt.Container可能会更好

这个想法是从最简单的事情开始,这可能是可行的,并从那里发展。大多数时候,问题在于我们设置的一些愚蠢的财产,并清理它出现的一切。

应该不到1小时。为了这。

答案 2 :(得分:1)

如果两个组件都有合理的首选和最小尺寸,并且您仍然看到奇怪的行为,则可能需要致电setResizeWeight()上的JSplitPane

注意,BTW,以编程方式设置分隔符位置(setDividerLocation())几乎不起作用。

答案 3 :(得分:0)

我不确定究竟是什么导致了你的问题,但是从模糊的记忆中我可以告诉你,如果你没有为你的每个窗格设置首选尺寸和最小尺寸,JSplitPane就会疯狂。

我建议这样做只是为了看它是否更好。

Here is some stuff from the Java tutorial on dividers.

答案 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);


}