为什么 BoxLayout 占用额外 space?
Why BoxLayout is taking extra space?
我正在开发一个客户端-服务器聊天应用程序,我正在尝试创建 Speech Bubble,就像我们在 WhatsApp 中所做的那样
我想在框架的右侧显示已发送的消息,在框架的左侧显示已接收的消息,我正在尝试使用 BoxLayout
来实现此目的,但需要额外的 space(如下图)
这是我到目前为止所做的
a1.setLayout(new BoxLayout(a1, BoxLayout.Y_AXIS));
JPanel p1 = new JPanel(new FlowLayout(FlowLayout.RIGHT));
JPanel p2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
你在两条消息之间看到的额外 space 是因为我正在使用 BoxLayout
在这种情况下该怎么办?以及任何替代方案我们如何通过不使用 BoxLayout
?
来实现这一目标
因此 FlowLayout 遵循首选高度,但它也遵循首选宽度。
相反,您需要一个布局:
- 尊重您添加到 BoxLayout 的组件的高度
- 填充可用 space 的宽度。
您可以为此使用 BorderLayout
:
import java.awt.*;
import javax.swing.*;
public class SSCCE extends JPanel
{
public SSCCE()
{
setLayout( new BorderLayout() );
Box vertical = Box.createVerticalBox();
add(vertical, BorderLayout.PAGE_START);
for (int i = 0; i < 10; i++)
{
JPanel left = new JPanel( new BorderLayout() );
left.add(new JLabel("left message " + i), BorderLayout.LINE_START);
vertical.add( left );
JPanel right = new JPanel( new BorderLayout() );
right.add(new JLabel("right message " + i), BorderLayout.LINE_END);
vertical.add( right );
}
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new JScrollPane(new SSCCE()) );
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args) throws Exception
{
java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
}
}
我正在开发一个客户端-服务器聊天应用程序,我正在尝试创建 Speech Bubble,就像我们在 WhatsApp 中所做的那样
我想在框架的右侧显示已发送的消息,在框架的左侧显示已接收的消息,我正在尝试使用 BoxLayout
来实现此目的,但需要额外的 space(如下图)
这是我到目前为止所做的
a1.setLayout(new BoxLayout(a1, BoxLayout.Y_AXIS));
JPanel p1 = new JPanel(new FlowLayout(FlowLayout.RIGHT));
JPanel p2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
你在两条消息之间看到的额外 space 是因为我正在使用 BoxLayout
在这种情况下该怎么办?以及任何替代方案我们如何通过不使用 BoxLayout
?
因此 FlowLayout 遵循首选高度,但它也遵循首选宽度。
相反,您需要一个布局:
- 尊重您添加到 BoxLayout 的组件的高度
- 填充可用 space 的宽度。
您可以为此使用 BorderLayout
:
import java.awt.*;
import javax.swing.*;
public class SSCCE extends JPanel
{
public SSCCE()
{
setLayout( new BorderLayout() );
Box vertical = Box.createVerticalBox();
add(vertical, BorderLayout.PAGE_START);
for (int i = 0; i < 10; i++)
{
JPanel left = new JPanel( new BorderLayout() );
left.add(new JLabel("left message " + i), BorderLayout.LINE_START);
vertical.add( left );
JPanel right = new JPanel( new BorderLayout() );
right.add(new JLabel("right message " + i), BorderLayout.LINE_END);
vertical.add( right );
}
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new JScrollPane(new SSCCE()) );
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args) throws Exception
{
java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
}
}