【问题标题】:want to change an Inset in a gridbag layout dynamically想要动态更改网格包布局中的 Inset
【发布时间】:2012-05-15 03:33:26
【问题描述】:

我有一个网格包布局,我在其中初始化了一个 gbc.insets = Insets(0,0,0,); 稍后我想在发生某些操作时调整此插图的大小。 我试过改变这个值,然后做一个 repaint() 但这不起作用? 我需要做什么?非常感谢!

class myGraph {

    private Insets myInsets = new Insets(0,0,0,0);

    ...
    gbc.insets = myInsets; // setting Gridbag constraints.



    Action Listener {

        ............... 
        myInsets.top =30;
        myInsets.bottom =40;
        myGraph.repaint();
    }
}

【问题讨论】:

  • “我需要做什么???????????????”第一个,修复那个粘滞的'?'键。
  • 为了更好的帮助,请尽快使用SSCCE编辑您的问题

标签: java swing


【解决方案1】:

您需要更新 GridBagLayout:

GridBagLayout layout = new GridBagLayout();
JPanel panel = new JPanel(layout);
...
layout.setConstraints(myComponent, anotherConstraint);
// do this for all the components you want to update
panel.revalidate();
panel.repaint();

GridBagLayout 在您添加组件时会克隆您的约束,因此您需要告诉 LayoutManager 您要更改这些约束。简单地修改约束值是完全没有效果的。

顺便说一句,repaint() 只是执行“绘画”操作,而不是布局。请改用 revalidate()。

【讨论】:

  • 请不确定是否需要GBC panel.repaint();,为什么要保存重要的代码行:-)
  • @mKorbel 对不起,你让我迷路了。我不明白你在说什么(尽管我很确定你是正确的;)-)。我在this post 中使用了相同的技术,效果非常好。
  • 简单而简短的回答,(请)永远不要在不重新绘制的情况下使用重新验证,因为测试代码并不重要......
  • @mKorbel 我认为没有它也可以工作。在 revalidate() 之后总是调用 repaint() 真的被认为是一种“好习惯”吗?不这样做是否被认为是“邪恶的做法”?这只是为了扩展我的知识。
  • 如果我只是想改变一个约束,我可以这样做还是我必须重做我以前的所有其他约束。这似乎是很多代码。我看到了那个例子,似乎应该有一种简单的方法来更新一个约束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2018-05-22
相关资源
最近更新 更多