【问题标题】:Swing GUI problems with BorderLayout使用 BorderLayout 的 Swing GUI 问题
【发布时间】:2015-05-17 17:07:47
【问题描述】:

我目前正在尝试与 Layouts 相处,考虑到我从来没有真正理解过它们,只做了 nullLayout,然后绝对定位所有元素。

但是,我目前有一个合适的小项目,我正在尝试学习它,它是一些小型聊天服务。

这是一张现在的照片:

这是一张我想象的完成的图片(请注意,这只是一些概念,但它应该给你正确的想法。我不是图形艺术家):

这是我当前的代码:

public class Gui {

JFrame frame;
JTextArea textfield;
JTextField enterMessage;

    public Gui(){
        
        frame = new JFrame();
        frame.setSize(600, 400);
        
        
        textfield = new JTextArea();
        textfield.setText("Textfield");
        textfield.setSize(400, 300);
        
        JPanel messagePanel = new JPanel();
    
        JTextField chatMessage = new JTextField();
        chatMessage.setText("Send me");
        
        JButton send = new JButton();
        send.setText("Send");
        
    
        messagePanel.add(chatMessage, BorderLayout.WEST);
        messagePanel.add(send, BorderLayout.EAST);
        
        frame.add(textfield, BorderLayout.WEST);
        frame.add(messagePanel, BorderLayout.SOUTH);
        frame.setVisible(true);
    }
}

我的想法,连同迄今为止对 BorderLayouts 的理解,是将 Textfield(稍后聊天对话框结束的地方)放在框架内的 WEST 侧。

要发送的按钮和输入一些文本的字段将位于面板内,具有自己的边框布局,而按钮右侧有一些较小的部分,其余的宽度由文本字段填充。

然后整个面板在框架的南侧结束。

但是,现在我有一个问题,即元素不断缩小到尽可能小的尺寸。

我试图用 setSize(); ,但这根本没有影响,只是被完全忽略了。

有什么帮助可以指引我正确的方向吗?

【问题讨论】:

  • 尝试为面板设置首选尺寸,它应该可以解决您的问题。

标签: java swing border-layout


【解决方案1】:

一开始,你有一个简单的问题:

//          should be new JPanel(new BorderLayout())
JPanel messagePanel = new JPanel();

然后,之后,一般BorderLayout喜欢拉伸BorderLayout.CENTER中的组件。所以你想把你的textfieldchatMessage放在中间。

public Gui(){
    frame = new JFrame();
    frame.setSize(600, 400);

    textfield = new JTextArea();
    textfield.setText("Textfield");
//    textfield.setSize(400, 300);

    JPanel messagePanel = new JPanel(new BorderLayout());

    JTextField chatMessage = new JTextField("Send me");
    JButton send = new JButton("Send");

    messagePanel.add(chatMessage, BorderLayout.CENTER);
    messagePanel.add(send, BorderLayout.EAST);

    frame.add(textfield, BorderLayout.CENTER);
    frame.add(messagePanel, BorderLayout.SOUTH);
    frame.setVisible(true);
}

一旦你这样做了,你应该得到这样的东西:

但是,作为几句话的建议:

  • 不要依赖 JFrame 的 setSize。相反,您应该在单个组件上使用setPreferredSize,整个 UI 应该围绕该组件调整大小。 (可能是主文本区域。)JFrame 的大小包括标题栏等。
  • 您应该考虑将JTextArea 包装在滚动窗格中。然后你可以改为setPreferredSize on the viewport
  • 在获得具有首选大小的组件后,在调用 setVisible(true) 之前在 JFrame 上调用 pack()。这会自动调整大小。

类似:

frame = new JFrame();
// frame.setSize(600, 400);

...

JScrollPane pane = new JScrollPane(
    textfield,
    JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
    JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// specifying initial size for the
// visible portion of the scroll pane
pane.getViewport().setPreferredSize(new Dimension(320, 200));

frame.add(pane, BorderLayout.CENTER);
frame.add(messagePanel, BorderLayout.SOUTH);
// entire UI sizes around the scroll pane view
frame.pack();
frame.setVisible(true);

【讨论】:

  • 好建议!你能告诉我我必须用 new BorderLayout() 创建 JPanel 对象吗?不是已经默认了吗?
  • 不,JPanel 默认是 FlowLayout。您可能会想到 JFrame 的内容窗格,默认情况下它具有 BorderLayout,但它与自己创建 JPanel 不同。
  • 太棒了。有用的提示。
【解决方案2】:

试试BoxLayout insted BorderLayout in messagePanel

messagePanel.setLayout(new BoxLayout(messagePanel,BoxLayout.LINE_AXIS));
messagePanel.add(chatMessage);
messagePanel.add(send);

对于textField

frame.add(textfield, BorderLayout.CENTER);

【讨论】:

    【解决方案3】:

    尝试设置元素的首选尺寸尺寸。

    textfield.setText("Textfield");
    textfield.setPreferredSize(new Dimension(600, 300));
    //some other code
    
    
    JTextField chatMessage = new JTextField();
    chatMessage.setPreferredSize(new Dimension(500, 25));
    //some other code
    

    【讨论】:

      【解决方案4】:

      正如Sridhar 所指出的,BorderLayout 并不总是尊重子面板的尺寸。要解决此问题,您应该使用setPreferedSize() 而不是setSize() 来初始化您的子面板(在本例中为textfieldmessagePanel)。

      【讨论】:

        【解决方案5】:

        将您的构造函数更改为

        public Gui() {
        
            frame = new JFrame();
            frame.setSize(600, 400);
        
        
            textfield = new JTextArea();
            textfield.setText("Textfield");
            textfield.setSize(400, 300);
            // set border layout to JPanel
            JPanel messagePanel = new JPanel(new BorderLayout());
        
            JTextField chatMessage = new JTextField();
            chatMessage.setText("Send me");
        
            JButton send = new JButton();
            send.setText("Send");
        
            // add JTextField to CENTER and button to EAST
            messagePanel.add(chatMessage, BorderLayout.CENTER);
            messagePanel.add(send, BorderLayout.EAST);
        
            // add textArea to CENTER of JFrame
            frame.add(textfield, BorderLayout.CENTER);
            frame.add(messagePanel, BorderLayout.SOUTH);
            frame.setVisible(true);
        }
        

        它会起作用的..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-11
          • 2017-06-30
          • 1970-01-01
          • 2011-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-06
          相关资源
          最近更新 更多