【问题标题】:Swing display JPanels in a row to the right cornerSwing 连续显示 JPanel 到右上角
【发布时间】:2014-08-15 03:05:57
【问题描述】:

我正在为我的第一个自定义 Swing 程序窗口创建自定义装饰,我刚开始使用布局管理器,看起来我做错了什么,首先我使用 BorderLayout 和 BorderLayout.EAST 或 WEST 显示在角落,但它只允许一个面板显示在角落,就像它不会连续显示一样。

看起来像这样:


(来源:gyazo.com

使用该代码:

    this.panel.setLayout(new BorderLayout());


    this.panel.add(this.createToolButton("X"), BorderLayout.EAST);

但是如果我添加另一个面板,最新的面板将前一个面板(注意我使用面板是因为 JButton 讨厌我,它的默认样式不允许我制作它平)

现在我使用了 GridBagLayout

    this.panel.setLayout(new GridBagLayout());

    Box panels = new Box(BoxLayout.X_AXIS);

    panels.add(this.createToolButton("X"));

    this.panel.add(panels, BorderLayout.EAST);

但是在运行时我得到了

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: cannot add to layout: constraints must be a GridBagConstraint
    at java.awt.GridBagLayout.addLayoutComponent(Unknown Source)

我做错了什么?我怎样才能让面板一个接一个地向右浮动?

编辑:

    this.panel.setLayout(new GridBagLayout());
    GridBagConstraints gc = new GridBagConstraints();

    gc.fill = GridBagConstraints.WEST;
    this.panel.add(this.createToolButton("X"), gc);

【问题讨论】:

  • this.panel.setLayout(new GridBagLayout());和 this.panel.add(panels, BorderLayout.EAST);真的不适合在一起。您必须将 Layout 设置为 new BorderLayout()

标签: java swing layout jpanel gridbaglayout


【解决方案1】:

线程“AWT-EventQueue-0”中的异常java.lang.IllegalArgumentException:无法添加到布局:约束必须是 GridBagConstraint 在 java.awt.GridBagLayout.addLayoutComponent(Unknown Source)

GridBagConstraintGridBagLayout 一起使用。

this.panel.setLayout(new GridBagLayout());
GridBagConstraint gc = new GridBagConstraint();
// set different properties of GridBagConstraint as per your need
this.panel.add(panels, gc);

阅读更多How to Use GridBagLayout 阅读更多关于GridBagConstraint 的属性。

这里是The Example 了解更多信息。


编辑

您可以尝试使用右对齐的FlowLayout

JPanel titlePanel=new JPanel(new GridLayout(1,2));
titlePanel.setBorder(new LineBorder(Color.BLACK));
titlePanel.setBackground(Color.LIGHT_GRAY);

JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));
panel.setBackground(Color.LIGHT_GRAY);

titlePanel.add(new JLabel("Title",JLabel.LEFT));
panel.add(new JButton("X"));
titlePanel.add(panel);

frame.add(titlePanel, BorderLayout.NORTH);
// add panel in the north section of the undecorated JFrame 
// that by default uses BorderLayout

快照:

【讨论】:

  • 谢谢!这行得通,但是有没有办法删除这个填充 gyazo.com/88058d4ae0ec69f8ebf1b902595f6f02
  • @BenBeri: 将JPanel 设置为GridLayout(1, 0),将JButtons 添加到JPanel,然后将JPanel 添加到JPanel 和@987654337 @,就可以了:-)
  • 使用new FlowLayout(FlowLayout.RIGHT,0,0)
  • 你太棒了,工作得很好!非常感谢朋友。
  • @Braj 问题:将来在那个面板的左侧实现一个文本会不会有问题?
【解决方案2】:

如果你正在使用

this.panel.add(panels, BorderLayout.EAST);

那么你应该使用BorderLayout 而不是GridBagLayout

this.panel.setLayout(new BorderLayout());

您可以在文档How to Use BorderLayout 中阅读更多内容。

【讨论】:

  • 该代码对应于 OP 编写的内容。老实说,我在 java 6 中经常使用 Swing,而且我总是使用 BorderLayout.EAST。所以是的,我想当然地认为它在文档中是一样的。令人惊讶的是以前从未遇到过这种情况。 Tx 指出这一点:)
  • Awww,没关系,我们都倾向于错过很多东西。有时,某些东西是为了让别人向自己展示。它也发生在我身上:-)(尽管保持低调)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 2020-12-06
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多