滚动条未出现在 java Swing 中

Scrollbars not appering in java Swing

在我的程序中,我向面板添加了一个标签、两个单选按钮、一个文本字段和提交按钮。我的单选按钮和提交按钮未以当前 window 大小显示,因为我已将它们的位置设置在 JFrame window 下方。但是 window 中没有出现滚动条。告诉我哪里错了。

这是我的代码

import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.*;
class SwingForm extends JFrame
{
    SwingForm()
    {
        super();
        Container c=getContentPane();
        c.setLayout(new BorderLayout());
        JPanel p=new JPanel();
        p.setLayout(null);
        JLabel l=new JLabel("First Name");
        l.setBounds(50, 50, 70, 20);
        JTextField j=new JTextField();
        j.setBounds(150, 50, 70, 20);
        JRadioButton j1=new JRadioButton("Male");
        j1.setBounds(50, 300, 70, 50);
        JRadioButton j2=new JRadioButton("Female");
        j2.setBounds(170, 300, 70, 50);
        JButton b=new JButton("Submit");
        b.setBounds(100, 600, 100, 100);
        ButtonGroup bg=new ButtonGroup();
        bg.add(j1);
        bg.add(j2);
        p.add(l);  
        p.add(j);
        p.add(j1);
        p.add(j2);
        p.add(b);
        int v=ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
        int h=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
        JScrollPane jp=new JScrollPane(p,v,h);
        c.add(jp,BorderLayout.CENTER);
        setVisible(true);
        setSize(300,300);
    }
    public static void main(String args[])
    {
        new SwingForm();
    }
}

这是输出

p.setLayout(null); 是您的(最重要的问题)。 JScrollPane 将依赖其视图的 preferredSize 来确定何时应显示滚动条。

让它工作的最好方法是使用一个或多个合适的布局管理器,让 API 完成它的工作

下面的示例实际上使用了 3 个布局管理器,BorderLayoutJFrame 的默认设置),FlowLayoutJPanel 的默认设置)和GridBagLayout

有关详细信息,请参阅 Layout out components in a container

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                JPanel p = new JPanel();
                p.setLayout(new GridBagLayout());

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridx = 0;
                gbc.gridy = 0;
                JLabel l = new JLabel("First Name");
                p.add(l, gbc);

                JTextField j = new JTextField(12);
                gbc.gridx++;
                p.add(j, gbc);

                gbc.gridx = 0;
                gbc.gridy++;
                gbc.gridwidth = GridBagConstraints.REMAINDER;

                JRadioButton j1 = new JRadioButton("Male");
                JRadioButton j2 = new JRadioButton("Female");
                ButtonGroup bg = new ButtonGroup();
                bg.add(j1);
                bg.add(j2);
                JPanel buttons = new JPanel();
                buttons.add(j1);
                buttons.add(j2);
                p.add(buttons, gbc);

                gbc.gridy++;
                gbc.insets = new Insets(100, 0, 0, 0);

                JButton b = new JButton("Submit");
                p.add(b, gbc);

                JScrollPane jp = new JScrollPane(p);
                frame.add(jp, BorderLayout.CENTER);
                //frame.pack();
                // This is just to force the point
                frame.setSize(250, 100);
                frame.setVisible(true);
            }
        });
    }

}