java - BorderLayout 的 Swing GUI 问题

标签 java swing border-layout

我目前正在尝试使用布局,考虑到我从来没有真正理解过它们,只是做了 nullLayout,然后绝对定位所有元素。

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

这是一张现在的照片:enter image description here

这是一张图片,展示了我想象中的完成方式(请注意,这只是一些概念,但它应该给你正确的想法。我不是图形艺术家):enter image description here

这是我当前的代码:

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 的理解,是将文本字段(稍后聊天对话框结束的地方)放在框架内的西侧。

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

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

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

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

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

最佳答案

最初,您有一个简单的问题:

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

然后,之后,一般BorderLayout喜欢在BorderLayout.CENTER中拉伸(stretch)组件。所以你想把你的 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);
}

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

yay

但是,作为几句忠告:

  • 不要依赖 JFrame 的 setSize。相反,您应该在单个组件上使用 setPreferredSize,整个 UI 应该围绕该组件调整自身大小。 (可能是主文本区域。)JFrame 的大小包括标题栏等。
  • 您应该考虑将 JTextArea 包装在滚动 Pane 中。然后你可以改为 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);

关于java - BorderLayout 的 Swing GUI 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30289633/

相关文章:

swing - openJDK 8 中的 isPopupMenu 方法

html - 无法使 css 表格边框在整个表格和嵌套表格中保持一致

java - 数组(搜索最大值)

java - RecyclerView 和 java.lang.IndexOutOfBoundsException 无效的 View 持有者适配器 positionViewHolder

java - 如何向 jpanel 添加视觉效果?

java - JFrame/JLabel 问题

java - 设置盒子的大小

java - 如何在 JToolBar 中的两个按钮之间添加间隙?

java - 如何为集合实现 toString() ?

java - 在 netbeans 中使用 .class 文件