【问题标题】:Java GUI ProblemsJava GUI 问题
【发布时间】:2009-02-11 18:56:41
【问题描述】:

我正在设计一个非常简单的 GUI,但没有任何运气。基本上,外部布局有两列,它们是一个拆分窗格(这是针对我正在编写的 IRC 客户端)。左侧是服务器/频道/用户树,右侧是聊天窗格。现在我将其分解,因此右侧顶部是输出窗格,底部是单行输入框。

这是创建整体GUI的代码(这只是一个sn-p)

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

现在它最初看起来不错,但我遇到的问题是您可以将分离器向左移动,但不能向右移动。事实上,如果你把它向左移动,你就不能再向右移动它了。我之前确实有它工作过,但实现不是很好,我已经忘记了我做了什么。

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

【问题讨论】:

  • 为什么要在方法调用前面加上“this”?
  • @Steve:这是一种常见的做法,有好处也有坏处;有一个关于它的问题。
  • @Steve:我通常这样做是为了找出我在本地范围内可用的属性/方法。告诉我我在处理什么也很明确。我通常在发布代码中删除它们。

标签: java swing


【解决方案1】:

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

【讨论】:

  • 我想我只是爱上了你。你是明星。
  • 嗯...对不起,我稍微走远一点。 ;)
【解决方案2】:

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

提供的信息很难解决,但以下建议对我(以及使用它的人)一直有效

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

顺便说一句,用 javax.swing.JComponent 替换 java.awt.Container 可能会更好

我们的想法是从可能可行的最简单的事情开始,并从那里发展。大多数时候,问题出在我们设置的一些愚蠢的属性上,并通过清理它出现的所有内容。

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

【讨论】:

    【解决方案3】:

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

    注意,顺便说一句,以编程方式设置分隔线位置 (setDividerLocation()) 几乎永远不会起作用。

    【讨论】:

      【解决方案4】:

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

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

      Here is some stuff from the Java tutorial on dividers.

      【讨论】:

        【解决方案5】:

        可能与右边组件的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);
        
        
        }
        

        【讨论】:

          猜你喜欢
          • 2010-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多