在JPanel中移动JLabel而不会丢失层次结构

时间:2015-11-25 17:54:24

标签: java swing jpanel jlabel

所以我在JLabel内移动JPanel,我希望JPanel能够自动显示滚动条,引导您前往JLabel我移出的JLabel

问题在于,当我设置新的JPanel位置并且此位置超出JLabel时,它会丢失其层次结构,因此JPanel不再是{{1}的一部分因此,面板不会滚动,您无法看到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

1 个答案:

答案 0 :(得分:0)

您需要做的是将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时动态更改此值。

另外,我想提一下,null布局不是正确的方法。在这个例子中,我希望最小化LayoutManagersetBounds()JScrollPane的基础调用的影响,以强调我试图通过的点,这是一个纯粹的内部大小变化一个JFrame。整个def dataEntry(): x = True; while x == True: entData = input() Lst = entData if entData == "stop": return Lst 只是一个"容器"例如。