Как включить/отключить кнопку вместо ее выбора? (группа кнопок)

У меня есть несколько кнопок (JButton), и я хочу отключить кнопку, которая «выбрана», поэтому, если вы нажмете другую кнопку, она станет отключенной, а все остальные — включенными. Это почти как ButtonGroup, но вместо «выбрать/отменить выбор» используется «включить/отключить».

Я не знаю, существует ли уже что-то для этого или какой подход лучше всего подходит.

  • Расширяет ButtonGroup и переопределяет все функции
  • Создайте собственный ButtonModel и ButtonGroup лайк
  • Добавьте ActionListener (то же самое) для каждой кнопки, которая отключает текущую кнопку и включает другие
  • ...

Я думаю, что "Extends ButtonGroup..." - лучший вариант, но я не уверен, поэтому и спрашиваю.

Как я могу получить ButtonGroup с помощью enable/disable ?

E.g :

Отключение первой кнопки: введите описание изображения здесь
и когда я нажимаю на второй: введите здесь описание изображения

NB: будет использоваться несколько раз для разных групп кнопок.


person Duffydake    schedule 28.08.2015    source источник


Ответы (2)


Держите все нужные кнопки в группе кнопок:

ButtonGroup buttonGroup  = new ButtonGroup();
buttonGroup.add(jbuttonA);
buttonGroup.add(jButtonB);
buttonGroup.add(jButtonC);

Затем вы можете просто проверить, выбрана ли ваша альтернативная кнопка, используя JButton#isSelected(), чтобы затем (отменить) выбор группы кнопок с помощью ButtonGroup#setSelected(ButtonModel,boolean).

Кроме того, вы можете сделать запрос при нажатии, используя прослушиватель анонимных действий; это требует, чтобы вы объявили свои внешние компоненты как final однако.

ЕСЛИ вы хотите отключить JButton, может быть достаточно просто использовать JButton#setVisible(boolean).

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

person Juxhin    schedule 28.08.2015
comment
Я не уверен, что понимаю вашу альтернативную кнопку. Все кнопки должны быть видны, даже отключенная, и она должна быть отключена, но не выбрана. Если вы нажмете на jButtonB, он станет отключенным, а JButton A и C включены, .... Всегда есть только один, который отключен. Итак, с вашим решением, если я правильно понимаю, оно не будет выбрано, но и не будет отключено. - person Duffydake; 28.08.2015
comment
@Duffydake - какова цель отключения кнопки? Разве вы не можете просто установить его видимость на false? Судя по вашему вопросу, все, что вы делаете, это меняете значок (и его цвет) после нажатия на них. Вы можете просто добавить флаг, чтобы проверить, включена ли кнопка в данный момент, и соответственно изменить значок. - person Juxhin; 29.08.2015
comment
@ Juxhin цель не имеет большого значения. Вы не можете знать, но я использую LAF, и когда что-то отключено, оно становится черно-белым, я не меняю никаких значков, ... на изображениях вопросов, я просто расширяю ButtonGroup и переопределяю все функции с помощью setEnable. - person Duffydake; 29.08.2015

Может быть, этот пример, который я сделал, может помочь.

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Example extends JFrame{

    private JButton b1 = new JButton("B1");
    private JButton b2 = new JButton("B2");

    private Listener listener = new Listener();

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

    public Example() {
        setSize(500,500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new FlowLayout());

        b1.addActionListener(listener);
        b2.addActionListener(listener);

        add(b1);
        add(b2);

        setVisible(true);
    }

    private class Listener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == b1) {
                //Somehow loop through all your JButton group
                //And change button.setIcon(), etc.. properties..
                b1.setEnabled(false);
                b2.setEnabled(true);
            }
            else if(e.getSource() == b2) {
                b2.setEnabled(false);
                b1.setEnabled(true);
            }

        }

    }
}
person Fran    schedule 28.08.2015
comment
Я ценю ваши усилия, может быть, мой вопрос не ясен, но мне не нужен код. Я знаю как минимум 3 способа, как это сделать (даже то, что вы предлагаете, что является самым основным), но я не уверен, что что-то еще существует, или если то, что я выбрал, хорошо, рассматриваемые изображения используют первый метод в моем вопросе (расширяет группу кнопок) - person Duffydake; 28.08.2015