10

我有这段代码,我试图在其中安装一个可滚动的面板(JPanel),但我不明白。这是我的代码:

public class Sniffer_GUI extends JFrame {
Canvas c = new Canvas();
ConnectorPropertiesPanel props;
public Sniffer_GUI() {
    super("JConnector demo");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    getContentPane().setLayout(new GridBagLayout());
    init();

    getContentPane().add(new JLabel("Connectors example. You can drag the connected component to see how the line will be changed"),
                         new GridBagConstraints(0, 0, 2, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 0, 5), 0, 0));
    getContentPane().add(initConnectors(),
                         new GridBagConstraints(0, 1, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
    getContentPane().add(props,
                         new GridBagConstraints(1, 1, 1, 1, 0, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.VERTICAL, new Insets(5, 0, 5, 5), 0, 0));
    setSize(800, 600);
    setLocationRelativeTo(null);

}

提前致谢。

我编辑添加了一个部分似乎有效的代码......

public Sniffer_GUI() {
    super("JConnector demo");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel container = new JPanel();
    JScrollPane scrPane = new JScrollPane(container);
    add(scrPane);
    scrPane.setLayout(new ScrollPaneLayout());
    init();

    add(initConnectors());

    setSize(800, 600);
    setLocationRelativeTo(null);

}

但它仍然不能滚动,至少它在 JScrollPane 中实现了它的功能,这是一个很好的步骤。

4

6 回答 6

20

Make a JPanel scrollable and use it as a container, something like this:

JPanel container = new JPanel();
JScrollPane scrPane = new JScrollPane(container);
add(scrPane); // similar to getContentPane().add(scrPane);
// Now, you can add whatever you want to the container
于 2012-05-29T14:30:03.933 回答
6

扩展@Eng.Fouad 答案:

public class Sniffer_GUI extends JFrame {
    Canvas c = new Canvas();
    ConnectorPropertiesPanel props;
    public Sniffer_GUI() {
        super("JConnector demo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel container = new JPanel();
        JScrollPane scrPane = new JScrollPane(container);
        getContentPane().add(scrPane);
        container.setLayout(new GridBagLayout());
        init();

        container.add(new JLabel("Connectors example. You can drag the connected component to see how the line will be changed"),
                             new GridBagConstraints(0, 0, 2, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 0, 5), 0, 0));
        container.add(initConnectors(),
                             new GridBagConstraints(0, 1, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
        container .add(props,
                             new GridBagConstraints(1, 1, 1, 1, 0, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.VERTICAL, new Insets(5, 0, 5, 5), 0, 0));
        setSize(800, 600);
        setLocationRelativeTo(null);

    }
}
于 2012-05-29T14:48:02.467 回答
6

也许这会有所帮助...

JFrame frame = new JFrame();
JPanel panel = new JPanel();

// add something to you panel...
// panel.add(...);

// add the panel to a JScrollPane
JScrollPane jScrollPane = new JScrollPane(panel);
// only a configuration to the jScrollPane...
jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

// Then, add the jScrollPane to your frame
frame.getContentPane().add(jScrollPane);
于 2015-09-30T18:02:34.117 回答
2

要使 JFrame 的组件可滚动,请将组件包装在 JScrollPane 中:

    JScrollPane myJScrollPane = new JScrollPane(myJLabel,
         JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
         JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

并将 myJLabel 的提及替换为 myJScrollPane。为我工作。

于 2014-08-09T03:36:38.497 回答
1

只是插话,如果我不在基地,请随时纠正我,但使用这样的 JScrollPane 会产生意想不到的后果,即需要更频繁地调整窗口大小。

例如,我有一个程序,我在其中设置了类似的 JFrame 范围的滚动窗格。我还在框架中的一个选项卡中有一个 JTextArea,它与内容窗格的大小相同。这个 textArea 也在它自己的滚动窗格中(这更像是一个搞砸的项目而不是其他任何东西)。当我从文件加载内容以存放在 textArea 中时,它触发了文本区域周围的滚动条。

结果是,我的,我们称之为 innerScrollPane,现在比 JFrame 大,因为滚动条以前不可见。然后这触发了我现在要调用的外层滚动窗格,以显示它的滚动条,然后覆盖内部滚动条。

这很容易通过在我的文件打开方法的末尾添加一个额外的 window.pack() 参数来解决,但我只是想把它扔在那里。如果您不小心,滚动条可能会掩盖窗口中的内容。但是......好吧,有一百万种方法可以防止这个问题,所以这不是什么大问题。只是需要注意的事情。

于 2015-04-24T00:21:16.877 回答
0

Try this:

JScrollPane sp = new JScrollPane();
this.add(sp).
sp.add( *GUI elements for your applications.*)

Something like that should work for you. Take a look at this as well:

于 2012-05-29T14:28:39.713 回答