向 JPanel 添加垂直滚动能力
Adding vertical scrollability to a JPanel
好的,所以我有一个名为 AppMain 的 class,它扩展了 JFrame 和一个 JPanel(称为面板),我在其中添加了各种 JSwing 组件(按钮、标签、分隔符),用户可以按这些组件执行各种操作。此类操作之一是(在运行时)添加具有各种 JSpinner 和 TextAreas 的整个 JPanel。详细信息在扩展 JPanel 的名为 PlayerCharacter 的 class 中。当您创建许多面板时,您会用完垂直 space 并且不会自动创建滚动条。我的问题是如何添加滚动条。我尝试制作一个 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();
}
}
});
}
});
}
}
I don't mind sharing the project but I am not sure how safe that is
我们从不想看到你的整个应用程序。这是太多的代码看。相反,我们希望看到一个 SSCCE 这是简化的代码,它演示了您正在尝试做的事情的 "concept"。
SSCCE 应该包含在您的所有问题中。 posting 4 行代码很少会为我们提供帮助解决您的问题所需的信息。 SSCCE 的另一个好处是,您通常会在尝试创建 SSCCE 时发现问题,因为在 20 行代码中发现问题比调试 200 行代码更容易。
contentPanel.add(newPlayerCharacter);
panel.validate();
panel.repaint();
正常代码应该是:
contentPanel.add(newPlayerCharacter);
contentPanel.revalidate(); // note the "re"
contentPanel.repaint();
如果这没有帮助,那么 post 在问题中使用适当的 SSCCE。
编辑:
不要使用空布局(和 setBounds())!!!
Swing 旨在与布局管理器一起使用。我不知道您的实际布局是什么,所以我只是将您指向 Layout Managers 上的 Swing 教程以获取更多信息和工作示例。
当添加到滚动窗格视口的组件的首选大小大于滚动窗格的大小时,滚动条将自动出现。布局管理器负责确定首选尺寸。由于您使用的是空布局,因此首选大小为 (0, 0),因此没有理由显示滚动条。
好的,所以我有一个名为 AppMain 的 class,它扩展了 JFrame 和一个 JPanel(称为面板),我在其中添加了各种 JSwing 组件(按钮、标签、分隔符),用户可以按这些组件执行各种操作。此类操作之一是(在运行时)添加具有各种 JSpinner 和 TextAreas 的整个 JPanel。详细信息在扩展 JPanel 的名为 PlayerCharacter 的 class 中。当您创建许多面板时,您会用完垂直 space 并且不会自动创建滚动条。我的问题是如何添加滚动条。我尝试制作一个 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();
}
}
});
}
});
}
}
I don't mind sharing the project but I am not sure how safe that is
我们从不想看到你的整个应用程序。这是太多的代码看。相反,我们希望看到一个 SSCCE 这是简化的代码,它演示了您正在尝试做的事情的 "concept"。
SSCCE 应该包含在您的所有问题中。 posting 4 行代码很少会为我们提供帮助解决您的问题所需的信息。 SSCCE 的另一个好处是,您通常会在尝试创建 SSCCE 时发现问题,因为在 20 行代码中发现问题比调试 200 行代码更容易。
contentPanel.add(newPlayerCharacter);
panel.validate();
panel.repaint();
正常代码应该是:
contentPanel.add(newPlayerCharacter);
contentPanel.revalidate(); // note the "re"
contentPanel.repaint();
如果这没有帮助,那么 post 在问题中使用适当的 SSCCE。
编辑:
不要使用空布局(和 setBounds())!!!
Swing 旨在与布局管理器一起使用。我不知道您的实际布局是什么,所以我只是将您指向 Layout Managers 上的 Swing 教程以获取更多信息和工作示例。
当添加到滚动窗格视口的组件的首选大小大于滚动窗格的大小时,滚动条将自动出现。布局管理器负责确定首选尺寸。由于您使用的是空布局,因此首选大小为 (0, 0),因此没有理由显示滚动条。