【问题标题】:Move a JLabel inside of JPanel without losing hierarchy在 JPanel 内移动 JLabel 而不会丢失层次结构
【发布时间】:2015-11-25 17:54:23
【问题描述】:

所以我将JLabel 移动到JPanel 内部,我希望JPanel 自动显示滚动条,引导您到我移出的JLabel

问题是,当我设置新的JLabel 位置并且该位置不在JPanel 之外时,它会失去其层次结构,因此JLabel 不再是JPanel 的一部分,因此面板不滚动,您看不到JLabel。所以这是我的代码,如果你能告诉我该怎么做。谢谢。

//Panel creation
JPanel panel = new JPanel();
panel.setSize(500, 500);
panel.setAutoscrolls(true);

//Label creation
JLabel label = new JLabel();
label.setText("Hi");
label.setSize(40, 40);

//Adding Jlabel to Panel
panel.add(label);

label.setLocation(800, 200);//this invalidates inherancy

【问题讨论】:

  • 这似乎不是层次问题。如果您进行调试,您可能会注意到它保留了父级。问题是它在画布之外,所以它永远不会被绘制。你想做什么?你为什么要移动JLabel 这么远?为什么JPanel 不能更大,或者不能动态增长?
  • 问题是我不希望 JPanel 增长,这就是为什么有一个名为“autoscroll”的属性。我必须将 JLabels 放在屏幕上的许多位置,其中许多将超出屏幕分辨率,但我仍然希望能够通过使用滚动条看到它们,你明白我在做什么吗?
  • 如果 JPanel 封装在 JScrollPane 中,请不要担心它会增长。如果您增加滚动窗格的大小,它只会在您的屏幕中增长。
  • 好的,我明白了,但是为什么 autoscrolls 属性不起作用,我在 C# 中做了同样的事情,这真的很简单。好的,我意识到组件总是会增长,但是为什么我需要通过将 autoscrolls 属性设置为 true 来自动更改 Jpanel 的大小。
  • 我相信你误解了setAutoscrolls()的功能。参考javadoc:JComponent Javadoc

标签: java swing jpanel jlabel


【解决方案1】:

您需要做的是将JPanel 封装在JScrollPane 中并使用setPreferredSize() 增加其大小

请注意,使用 setSize() setWidth()setHeight() 将被滚动窗格忽略

如何设置的示例代码如下:

public class TestFrame extends JFrame {

    public TestFrame() {
        setLayout(null);
        setSize(500, 500);

        JPanel panel = new JPanel();
        panel.setBackground(Color.BLUE);

        JScrollPane scroll = new JScrollPane();
        scroll.setViewportView(panel);

        add(scroll);

        scroll.setBounds(100, 100, 200, 200);
        panel.setPreferredSize(new Dimension(800, 800));
    }

    public static void main(String[] args) {
        TestFrame frame = new TestFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

在本例中,JScrollPane 的大小固定为 200x200,而其中的JPanel 的大小为 800x800。您可以在移动 JLabel 时动态更改此值。

另外,我想提一下,空布局不是正确的方法。在这个例子中,我想最小化LayoutManagers 和他们对setBounds() 的潜在调用的影响,以强调我试图理解的一点,这是JScrollPane 内部大小的纯粹变化。整个JFrame 只是示例的“容器”。

【讨论】:

  • 从不建议使用 NullLayout,Swing 被指定使用 LayoutManagers,因为 JPanel 有 FlowLayout(作为默认 LayoutManager 实现的 n API),它只接受 PreferredSize
  • @mKorbel 我同意。谢谢你补充,我也应该把它放在答案中。我想举一个例子,LayoutManagers 不会执行 setBounds() 操作来证明我关于 JComponents 的大小和放置的观点
  • 非常感谢,真的很有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
相关资源
最近更新 更多