Полоса прокрутки не подстраивается под размеры JPanel, Java JScrollPane - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь получить полосу прокрутки для панели, которая будет содержать большое количество строк, но я застрял в этом.

Как вы можете видеть в моем окне (щелкните здесь, чтобы откройте изображение), полосы прокрутки не соответствуют размерам панели

Ниже вы можете увидеть код, с которым я работаю:

public class Config extends JFrame {

private static JPanel contentPane;
    private static JScrollPane paneSiteScroll;
    private static JPanel paneSite;
    private JTextField txtURL;
    private JButton btnAdd;
    private JLabel lblName;
    private JTextField txtName;
    private JPanel paneBar;

    /**
     * Launch the application.
     */
    public static void config() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Config frame = new Config(); 
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                } catch (Throwable e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     * @throws Throwable 
     */
    public Config() throws Throwable {          
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 800, 550);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        //Start top Add Bar
        paneBar = new JPanel();
        paneBar.setBounds(0, 0, 700, 35);
        contentPane.add(paneBar);
        paneBar.setLayout(null);
        
        JButton btnBack = new JButton("Back");
        btnBack.setBounds(1, 3, 65, 28);
        
        paneBar.add(btnBack);
        btnBack.setVerticalAlignment(SwingConstants.TOP);
        
        JLabel lblUrl = new JLabel("URL:");
        lblUrl.setBounds(80, 9, 35, 20);
        paneBar.add(lblUrl);
        
        txtURL = new JTextField();
        txtURL.setBounds(115, 5, 310, 26);
        paneBar.add(txtURL);
        txtURL.setColumns(10);
        
        lblName = new JLabel("Name:");
        lblName.setBounds(435, 9, 47, 20);
        paneBar.add(lblName);
        
        txtName = new JTextField();
        txtName.setBounds(480, 5, 155, 26);
        paneBar.add(txtName);
        txtName.setColumns(10);
        
        btnAdd = new JButton("Add");
        btnAdd.setBounds(635, 3, 61, 29);
        paneBar.add(btnAdd);
        //End top Add Bar

        //Start Scroll and Panel configuration
        paneSiteScroll = new JScrollPane();
        paneSite = new JPanel();

        paneSite.setLayout(null);
        paneSite.setBounds(10, 40, 400, 600);
        
        /*Testing different dimensions configuration*/
        paneSiteScroll.setSize(new Dimension(300, 300));
        paneSiteScroll.setBounds(10, 40, 300, 200);
        paneSiteScroll.setPreferredSize(new Dimension(400, 300));
        /*Testing different dimensions configuration*/
        
        paneSiteScroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        paneSiteScroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        
        paneSiteScroll.getViewport().add(paneSite);
        contentPane.add(paneSiteScroll);

        paneSiteScroll.setVisible(true);
        paneSite.setVisible(true);
        
        //End Scroll and Panel configuration
        try {
            Categories.categories(paneSite); //GET CATEGORIES
            
        } catch (Throwable e) {
            e.printStackTrace();
        }
        btnAdd.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (!txtURL.getText().isEmpty() || !txtName.getText().isEmpty()) {
                    InsertDB insert = new InsertDB();
                    try {
                        insert.insertDB("INSERT INTO sites (siUrl, siName) VALUES ('" + txtURL.getText() +"'"
                                + ", '" + txtName.getText() + "')",
                                conn);
                    } catch (Exception e1) {
                        e1.printStackTrace();
                    }
                }
                else {
                    JOptionPane.showMessageDialog(null, "URL or Name cannot be empty!");
                }
            }
        });
        btnBack.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //Back action button
                dispose();
            }
        });
    }
}

Это мой первый вопрос, я не знаю, что еще добавить, также я посетил много вопросов из переполнения стака с аналогичными проблемами, но я не мог понять это.

Заранее спасибо.

1 Ответ

0 голосов
/ 04 августа 2020

Наконец исправил это, я восстановил макет до нуля и добавил paneSite.setPreferredSize (new Dimension (600, 600)); после paneSite.setbounds. Это заставит его работать.

...