Я пытаюсь создать программу, в которой 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)
{
}
}
Вам необходимо изолировать и отделить свои подразделения. Например, ваша панель 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
... но позволяет разобраться с одной концепцией за раз...