我正在尝试创建一个使用JPanel
的{{1}}。此面板使用FlowLayout
放置在container
内。然后使用BorderLayout
将此container
添加到卡片中。我希望使用CardLayout
的面板是FLowLayout
面板左下角的一个小方框。我该怎么做?我使用过BorderLayout
但是宽度仍然跨越整个面板,无论我设置的是什么尺寸,尽管高度都在变化。我怎样才能改变宽度?
代码:
settingsPanel.setPreferredSize(new Dimension(10, 425));
示例:
答案 0 :(得分:2)
所以这是您的代码使用BorderLayout
更改GridBagLayout
。 GridBagLayout的核心思想是,您将拥有一个包含多个行和列(不同大小)的网格,您可以在每个单元格中放置组件。关于它的巧妙之处在于它非常强大:当您将组件放置在单元格中时,您可以自定义以下内容:
除此之外。最后一点是你的问题,BorderLayout迫使你的面板尽可能地扩展。在我的代码中,我使用了fill = NONE
并将其设置为anchor = LAST_LINE_START
,因此它位于左下角并且不会展开。
您可以使用这些参数,所有信息都是in the tutorial。 所有这一切的关键是要知道你的网格是怎样的。在这个例子中,它非常简单,仅为1x1。但是看一下教程:那些带有红色网格的图像,这就是你必须拥有的东西。除此之外,了解所有变量,唯一棘手的问题是权重如何运作。
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Main {
//Settings Panel variables
JLabel settingsTitle = new JLabel("Settings");
public Main()
{
JPanel mainCard = new JPanel(new GridBagLayout());
JPanel settingsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
settingsTitle.setFont(new Font("TimesRoman", Font.PLAIN, 35));
settingsPanel.add(settingsTitle);
final CardLayout layout = new CardLayout();
final JPanel cards = new JPanel(layout);
cards.add(mainCard, "2");
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.weightx = 1.0;
c.weighty = 1.0;
c.anchor = GridBagConstraints.LAST_LINE_START;
c.fill = GridBagConstraints.NONE; //uneeded line because it's the default value, but it has to be NONE
mainCard.add(settingsPanel, c);
// settingsPanel.setPreferredSize(new Dimension(300, 425)); //the components inside settingsPanel will set its side
settingsPanel.setBorder(BorderFactory.createLineBorder(Color.black));
layout.show(cards, "1");
JFrame window = new JFrame("Test");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().add(cards);
window.setSize(1280, 720); ///replace with window.pack()
window.setLocationRelativeTo(null);
window.setResizable(false);
window.setVisible(true);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Main();
}
});
}
}
答案 1 :(得分:1)
首先摆脱这个:settingsPanel.setPreferredSize(new Dimension(10, 425))
让布局经理完成他们的工作。
我能想到的最简单的方法就是将settingsPanel
包裹在另一个面板中,并将最后一个添加到南方:
JPanel wrapPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
wrapPanel.add(settingsPanel);
JPanel mainCard = new JPanel(new BorderLayout(8,8));
mainCard.add(wrapPanel, BorderLayout.SOUTH); // add wrapPanel here instead of settingsPanel
通过这种方式,您可以利用FlowLayout属性填充所需的较小空间:
由于我已在您的previous question 此评论中发表评论,因此我想起了这段Portal 2: Panels视频。我们还需要一些时间来笑,你不觉得吗?