Включение кнопки путем установки всех необходимых флажков

1

Я пытаюсь создать программу, в которой JButton будет включен, только если все JCheckBoxes будут проверены, но у меня возникла проблема с включением конкретного JButton потому что, как только я проверил все JCheckBoxes единственным включенным JButton является последний созданный

Вот мой код:

public class Practice extends JFrame implements ActionListener
{
    JPanel main=new JPanel();
    JPanel gui=new JPanel();
    JButton btnadd=new JButton("Add Timer");
    JPanel order=new JPanel();
    JPanel chkPanel=new JPanel();
    JButton remove=new JButton("Remove");

    public Practice()
    {

        main.setLayout(new BorderLayout());
        gui.setLayout(new FlowLayout());
        main.add(btnadd, BorderLayout.NORTH);
        main.add(gui,BorderLayout.CENTER);
        add(main);
        btnadd.addActionListener(new ActionListener() 
        {
            int ctr=0;
            @Override
            public void actionPerformed(ActionEvent e) 
            {
                ctr+=1;
                //addPanel();
                //System.out.print(x);
                addPanel(ctr);
                revalidate();
                repaint();
            }
        });

        main.add(gui);
    }


    public void addPanel(int ctr)
    {
        Border blackline=BorderFactory.createLineBorder(Color.BLACK);
        order=new JPanel();
        order.setPreferredSize(new Dimension(200,300));
        order.setLayout(new BorderLayout());
        TitledBorder title=BorderFactory.createTitledBorder(blackline);
        title.setTitleJustification(TitledBorder.LEFT);
        order.setBorder(title);
        addCheckPanel(ctr);
        addBtn();
        gui.add(order);
    }

    public void addCheckPanel(int ctr)
    {
        chkPanel=new JPanel();
        chkPanel.setLayout(new BoxLayout(chkPanel, BoxLayout.Y_AXIS));
        for(int i=0;i<ctr;i++)
            addCheck(ctr);
        order.add(chkPanel);
    }
    int y;
    public void addCheck(int ctr)
    {
        JCheckBox check=new JCheckBox("Check Me");
        chkPanel.add(check);
        y=ctr;
        check.addActionListener(listener);

    public void addBtn()
    {
        remove=new JButton("Remove");
        order.add(remove, BorderLayout.SOUTH);
        remove.setEnabled(false);
        remove.addActionListener(listener);
    }

    public static void main(String args[])
    {
        TimerPractice p=new TimerPractice();
        p.setSize(1000,800);
        p.setVisible(true);
        p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        p.setLocationRelativeTo(null);
    }

    ActionListener listener=new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
             Object source = e.getSource();
             if (source instanceof Component) 
             {
                Component comp = (Component)source;
                gui.remove(comp.getParent());
                revalidate();
                repaint();
             }
         }
    };


    @Override
    public void actionPerformed(ActionEvent e) 
    {

    }
}
  • 0
    Разве мы не решили эту проблему? Изолируйте свою функциональность в единичных единицах работы, это называется инкапсуляцией ... вот почему вы в первую очередь используете язык OO, и я уверен, что я сказал это по крайней мере 3 раза ...
  • 0
    извините ... я не понимаю, что вы имеете в виду, изолируя мои функции
Показать ещё 4 комментария
Теги:
swing
jbutton
jcheckbox

1 ответ

2
Лучший ответ

Вам необходимо изолировать и отделить свои подразделения. Например, ваша панель order имеет элементы управления и функциональные возможности, которые лучше разделяются на собственный класс, где он может поддерживать свое собственное состояние независимо от других экземпляров самого себя, например...

Вы можете извлечь большую часть кода вашего основного класса и создать отдельный класс, например OrderPane...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;

public class OrderPane extends JPanel {

    private JPanel chkPanel;
    private int selectedCount = 0;
    private int checkCount = 0;

    private JButton removeButton;

    public OrderPane(int checkCount) {
        setLayout(new BorderLayout());

        Border blackline = BorderFactory.createLineBorder(Color.BLACK);
        TitledBorder title = BorderFactory.createTitledBorder(blackline);
        title.setTitleJustification(TitledBorder.LEFT);
        setBorder(title);

        this.checkCount = checkCount;

        addCheckPanel();
        addBtn();

    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 300);
    }

    public void addCheckPanel() {
        chkPanel = new JPanel();
        chkPanel.setLayout(new BoxLayout(chkPanel, BoxLayout.Y_AXIS));
        for (int i = 0; i < checkCount; i++) {
            addCheck();
        }
        add(chkPanel);
    }

    public void addCheck() {
        JCheckBox check = new JCheckBox("Check Me");
        chkPanel.add(check);
        check.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JCheckBox cb = (JCheckBox) e.getSource();
                if (cb.isSelected()) {
                    selectedCount++;
                } else {
                    selectedCount--;
                }
                if (selectedCount == checkCount) {
                    removeButton.setEnabled(true);
                }
            }
        });
    }

    public void addBtn() {
        removeButton = new JButton("Remove");
        add(removeButton, BorderLayout.SOUTH);
        removeButton.setEnabled(false);
        removeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Object source = e.getSource();
                if (source instanceof Component) {
                    Component comp = (Component) source;
                    Component myParent = comp.getParent();
                    Container yourParent = myParent.getParent();
                    yourParent.remove(myParent);
                    yourParent.revalidate();
                    yourParent.repaint();
                }
            }
        });
    }

}

При необходимости создайте новый экземпляр этого класса и добавьте его в свой UI по мере необходимости, например...

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Practice extends JFrame {

    JPanel main = new JPanel();
    JPanel gui = new JPanel();
    JButton btnadd = new JButton("Add Timer");

    public Practice() {

        main.setLayout(new BorderLayout());
        gui.setLayout(new FlowLayout());
        main.add(btnadd, BorderLayout.NORTH);
        main.add(gui, BorderLayout.CENTER);
        add(main);

        final Random rnd = new Random();
        btnadd.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                OrderPane orderPane = new OrderPane(rnd.nextInt(10));
                gui.add(orderPane);
                gui.revalidate();
                gui.repaint();
            }
        });

        main.add(gui);
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                Practice p = new Practice();
                p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                p.setSize(800, 600);
                p.setLocationRelativeTo(null);
                p.setVisible(true);
            }
        });
    }
}

Вы можете найти некоторую информацию из концепций объектно-ориентированного программирования и наследования и без обид, я бы понял эти темы, прежде чем решать что-то сложное, как пользовательский интерфейс;)

Боковые заметки

Как правило, я бы передал какой-то "контроллер" interface к OrderPane, который обеспечил бы функциональность для удаления компонента из основного пользовательского интерфейса и других функций, которые могут потребоваться OrderPane для обеспечения обратной связи.

Некоторая часть этой обратной связи может быть предоставлена с помощью шаблона наблюдателя/слушателя, например, когда таймер истечет, было бы лучше предоставить какое-то событие события зарегистрированным слушателям, а затем, возможно, вызвать метод на "контроллере" - IMHO

... но позволяет разобраться с одной концепцией за раз...

  • 0
    спасибо .. я постараюсь понять и практиковать это ...
  • 0
    Это очень важная концепция, найдите время, чтобы понять ее и использовать в своих интересах;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню