Java 面板忽略 setSize
Java Panel ignores setSize
我遇到了与 here 描述的相同问题,但 none 的答案对我有用。
我有一个 Panel
和一个 BoxLayout
和 Axis = Y Axes
,因为我想将一个元素堆叠在另一个下面,但我希望能够对齐元素向右和向左,所以现在我要插入此面板和其他面板:
arrayList.forEach(message -> {
JLabel label = new JLabel("[" + message.getSender() + " " + message.when() + "] : " + message.message(), SwingConstants.LEFT);
Panel panel = null;
try {
panel = new Panel(new FlowLayout(message.getSender().equals(this.client.getName()) ? FlowLayout.LEFT : FlowLayout.RIGHT));
panel.add(label);
panel.setSize(panel.getSize().width, label.getPreferredSize().height);
panel.setPreferredSize(new Dimension(panel.getSize().width, label.getPreferredSize().height));
label.setBackground(message.getSender().equals(client.getName()) ? Color.GREEN : Color.BLUE);
label.setForeground(message.getSender().equals(client.getName()) ? Color.BLACK : Color.WHITE);
} catch (RemoteException ex) {
ex.printStackTrace();
}
label.setOpaque(true);
chat.add(panel, BorderLayout.PAGE_START);
});
但是这不起作用,因为结果如下:
然而,假设的结果应该是一条消息在另一条消息下方,消息之间没有任何类型的 space...我错过了什么?
chat.add(panel, BorderLayout.PAGE_START);
这种说法没有道理。当您的问题表明您正在使用 BoxLayout 时,这意味着您正在使用 BorderLayout。使用 BoxLayout 时,您无需指定约束。
I have a Panel with a BoxLayout with Axis = Y Axes,
BoxLayout 遵循组件的最大尺寸。
因此,当父面板中有额外的 space 时,每个子面板都会增长,直到使用所有额外的 space。
不要玩弄尺寸或首选尺寸方法。
一种解决方案是使用符合所有子面板首选高度的包装面板。
所以你的代码应该是这样的:
Box chat = Box.createVerticalBox();
JPanel wrapper = new JPanel( new BorderLayout() );
wrapper.add(chat, BorderLayout.PAGE_START);
frame.add(wrapper, BorderLayout.CENTER);
现在“聊天”面板的高度将遵循添加到其中的每个组件的首选高度。
我遇到了与 here 描述的相同问题,但 none 的答案对我有用。
我有一个 Panel
和一个 BoxLayout
和 Axis = Y Axes
,因为我想将一个元素堆叠在另一个下面,但我希望能够对齐元素向右和向左,所以现在我要插入此面板和其他面板:
arrayList.forEach(message -> {
JLabel label = new JLabel("[" + message.getSender() + " " + message.when() + "] : " + message.message(), SwingConstants.LEFT);
Panel panel = null;
try {
panel = new Panel(new FlowLayout(message.getSender().equals(this.client.getName()) ? FlowLayout.LEFT : FlowLayout.RIGHT));
panel.add(label);
panel.setSize(panel.getSize().width, label.getPreferredSize().height);
panel.setPreferredSize(new Dimension(panel.getSize().width, label.getPreferredSize().height));
label.setBackground(message.getSender().equals(client.getName()) ? Color.GREEN : Color.BLUE);
label.setForeground(message.getSender().equals(client.getName()) ? Color.BLACK : Color.WHITE);
} catch (RemoteException ex) {
ex.printStackTrace();
}
label.setOpaque(true);
chat.add(panel, BorderLayout.PAGE_START);
});
但是这不起作用,因为结果如下:
然而,假设的结果应该是一条消息在另一条消息下方,消息之间没有任何类型的 space...我错过了什么?
chat.add(panel, BorderLayout.PAGE_START);
这种说法没有道理。当您的问题表明您正在使用 BoxLayout 时,这意味着您正在使用 BorderLayout。使用 BoxLayout 时,您无需指定约束。
I have a Panel with a BoxLayout with Axis = Y Axes,
BoxLayout 遵循组件的最大尺寸。
因此,当父面板中有额外的 space 时,每个子面板都会增长,直到使用所有额外的 space。
不要玩弄尺寸或首选尺寸方法。
一种解决方案是使用符合所有子面板首选高度的包装面板。
所以你的代码应该是这样的:
Box chat = Box.createVerticalBox();
JPanel wrapper = new JPanel( new BorderLayout() );
wrapper.add(chat, BorderLayout.PAGE_START);
frame.add(wrapper, BorderLayout.CENTER);
现在“聊天”面板的高度将遵循添加到其中的每个组件的首选高度。