GridBagLayout 内容未与 JPanel 的右侧对齐
GridBagLayout content not aligning to the right of JPanel
我有一个 JFrame (BorderLayout),在南位置有一个 JPanel(GridBagLayout)。 JPanel 边框水平填充屏幕(如我所愿),其中的内容也是如此(我不希望那样)。
它更容易可视化,所以我在 Photoshop 中做了我在 Java 中无法弄清楚的事情...
我在 photoshop 中制作了这个来展示我想要发生的事情:
这是我的代码生成的结果:
这是我使用的代码:
private void loadTags(String filePath)
{
Map<String, ArrayList<String>> fileTags;
try
{
fileTags = PowerPointManipulator.getTagsFromFile(filePath);
}
catch (IOException e)
{
System.err.println("Could not open Powerpoint File");
e.printStackTrace();
return;
}
tag_listener = new TagButtonListener();
pnl_tags = new JPanel();
pnl_tags.setBackground(new Color(0, 0, 0, 0));
pnl_tags.setLayout(new GridBagLayout());
pnl_tags.setAlignmentX(LEFT_ALIGNMENT);
brd_tags = new TitledBorder("Tags");
brd_tags.setTitleColor(Color.WHITE);
brd_tags.setBorder(new LineBorder(Color.WHITE));
pnl_tags.setBorder(brd_tags);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.insets = new Insets(0, 0, 2, 15);
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
int col = 0;
for (String key : fileTags.keySet())
{
ArrayList<String> vals = fileTags.get(key);
gbc.gridwidth = 2;
gbc.gridx = col;
gbc.gridy = 0;
JToggleButton tempButton = new JToggleButton(key);
tempButton.setOpaque(false);
tempButton.addActionListener(tag_listener);
tempButton.setFocusable(false);
pnl_tags.add(tempButton, gbc);
int row = 1;
for (String val : vals)
{
tempButton = new JToggleButton(val);
tempButton.setOpaque(false);
tempButton.addActionListener(tag_listener);
tempButton.setFocusable(false);
gbc.gridwidth = 1;
gbc.gridy = row;
pnl_tags.add(tempButton, gbc);
row++;
}
col += 2;
}
contentPane.add(pnl_tags, BorderLayout.PAGE_END);
}
如果我删除 "weight" 选项,那么我会得到正确的布局,只是按钮在 JPanel 中居中。
我觉得我很接近,但我无法获得完全正确的设置!非常感谢任何帮助!
GridBagConstraints#weightx
和GridBagConstraints#weighty
会导致组件占据所有其他组件布局后剩余的space,GridBagConstraints#fill
会导致组件根据您提供的值填充它所在单元格的可用 space 所以,
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
完全按照您的要求去做。
您可以尝试类似...
List<String> tags = new ArrayList<>(25);
tags.add("example");
tags.add("objective");
tags.add("motivation");
tags.add("summary");
tags.add("c");
tags.add("*");
tags.add("*");
tags.add("*");
tags.add("cs");
JPanel tagPane = new JPanel(new GridBagLayout());
tagPane.setBorder(new TitledBorder("Tags"));
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 3;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
for (String tag : tags) {
tagPane.add(new JToggleButton(tag), gbc);
gbc.gridx--;
if (gbc.gridx < 0) {
gbc.gridx = 3;
gbc.gridy++;
}
}
结果类似于...
好吧,这样稍微好一点,但它们都集中在中间!
好吧,您可以将其设置为每个右侧列都有 weightx
个 1
,例如...
gbc.gridx--;
if (gbc.gridx < 0) {
gbc.gridx = 3;
gbc.gridy++;
gbc.weightx = 1;
} else {
gbc.weightx = 0;
}
或者在所有其他组件的右侧添加一个"filler"组件...
for (String tag : tags) {
tagPane.add(new JToggleButton(tag), gbc);
gbc.gridx--;
if (gbc.gridx < 0) {
gbc.gridx = 3;
gbc.gridy++;
}
}
JLabel filler = new JLabel();
gbc.gridx = 4;
gbc.gridy = 0;
gbc.weightx = 1;
tagPane.add(filler, gbc);
无论哪种方式,你最终都会得到类似....
仔细查看 How to Use GridBagLayout 了解更多详情
我有一个 JFrame (BorderLayout),在南位置有一个 JPanel(GridBagLayout)。 JPanel 边框水平填充屏幕(如我所愿),其中的内容也是如此(我不希望那样)。
它更容易可视化,所以我在 Photoshop 中做了我在 Java 中无法弄清楚的事情...
我在 photoshop 中制作了这个来展示我想要发生的事情:
这是我使用的代码:
private void loadTags(String filePath)
{
Map<String, ArrayList<String>> fileTags;
try
{
fileTags = PowerPointManipulator.getTagsFromFile(filePath);
}
catch (IOException e)
{
System.err.println("Could not open Powerpoint File");
e.printStackTrace();
return;
}
tag_listener = new TagButtonListener();
pnl_tags = new JPanel();
pnl_tags.setBackground(new Color(0, 0, 0, 0));
pnl_tags.setLayout(new GridBagLayout());
pnl_tags.setAlignmentX(LEFT_ALIGNMENT);
brd_tags = new TitledBorder("Tags");
brd_tags.setTitleColor(Color.WHITE);
brd_tags.setBorder(new LineBorder(Color.WHITE));
pnl_tags.setBorder(brd_tags);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.insets = new Insets(0, 0, 2, 15);
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
int col = 0;
for (String key : fileTags.keySet())
{
ArrayList<String> vals = fileTags.get(key);
gbc.gridwidth = 2;
gbc.gridx = col;
gbc.gridy = 0;
JToggleButton tempButton = new JToggleButton(key);
tempButton.setOpaque(false);
tempButton.addActionListener(tag_listener);
tempButton.setFocusable(false);
pnl_tags.add(tempButton, gbc);
int row = 1;
for (String val : vals)
{
tempButton = new JToggleButton(val);
tempButton.setOpaque(false);
tempButton.addActionListener(tag_listener);
tempButton.setFocusable(false);
gbc.gridwidth = 1;
gbc.gridy = row;
pnl_tags.add(tempButton, gbc);
row++;
}
col += 2;
}
contentPane.add(pnl_tags, BorderLayout.PAGE_END);
}
如果我删除 "weight" 选项,那么我会得到正确的布局,只是按钮在 JPanel 中居中。
我觉得我很接近,但我无法获得完全正确的设置!非常感谢任何帮助!
GridBagConstraints#weightx
和GridBagConstraints#weighty
会导致组件占据所有其他组件布局后剩余的space,GridBagConstraints#fill
会导致组件根据您提供的值填充它所在单元格的可用 space 所以,
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
完全按照您的要求去做。
您可以尝试类似...
List<String> tags = new ArrayList<>(25);
tags.add("example");
tags.add("objective");
tags.add("motivation");
tags.add("summary");
tags.add("c");
tags.add("*");
tags.add("*");
tags.add("*");
tags.add("cs");
JPanel tagPane = new JPanel(new GridBagLayout());
tagPane.setBorder(new TitledBorder("Tags"));
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 3;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
for (String tag : tags) {
tagPane.add(new JToggleButton(tag), gbc);
gbc.gridx--;
if (gbc.gridx < 0) {
gbc.gridx = 3;
gbc.gridy++;
}
}
结果类似于...
好吧,这样稍微好一点,但它们都集中在中间!
好吧,您可以将其设置为每个右侧列都有 weightx
个 1
,例如...
gbc.gridx--;
if (gbc.gridx < 0) {
gbc.gridx = 3;
gbc.gridy++;
gbc.weightx = 1;
} else {
gbc.weightx = 0;
}
或者在所有其他组件的右侧添加一个"filler"组件...
for (String tag : tags) {
tagPane.add(new JToggleButton(tag), gbc);
gbc.gridx--;
if (gbc.gridx < 0) {
gbc.gridx = 3;
gbc.gridy++;
}
}
JLabel filler = new JLabel();
gbc.gridx = 4;
gbc.gridy = 0;
gbc.weightx = 1;
tagPane.add(filler, gbc);
无论哪种方式,你最终都会得到类似....
仔细查看 How to Use GridBagLayout 了解更多详情