JRadioButtons в пользовательской панели JScrollPane не отображаются?

Я пишу графический интерфейс клиента IM для проекта. В левой части окна мне нужна панель прокрутки с переключателями для каждого активного пользователя, чтобы при нажатии кнопки «Новый чат» чат создавался с выбранным пользователем.

Я реализовал образец графического интерфейса с тремя заданными пользователями. Я создаю JRadioButton для каждого, устанавливаю ActionCommand и ActionListener, добавляю его в ButtonGroup, а затем добавляю его в this, который является классом, расширяющим JScrollPane. Однако, когда я запускаю код, я вижу только пустой фрейм с левой стороны без каких-либо кнопок. Кто-нибудь может объяснить? Соответствующий код ниже.

package gui;
import javax.swing.*;

public class ActiveList extends JScrollPane implements ActionListener {
    private ButtonGroup group;
    private String selected;

    public ActiveList() {
        //TODO: will eventually need access to Server's list of active usernames
        String[] usernames = {"User1", "User2", "User3"};
        ButtonGroup group = new ButtonGroup();
        this.group = group;

        for (String name: usernames) {
            JRadioButton button = new JRadioButton(name);
            button.setActionCommand(name);
            button.addActionListener(this);
            this.group.add(button);
            this.add(button);
        }
    }

    public String getSelected() {
        return this.selected;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        this.selected = e.getActionCommand(); 
        System.out.println(e.getActionCommand());
    }

}

Основной метод, который я запускаю, исходит из другого класса, ChatGUI.java. Контейнер ConversationsPane — это еще один класс в моем графическом интерфейсе, который работает правильно.

package gui;
import javax.swing.*;

public class ChatGUI extends JFrame {
    private ConversationsPane convos;
    private ActiveList users;

    public ChatGUI() {
        ConversationsPane convos = new ConversationsPane();
        this.convos = convos;
        ActiveList users = new ActiveList();
        this.users = users;

        GroupLayout layout = new GroupLayout(this.getContentPane()); 
        this.getContentPane().setLayout(layout);
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);

        layout.setHorizontalGroup(
            layout.createSequentialGroup()
                .addComponent(users, 100, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                .addComponent(convos)
         );

        layout.setVerticalGroup(
            layout.createParallelGroup()
                .addComponent(users)
                .addComponent(convos)
        );
    }

    public static void main(String[] args) {
        ChatGUI ui = new ChatGUI();
        ui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ui.setVisible(true);
        ui.setSize(800,400);
        ui.convos.newChat("Chat A");
    }
}

person user2048643    schedule 02.05.2013    source источник
comment
Я бы использовал JList с Icon вместо JRadioButton, тогда ListSelectionListner может реагировать на событие выбора в JList   -  person mKorbel    schedule 02.05.2013
comment
Что такое ConversationsPane? Ответьте в форме SSCCE.   -  person Andrew Thompson    schedule 02.05.2013


Ответы (2)


Это не то, как работают панели прокрутки. Вы не «добавляете» к ним компоненты. Вы установили компонент A в порт просмотра панелей прокрутки.

введите здесь описание изображения

Вместо расширения JScrollPane, поскольку вы не добавляете к нему значения, попробуйте сделать что-то вроде...

JScrollPane scrollPane = new JScrollPane();
JPanel view = new JPanel(new GridLayout(0, 1));
String[] usernames = {"User1", "User2", "User3"};
ButtonGroup group = new ButtonGroup();
this.group = group;

for (String name: usernames) {
    JRadioButton button = new JRadioButton(name);
    button.setActionCommand(name);
    button.addActionListener(this);
    this.group.add(button);
    view.add(button);
}

scrollPane.setViewportView(view);
// Add scrollpane to WEST position of main view

Вместо...

Дополнительные сведения см. в разделе Как использовать области прокрутки. ...

person MadProgrammer    schedule 02.05.2013
comment
Это имеет смысл! Я видел эту ссылку в гугле по моей проблеме перед публикацией, но не смог многого понять из нее, но то, как вы ее написали, делает ее более понятной. Попробую реализовать так! - person user2048643; 02.05.2013
comment
Оно работает! В итоге я заставил ActiveList расширить JPanel и стать представлением в вашем примере, затем создал JScrollPane и установил область просмотра в конструкторе ChatGUI. Большое спасибо! - person user2048643; 02.05.2013

Вместо того, чтобы расширять JScrollPane, расширяйте JPanel с правильным макетом. Добавьте себя JRadioButtons в панель и поместите панель в JScrollPane.

person StanislavL    schedule 02.05.2013