полоса прокрутки не отображается в JList

Я использую GridBagLayout и имею JList своего пользовательского класса. Сам JList отображается так, как я ожидаю, но полоса прокрутки не появляется. (Мой размер данных также больше, чем размер моего JList.) Я проверил много связанных ссылок, и все они упомянули эти 2 строки, чтобы сделать это, но у меня это не сработало.

JScrollPane scrollPane = new JScrollPane(list); 

add(scrollPane);

Полный код:

import java.awt.Button;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Label;
import javax.swing.*;

public class UserPart extends JFrame {
    Label messageL = new Label("Confirm an item for more options.");
    Button confirmB = new Button("Confirm");
    Button backB = new Button("Back");
    DefaultListModel<User2> model;
    public UserPart() {

        JList<User2> list = new JList<User2>();
        model = new DefaultListModel<User2>();
        for (int i = 0; i < MainActivity2.arr.size(); i++) {
            User2 u = new User2();
            u.setForShow(i);
            model.addElement(u);
        }
        // SETTING THE APPEARANCE OF THE JLIST
        list.setModel(model);
        list.setCellRenderer(new MyListCellRenderer());
        list.setLayoutOrientation(JList.VERTICAL);
        list.setPreferredSize(new Dimension(500, 750));
        //////////////////////////////////////////////    
        GridBagLayout grid = new GridBagLayout();
        GridBagConstraints gbc = new GridBagConstraints();
        setLayout(grid);
        setTitle("List of users");
        GridBagLayout layout = new GridBagLayout();
        this.setLayout(layout);

        gbc.gridx = 0;
        gbc.gridy = 0;
        this.add(messageL, gbc);

        gbc.gridx = 0;
        gbc.gridy = 1;
        this.add(list, gbc); //ADDED JLIST TO LAYOUT HERE
        JScrollPane scrollPane = new JScrollPane(list); // DEFINED SCROLL BAR HERE
        add(scrollPane); // ADDED SCROLL BAR TO LAYOUT HERE
        setSize(1000, 1500);
        setPreferredSize(getSize());
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

person ArashV    schedule 02.03.2020    source источник
comment
Вам не нужно добавлять список отдельно. Вы должны заключить его в JScrollPane, а затем добавить scrollPane. Попробуйте this.add(new JScrollPane(list), gbc); вместо this.add(list, gbc);   -  person tgallei    schedule 02.03.2020
comment
Если вы действительно хотите добавить scrollPane в контейнер, у него также должны быть ограничения. Также лучше задавать вопросы с Еда, готовая к употреблению stackoverflow.com/help/minimal-reproducible -пример   -  person Tom Hawtin - tackline    schedule 02.03.2020
comment
Все еще не работает. @tgallei   -  person ArashV    schedule 02.03.2020


Ответы (1)


Установите вес ограничений (weightx, weighty) на значение больше нуля — чтобы использовать весь макет — также установите fill на BOTH. Не добавляйте список непосредственно во фрейм, просто добавьте область прокрутки с ограничениями, установленными, как описано выше. Не смешивайте компоненты AWT (Label) с компонентами Swing, вместо этого используйте JLabel. Вот резюме:

JLabel label = new JLabel("Confirm an item for more options.");

JScrollPane scroll = new JScrollPane(list);

GridBagConstraints gbc = new GridBagConstraints();

JFrame frame = new JFrame();
frame.setLayout(new GridBagLayout());
gbc.gridx = 0;
gbc.gridy = 0;
frame.add(label, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
frame.add(scroll, gbc);
person user85421    schedule 02.03.2020