有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java向JPanel添加垂直滚动能力

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

代码看起来有点像这样:

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();
                    }
                }

            });
        }
    });

}

}


共 (1) 个答案

  1. # 1 楼答案

    I don't mind sharing the project but I am not sure how safe that is

    我们永远不想看到你的整个应用程序。这是太多的代码看。相反,我们希望看到一个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),因此没有理由显示滚动条