【问题标题】:Adding vertical scrollability to a JPanel向 JPanel 添加垂直可滚动性
【发布时间】:2015-01-07 16:03:25
【问题描述】:

好的,所以我有一个名为 AppMain 的类,它扩展了 JFrame 和一个 JPanel(称为面板),我在其中添加了各种 JSwing 组件(按钮、标签、分隔符),用户可以按下这些组件来执行各种操作。一个这样的操作是(在运行时)添加一个带有各种 JSpinner 和 TextArea 的整个 JPanel。详细信息在一个名为 PlayerCharacter 的类中,该类扩展了 JPanel。当您创建许多面板时,您会用完垂直空间,并且不会自动创建滚动条。我的问题是如何添加滚动条。我尝试制作一个 ScrollPane,在其中放置第二个面板。

代码看起来有点像这样:

public class AppMain extends JFrame {

public static void main(String[] args) {
    new AppMain();
}

private static JPanel panel = new JPanel();
private static JPanel contentPanel = new JPanel();
JScrollPane scrollPane = new JScrollPane(contentPanel);
JButton addPlayerButton = new JButton("Add player");

AppMain() {
    super("window name");
    setSize(1200, 750);
    setLocation(250, 50);
    panel.setLayout(null);
    contentPanel.setLayout(null);
    addPlayerButton.setBounds(5, 5, 150, 40);
    contentPanel.setBounds(5, 10, 1100, 750);
    scrollPane.setBounds(5, 10, 1100, 750);
    panel.add(addPlayerButton);
    panel.add(scrollPane);
    getContentPane().add(panel);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    interfaceControls();
}

public void interfaceControls() {
    addPlayerButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            SwingUtilities.invokeLater(new Runnable() {

                @Override
                public void run() {

                    for (int i = 0; i < 8; i++){
                    JLabel tmpLabel = new JLabel("text " + i);
                    tmpLabel.setBounds(5, (100 + (100 * i)), 100, 100);
                    contentPanel.add(tmpLabel);
                    contentPanel.revalidate();
                    contentPanel.repaint();
                    }
                }

            });
        }
    });

}
}

编辑:对于那些想知道有效代码的人:

public class AppMain extends JFrame {

public static void main(String[] args) {
    new AppMain();
}

private static JPanel panel = new JPanel();
JPanel topPanel = new JPanel();
JPanel contentPanel = new JPanel();
JButton addPlayerButton = new JButton("Add player");



AppMain() {
    super("window name");
    setSize(1200, 750);
    setLocation(250, 50);
    JScrollPane scrollPanel = new JScrollPane(contentPanel);

    panel.setLayout(new BorderLayout());

    contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
    panel.add(addPlayerButton, BorderLayout.PAGE_START);
    panel.add(scrollPanel, BorderLayout.CENTER);

    getContentPane().add(panel);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    interfaceControls();
}

public void interfaceControls() {
    addPlayerButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            SwingUtilities.invokeLater(new Runnable() {

                @Override
                public void run() {

                    for (int i = 0; i < 8; i++){
                    JButton dynamicButton = new JButton("text " + i);
                    contentPanel.add(dynamicButton);
                    contentPanel.revalidate();
                    contentPanel.repaint();
                    }
                }

            });
        }
    });

}

}

【问题讨论】:

  • 最好提供一个mcve 来重现问题。

标签: java swing scroll jpanel


【解决方案1】:

我不介意分享这个项目,但我不确定这有多安全

我们绝不希望看到您的整个应用程序。代码太多了,看不下去了。相反,我们希望看到一个SSCCE,它是一个简化的代码,展示了您正在尝试做的事情的“概念”。

所有问题都应包含 SSCCE。很少会发布 4 行代码为我们提供帮助解决您的问题所需的信息。 SSCCE 的另一个好处是,您通常会在尝试创建 SSCCE 时发现问题,因为在 20 行代码中发现问题比调试 200 行代码更容易。

contentPanel.add(newPlayerCharacter);
panel.validate();
panel.repaint();

正常的代码应该是:

contentPanel.add(newPlayerCharacter);
contentPanel.revalidate(); // note the "re"
contentPanel.repaint();

如果这没有帮助,请在问题中发布适当的 SSCCE。

编辑:

不要使用空布局(和 setBounds())!!!

Swing 旨在与布局管理器一起使用。我不知道你的实际布局是什么,所以我只是将你指向Layout Managers 上的 Swing 教程以获取更多信息和工作示例。

当添加到滚动窗格视口的组件的首选大小大于滚动窗格的大小时,滚动条将自动出现。布局管理器负责确定首选尺寸。由于您使用的是空布局,因此首选大小为 (0, 0),因此没有理由显示滚动条。

【讨论】:

  • @RekijanKileren,您发布的代码:1)没有实现我的建议。 2) 不是 SSCCE。我们无法执行您的代码,因为我们无权访问您的“newPlayerCharacter”类。而且我们不想访问您的课程,因为该课程与您的问题无关。您的问题是关于将组件添加到滚动窗格中的面板。所以添加一个JLabel。 Keep the code simple!!!。在您发布正确的 SSCCE 之前,我无能为力。
  • 我再次编辑了原帖。希望这能提供更好的见解。到目前为止,感谢您一直支持我 :)
  • @RekijanKileren 查看编辑...更好的 SSCCE。问题变得更加明显。
  • 感谢您对我的耐心,如您所见,我根据您的 cmets 解决了问题。我也会投票给你,但我还不允许。
猜你喜欢
  • 2012-03-06
  • 2021-04-25
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多