我有一个JFrame,我添加了一个自定义JPanel类。 JPanel类有两个成员变量,另一个是JPanel和一个JScrollPane。
我使用子JPanel构造JScrollPane,然后我尝试将JScrollPane添加到父JPanel,希望我有一个可滚动的自定义JPanel。
我的所有组件前面都有一条很细的白线,它们没有滚动。有什么想法吗?
public class CreateGamePanel extends JPanel
{
private JLabel pwLabel;
private JTextField password;
private JScrollPane jsp;
private JPanel area;
public CreateGamePanel()
{
area = new JPanel();
area.setLayout(new BoxLayout(area,BoxLayout.Y_AXIS));
jsp = new JScrollPane(area);
pwLabel = new JLabel("Password");
password = new JTextField();
for(int i=0;i<20;i++)
{
area.add(new JButton("Hello"));
}
area.add(pwLabel);
area.add(password);
add(jsp);
}
public static void main(String[] args)
{
JFrame f = new JFrame();
CreateGamePanel cp = new CreateGamePanel();
f.add(cp);
f.setSize(500,500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
答案 0 :(得分:1)
JScrollPane中滚动条的默认策略是仅在子组件的大小不适合窗格内时显示。您的代码中发生的事情是JScrollPane的父级是游戏面板,并且会自动调整大小以包含整个JScrollPane及其子级,而不是被强制适应JFrame中的可用空间。要做到这一点,您只需要更具体地设置布局。
尝试此代码,例如:
public class CreateGamePanel extends JPanel {
private JLabel pwLabel;
private JTextField password;
private JScrollPane jsp;
private JPanel area;
public CreateGamePanel()
{
area = new JPanel();
area.setLayout(new BoxLayout(area,BoxLayout.Y_AXIS));
jsp = new JScrollPane(area);
pwLabel = new JLabel("Password");
password = new JTextField();
for(int i=0;i<20;i++)
{
area.add(new JButton("Hello"));
}
area.add(pwLabel);
area.add(password);
setLayout(new BorderLayout()); // Change default LinearLayout to BorderLayout
add(jsp, BorderLayout.CENTER); // Add child to the central area of BorderLayout
}
public static void main(String[] args)
{
JFrame f = new JFrame();
CreateGamePanel cp = new CreateGamePanel();
f.add(cp, BorderLayout.CENTER); // Make sure the game panel will be resized to fit frame
f.setSize(500,500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
这里的诀窍是BorderLayout的BorderLayout.CENTER部分中的内容被调整大小以适合父级中的可用空间。