0

我正在使用 Spring Layout 为我正在构建的应用程序设计一个 gui。我遇到了弹簧布局问题;组件之间没有正确的间距,特别是消息框和发送按钮,如图所示:

春季布局问题

这是应用程序的代码:

package com.cliff777.chat;

import java.awt.Container;
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SpringLayout;

public class ChatMain
{
final int WIDTH = 800;
final int HEIGHT = 600;

JTextField messageBox = new JTextField(); //write a message in
JTextArea chatBox = new JTextArea(); //displays the messages
JButton sendButton = new JButton("Send");

void setupGui(Container container)
{
    container.setPreferredSize(new Dimension(WIDTH, HEIGHT));

    SpringLayout layout = new SpringLayout();
    container.setLayout(layout);

    container.add(messageBox);
    container.add(chatBox);
    container.add(sendButton);


    layout.putConstraint(SpringLayout.NORTH, chatBox, 5, SpringLayout.NORTH, container);
    layout.putConstraint(SpringLayout.WEST, chatBox, 5, SpringLayout.WEST, container);
    layout.putConstraint(SpringLayout.EAST, chatBox, 5, SpringLayout.EAST, container);
    layout.putConstraint(SpringLayout.SOUTH, chatBox, 5, SpringLayout.NORTH, messageBox);
    layout.putConstraint(SpringLayout.SOUTH, chatBox, 5, SpringLayout.NORTH, sendButton);

    layout.putConstraint(SpringLayout.WEST, messageBox, 5, SpringLayout.WEST, container);
    layout.putConstraint(SpringLayout.SOUTH, messageBox, 5, SpringLayout.SOUTH, container);
    layout.putConstraint(SpringLayout.EAST, messageBox, 5, SpringLayout.WEST, sendButton);

    layout.putConstraint(SpringLayout.EAST, sendButton, 5, SpringLayout.EAST, container);
    layout.putConstraint(SpringLayout.SOUTH, sendButton, 5, SpringLayout.SOUTH, container);



    //container.add(messageBox);
    //container.add(chatBox);
    //container.add(sendButton);


}

public ChatMain()
{
    JFrame frame = new JFrame("Chat");

    setupGui(frame.getContentPane());

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);

    chatBox.setEditable(false);

    while(true)
    {
        chatBox.setText(chatBox.getText() + messageBox.getText());
        messageBox.setText("");

        try
        {
            Thread.sleep(5000);
        }
        catch (Exception e)
        {

        }
    }

}

public static void main(String[] args)
{
    new ChatMain();     
}
}
4

1 回答 1

0

声明首选大小container.setPreferredSize(new Dimension(WIDTH, HEIGHT));并不自动意味着布局知道容器的宽度和高度。实际上布局知道它们(宽度和高度),但它也想知道如何调整窗口大小。SpringLayout 喜欢忽略大小,并且每次都这样做。
以下约束可能是您需要的:

// set the borders of chatBox
layout.putConstraint(SpringLayout.NORTH, chatBox, 5, SpringLayout.NORTH, container);
layout.putConstraint(SpringLayout.WEST, chatBox, 5, SpringLayout.WEST, container);
layout.putConstraint(SpringLayout.EAST, chatBox, 5, SpringLayout.EAST, container);

// set the borders of messageBox
layout.putConstraint(SpringLayout.NORTH, messageBox, 5, SpringLayout.SOUTH, chatBox);
layout.putConstraint(SpringLayout.WEST, messageBox, 5, SpringLayout.WEST, container);

// set the borders of sendButton
layout.putConstraint(SpringLayout.NORTH, sendButton, 5, SpringLayout.SOUTH, chatBox);
layout.putConstraint(SpringLayout.WEST, sendButton, 5, SpringLayout.EAST, messageBox);

// the most importent part set the borders of container (you need only bottom-right)
layout.putConstraint(SpringLayout.EAST, container, 5, SpringLayout.EAST, sendButton);
layout.putConstraint(SpringLayout.SOUTH, container, 5, SpringLayout.SOUTH, sendButton);

您程序中的主要问题是容器的边界不清晰,因此出现了奇怪的重叠。

对于更复杂的任务,您可以查看GridBagLayout的方向。

于 2014-11-25T10:59:52.760 回答