Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带边框布局的Swing GUI问题_Java_Swing_Border Layout - Fatal编程技术网

Java 带边框布局的Swing GUI问题

Java 带边框布局的Swing GUI问题,java,swing,border-layout,Java,Swing,Border Layout,考虑到我从来没有真正理解过布局,而是只做了nullLayout,绝对定位了所有元素,我目前正在尝试与布局相处 然而,我目前有一个合适的小项目,我正在尝试学习它,这是一些小型聊天服务 下面是一张照片: 这是一张图片,我想象它是如何完成的(请注意,这只是一个概念,但它应该给你一个正确的想法。我不是一个平面艺术家): 这是我目前的代码: public class Gui { JFrame frame; JTextArea textfield; JTextField enterMessage;

考虑到我从来没有真正理解过布局,而是只做了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(聊天对话框稍后出现的地方)放在框架的西侧

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

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

然而,现在我有一个问题,元素一直缩小到最小可能的大小

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


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

请尝试
消息面板中的
框布局
安装
边框布局

messagePanel.setLayout(new BoxLayout(messagePanel,BoxLayout.LINE_AXIS));
messagePanel.add(chatMessage);
messagePanel.add(send);
对于
文本字段

frame.add(textfield, BorderLayout.CENTER);

messagePanel
中尝试安装
BoxLayout

messagePanel.setLayout(new BoxLayout(messagePanel,BoxLayout.LINE_AXIS));
messagePanel.add(chatMessage);
messagePanel.add(send);
对于
文本字段

frame.add(textfield, BorderLayout.CENTER);

尝试设置元素的首选尺寸

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

尝试设置元素的首选尺寸

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

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

,正如所指出的,
BorderLayout
并不总是考虑子面板的尺寸。要解决此问题,您应该使用
setPreferedSize()
而不是
setSize()
来初始化子面板(在本例中是
textfield
messagePanel
),将构造函数更改为

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

它将工作。

将构造函数更改为

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

它会起作用的。

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

//          should be new JPanel(new BorderLayout())
JPanel messagePanel = new JPanel();
之后,BorderLayout通常喜欢在
BorderLayout.CENTER
中拉伸组件。因此,您希望将
文本字段
聊天信息
放在中间

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的大小包括,例如,标题栏
  • <> LI>应考虑在滚动窗格中包装<代码> JTextArea <代码>。你可以这样做
  • 获得具有首选大小的组件后,在调用
    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);

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

//          should be new JPanel(new BorderLayout())
JPanel messagePanel = new JPanel();
之后,BorderLayout通常喜欢在
BorderLayout.CENTER
中拉伸组件。因此,您希望将
文本字段
聊天信息
放在中间

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的大小包括,例如,标题栏
  • <> LI>应考虑在滚动窗格中包装<代码> JTextArea <代码>。你可以这样做
  • 获得具有首选大小的组件后,在调用
    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);

尝试设置面板的首选大小,这将解决您的问题。尝试设置面板的首选大小,这将解决您的问题。非常好的建议!你能告诉我我必须用新的BorderLayout()创建JPanel对象吗?它不是已经默认了吗?不,JPanel默认为FlowLayout。您可能会想到JFrame的内容窗格,默认情况下它有一个BorderLayout,但它不同于单独创建一个JPanel。有用的提示。很棒的建议!你能告诉我我必须用新的BorderLayout()创建JPanel对象吗?它不是已经默认了吗?不,JPanel默认为FlowLayout。您可能会想到JFrame的内容窗格,默认情况下它有一个BorderLayout,但它不同于单独创建一个JPanel。有用的提示。