我试图在一个内部面板中添加滚动窗格,滚动条显示在内部面板中,但是当我添加标签和文本字段时,组件被添加了,但是滚动条不工作。
public class AddNewProject extends JFrame {
private JButton btnNewButton;
private JSpinner spinner;
private JScrollPane scrollPane;
private JPanel panel_1;
public AddNewProject() {
getContentPane().setLayout(null);
JPanel panel = new JPanel();
panel.setBackground(Color.PINK);
panel.setBounds(134, 37, 583, 610);
getContentPane().add(panel);
panel.setLayout(null);
spinner = new JSpinner();
spinner.setModel(new SpinnerNumberModel(0, 0, 30, 1));
spinner.setBounds(63, 51, 164, 31);
panel.add(spinner);
btnNewButton = new JButton("New button");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
int n=(int) spinner.getValue();
JLabel jlabel[]=new JLabel[n];
JTextField jtxt[]=new JTextField[n];
for(int i =0;i<n;i++)
{
jlabel[i]=new JLabel("Label "+(i+1));
jtxt[i]=new JTextField(32);
panel_1.add(jlabel[i]);
panel_1.add(jtxt[i]);
}
panel_1.validate();
panel_1.repaint();
}
});
btnNewButton.setBounds(336, 54, 149, 28);
panel.add(btnNewButton);
scrollPane = new JScrollPane();
scrollPane.setBounds(69, 141, 434, 298);
panel.add(scrollPane);
panel_1 = new JPanel();
scrollPane.setViewportView(panel_1);
scrollPane.setPreferredSize(new Dimension(434,300));
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
setSize(900,800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new AddNewProject();
}
}
上述程序的输出
这是我程序的输出图像。
2条答案
按热度按时间yzckvree1#
您需要重新验证jscrollpane本身,以便它重新布局其视口和视图,使其工作。但是您还需要设置内部jpanel的布局,以允许显示一个事物网格,从而使其正常工作,例如通过给它一个
new GridLayout(0, 1) // one column, variable # of rows
.例如。,
ulydmbyx2#
问题是到处都使用空布局。仅当添加到视口的组件的首选大小大于视口的大小时,才会显示滚动条。首选大小仅在使用布局管理器时动态计算。所以解决方案是使用布局管理器。
对于代码的最基本更改,您可以:
删除所有setbounds()语句
删除所有setlayout(null)语句
然后可以开始使用布局管理器。
首先为顶部创建面板:
然后将滚动窗格添加到框架:
现在您需要使用:
revalidate()调用布局管理器,以便计算新的首选大小。
在您的示例中,水平滚动条将出现,因为默认情况下jpanel使用
FlowLayout
在单行上显示组件。如果要垂直添加组件,则需要在“面板1”上使用不同的布局管理器。
有关更多信息和示例,请阅读swing教程中有关布局管理器的部分。