Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/46: Рейтинг темы: голосов - 46, средняя оценка - 5.00
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925

JRadioButton, ButtonGroup - определить активный переключатель

28.02.2014, 18:06. Показов 9668. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!

Если я правильно понял, класс ButtonGroup не обладает методом, который позволяет определить какой из переключателей активный.

Хорстманн пишет:
Метод getActionCommand() позволяет определить текстовую строку, связанную с переключателем. Однако команда в модели этого переключателя снова представляет собой нулевую ссылку null. Только если программист явно задаст команды для каждого переключателя с помощью метода setActionCommand(), установив значение, соответствующее каждой команде, впоследствии можно, будет определить команду включенного переключателя с помощью метода buttonGroup.getselection().getActionComm and()
Я решил пойти немного другим путем:
Создал переменную в которой хранится id активного переключателя.
Создал листинер для каждого переключателя, который при событии будет присваивать переменной id переключателя с которым произошло событие.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class RadioPanel extends JPanel {
    public RadioPanel() {
        group = new ButtonGroup();
        addRadioButton("Маленький",true);
        addRadioButton("Средний", false);
        addRadioButton("Большой", false);
    }
 
    private void addRadioButton(String name, boolean active){
        final int count = countRadioButton;
        JRadioButton radioButton = new JRadioButton(name, active);
        radioButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                selection = count;
            }
        });
        group.add(radioButton);
        add(radioButton);
        countRadioButton++;
    }
 
 
    public int getSelection() {
        return selection;
    }
 
    private int selection;
    private int countRadioButton=0;
    private ButtonGroup group;
}
Под спойлером полный листинг программы.
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
 
public class Main {
    public static void main(String[] args) {
        NewFrame frame = new NewFrame();
        frame.setVisible(true);
    }
}
 
class NewFrame extends JFrame {
    NewFrame() {
 
        setTitle("Test");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());
        JButton button1 = new JButton("Нажми меня");
        final RadioPanel radioPanel = new RadioPanel();
        panel.add(radioPanel);
 
        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(radioPanel.getSelection());
            }
        });
 
        panel.add(button1);
       add(panel);
       pack();
 
    }
}
 
class RadioPanel extends JPanel {
    public RadioPanel() {
        group = new ButtonGroup();
        addRadioButton("Маленький",true);
        addRadioButton("Средний", false);
        addRadioButton("Большой", false);
    }
 
    private void addRadioButton(String name, boolean active){
        final int count = countRadioButton;
        JRadioButton radioButton = new JRadioButton(name, active);
        radioButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                selection = count;
            }
        });
        group.add(radioButton);
        add(radioButton);
        countRadioButton++;
    }
 
 
    public int getSelection() {
        return selection;
    }
 
    private int selection;
    private int countRadioButton=0;
    private ButtonGroup group;
}


Вопрос что более практично - использовать вариант с листинерами или перебирать методы isSelected() переключателей?
Или может быть есть более удачное решение?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.02.2014, 18:06
Ответы с готовыми решениями:

Ловим активный select и ставим, что он активный
есть select с двумя option.Задание - нужно сделать так чтобы по нажатию на один option с "ближайшее время "не чего не...

Access отчислить студента ( активный/ не активный )
Вот и добрались мы до истины, и заглохли....https://www.cyberforum.ru/ms-access/thread1706793.html Задача - Нужно отчислить студента:...

Определить активный ComboBox из нескольких
Здравствуйте. На форме имеется несколько комбобоксов, они в массиве, и в зависимости от того, какой активен программе надо выполнять...

4
46 / 36 / 15
Регистрация: 05.02.2014
Сообщений: 140
28.02.2014, 19:32
Я вообще ничего не кодил в Swing, так что все действия выполняйте на свой страх и риск=)

Расширяем класс ButtonGroup и добавляем туда метод getButtonText()
Java
1
2
3
abstract class  ButtonGroupWithGetText extends ButtonGroup {
    abstract String getButtonText();
}
Теперь group будет класса ButtonGroupWithGetText
Определяем метод getButtonText
В нем ищем первую кнопку с isSelected в коллекции (Java 8)
Java
1
2
3
4
5
group = new ButtonGroupWithGetText() {
            public String getButtonText() {
                return buttons.stream().filter(b -> b.isSelected()).findFirst().get().getText();
            }
        };
Выводим в консоль нажатую кнопку
Java
1
2
3
4
5
6
button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(radioPanel.group.getButtonText());
            }
        });
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
01.03.2014, 11:42  [ТС]
RomanovD, реализовать предложенный вами вариант для меня затруднений не составляет. Я пытаюсь разобраться в чем его плюсы или минусы перед моим вариантом.
0
46 / 36 / 15
Регистрация: 05.02.2014
Сообщений: 140
01.03.2014, 14:23
Ваш код сложнее, да и 3 слушателя как-то много для такого.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
03.03.2014, 01:51
Да, сложно как-то... Так проще, если надписи на радиокнопках не меняются:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package easybudda.changebackgroundcolor;
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class ChangeBackgroundColor {
    private JPanel panel;
    
    ChangeBackgroundColor() {
        panel = new JPanel();
        panel.setOpaque(true);
        panel.setPreferredSize(new Dimension(300, 200));
        panel.setBackground(Color.RED);
        
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                switch ( ((JRadioButton)ae.getSource()).getText() ) {
                case "Red" :
                    panel.setBackground(Color.RED);
                    break;
                case "Green" :
                    panel.setBackground(Color.GREEN);
                    break;
                case "Blue" :
                    panel.setBackground(Color.BLUE);
                    break;
                default:
                    break;
                }
                panel.repaint();
            }
        };
        
        JRadioButton redButton = new JRadioButton("Red");
        redButton.addActionListener(listener);
        redButton.setSelected(true);
        
        JRadioButton greenButton = new JRadioButton("Green");
        greenButton.addActionListener(listener);
        
        JRadioButton blueButton = new JRadioButton("Blue");
        blueButton.addActionListener(listener);
        
        ButtonGroup group = new ButtonGroup();
        group.add(redButton);
        group.add(greenButton);
        group.add(blueButton);
        
        Box box = Box.createVerticalBox();
        box.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        box.add(panel);
        box.add(redButton);
        box.add(greenButton);
        box.add(blueButton);
        
        JFrame frame = new JFrame("Background color");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(box);
        frame.pack();
        frame.setVisible(true);
    }
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ChangeBackgroundColor();
            }
        });
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.03.2014, 01:51
Помогаю со студенческими работами здесь

Как определить активный ToolStripButton
Всех здравствуйте ! Подскажите пожалуйста как определить какой ToolStripButton в данный момент выделен (подсвечен синим при наведении...

Определить активный датагрид из нескольких
Всем привет! У меня несколько датагридов около 5 штук и для всех одно и тоже контекстное меню. Но содержимое контекстного меню зависит от ...

ButtonGroup
Добрый день! С недавнего времени перешел на С++ Builder 6 с Delphi 7. В дельфях приходилось использовать компонент ButtonGroup...

ButtonGroup + Image
В общем не могу никак добавить в баттон группу картинку, все варианты уже перепробовал... и никак один из вариантов был...

Сбросить фокус с ButtonGroup
При нажатии на одну из кнопок происходит 1. Удаление всех имеющихся кнопок if GroupsButton.Items.Count>0 then for i := 0 to...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru