Динамические флажки в Java - PullRequest
1 голос
/ 22 апреля 2011

Я хочу динамически создавать флажки в Java, чтобы при каждом нажатии кнопки создавался и появлялся новый флажок, а при каждом нажатии другой кнопки все отмеченные флажки удалялись.Может кто-нибудь помочь с этим?

До сих пор у меня есть только флажки, созданные вручную

cb1=new JCheckBox("Task 1"); 
cb2=new JCheckBox("Task 2"); 
cb3=new JCheckBox("Task 3"); 
cb4=new JCheckBox("Task 4"); 
cb5=new JCheckBox("Task 5"); 
cb6=new JCheckBox("Task 6"); 

addTask= new JButton("Add Task"); 
removeTask= new JButton("Remove Checked"); 

addTask.addActionListener(this); 
removeTask.addActionListener(this);

Ответы [ 8 ]

3 голосов
/ 22 апреля 2011

Допустим, вместо cb1, cb2, cb3 и т. Д. Вы создаете ArrayList из JCheckBox es и создаете панель только для checkbox s, а не для кнопок. Теперь каждый раз, когда вы нажимаете кнопку add , вы создаете еще один флажок и добавляете его как на панель, так и на ArrayList. При нажатии кнопки удалить вы очищаете список массивов и панель. Следующий код является лишь примером фрагмента, а не полным протестированным кодом, но он должен дать вам направление.

// Up in your code
List<JCheckBox> cbarr = new ArrayList<JCheckBox>();
// The listener code
public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == addTask) // add checkbox
     {
          JCheckBox cb = new CheckBox("New CheckBox");
          cbarr.add(cb);
          cbpanel.add(cb);
     }
     else // remove checkboxs
     {
          cbarr = new ArrayList<JCheckBox>();
          cbpanel.removeAll()
     }
}

EDIT

Извините, но я пропустил ту часть, когда вы сказали, что хотите снять только отмеченные флажки. Это можно легко сделать, изменив код в блоке else:

for (int i = cbarr.size() - 1; i >=0; i--)
{
    JCheckBox cb = cbarr.get(i);
    if (cb.isSelected())
    {
        cbarr.remove(cb);
        cbpanel.remove(cb);
    }
}
2 голосов
/ 22 апреля 2011

// Это вам наверняка поможет!

    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;

    class tester {
      JButton remove;
      JButton appear;
      JCheckBox cb[]=new JCheckBox[10]; 


       tester() {
          buildGUI();
          hookUpEvents();
       }

       public void buildGUI() {
           JFrame fr=new JFrame();
           JPanel p=new JPanel();
           remove=new JButton("remove");
           appear=new JButton("appear");
             for(int i=0;i<10;i++) {
                cb[i]=new JCheckBox("checkbox:"+i);
                cb[i].setVisible(false);
             }
           fr.add(p);
           p.add(remove);
           p.add(appear);
           for(int i=0;i<10;i++) {
             p.add(cb[i]);
           }
           fr.setVisible(true);
           fr.setSize(400,400);
        }

        public void hookUpEvents() {
           remove.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                    for(int i=0;i<10;i++) {
                        cb[i].setVisible(false);
                     }
                 }
           });

           appear.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                   for(int i=0;i<10;i++) {
                      cb[i].setVisible(true);
                    }
                }
           });
         }

         public static void main(String args[]) {
             new tester();
         }
        }
2 голосов
/ 22 апреля 2011

Когда вы динамически добавляете / удаляете компоненты для графического интерфейса, вам необходимо сообщить диспетчеру компоновки, что были внесены изменения. Вы делаете это с кодом, подобным:

panel.add(....);
panel.revalidate();
panel.repaint();
2 голосов
/ 22 апреля 2011

Вам следует использовать менеджер макетов, например GridLayout , для которого можно указать динамические строки или столбцы, установив их в 0 в конструкторе макета.

В actionPerformedметод, который вы бы добавили на панель с новым флажком, используя метод JPanel.add (), подтвердите его после слов, и все готово.

Об удалении вы можете перебирать список компонентов панели и вызывать метод JPanel.remove (), впоследствии проверять панель.

Удачи, Боро.

2 голосов
/ 22 апреля 2011

Вместо создания новой переменной для каждого флажка.Храните ссылки на флажки в списке.При создании новых флажков добавьте их в список.Если вы хотите удалить их все, удалите их из графического интерфейса и очистите список.

1 голос
/ 22 апреля 2011

Все вышеперечисленные решения отлично .Одна альтернатива, хотя, если у вас есть значительный список флажков в столбце, рассмотрите вместо этого использование JTable, который имеет столбец флажков и, возможно, столбец в качестве «метки». Oracle Swing JTable покажет вам, как это сделать, но это просто вопрос расширения класса DefaultTableModel и переопределения его метода getColumnClass для возврата Boolean.class для столбца с флажками.Затем заполните модель булевыми объектами.Затем вы можете добавить или удалить строки из модели, и JTable позаботится о том, чтобы обрабатывать графические элементы графического интерфейса.Если вы хотите попробовать это таким образом, мы можем помочь вам со спецификой.

изменить 1:
Например:

изменить 2:
добавить / удалить показанные функции

edit 3:
Перемещены методы removeChecked и showAll в класс модели.

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

@SuppressWarnings("serial")
public class CheckBoxTable extends JPanel {
   public static final String[] COLUMNS = {"Purchased", "Item"};
   public static final String[] INITIAL_ITEMS = {"Milk", "Flour", "Rice", "Cooking Oil", "Vinegar"}; 
   private CheckBoxDefaultTableModel model = new CheckBoxDefaultTableModel(COLUMNS, 0);
   private JTable table = new JTable(model);
   private JTextField itemTextField = new JTextField("item", 10);

   public CheckBoxTable() {
      JButton addItemBtn = new JButton("Add Item");
      addItemBtn.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            addItemActionPerformed();
         }
      });
      JButton removeCheckedItemsBtn = new JButton("Remove Checked Items");
      removeCheckedItemsBtn.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            removeCheckedItemsActionPerformed();
         }
      });
      JButton showAllBtn = new JButton("Show All");
      showAllBtn.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            showAllActionPerformed();
         }
      });
      itemTextField.addFocusListener(new FocusAdapter() {
         public void focusGained(FocusEvent e) {
            itemTextField.selectAll();
         }
      });
      JPanel btnPanel = new JPanel(new GridLayout(1, 0, 5, 0));
      btnPanel.add(itemTextField);
      btnPanel.add(addItemBtn);
      btnPanel.add(removeCheckedItemsBtn);
      btnPanel.add(showAllBtn);

      setLayout(new BorderLayout(5, 5));
      add(new JScrollPane(table), BorderLayout.CENTER);
      add(btnPanel, BorderLayout.SOUTH);

      for (int i = 0; i < INITIAL_ITEMS.length; i++) {
         Object[] row = {Boolean.FALSE, INITIAL_ITEMS[i]};
         model.addRow(row);
      }
   }

   private void showAllActionPerformed() {
      model.showAll();
   }

   private void removeCheckedItemsActionPerformed() {
      model.removeCheckedItems();
   }

   private void addItemActionPerformed() {
      String item = itemTextField.getText().trim();
      if (!item.isEmpty()) {
         Object[] row = {Boolean.FALSE, item};
         model.addRow(row);
      }
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("CheckBoxTable");
      frame.getContentPane().add(new CheckBoxTable());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

@SuppressWarnings("serial")
class CheckBoxDefaultTableModel extends DefaultTableModel {
   private List<String> removedItemsList = new ArrayList<String>();

   public CheckBoxDefaultTableModel(Object[] columnNames, int rowCount) {
      super(columnNames, rowCount);
   }

   public void showAll() {
      if (removedItemsList.size() > 0) {
         Iterator<String> iterator = removedItemsList.iterator();
         while (iterator.hasNext()) {
            String next = iterator.next();
            Object[] row = {Boolean.TRUE, next};
            addRow(row);
            iterator.remove();
         }
      }
   }

   @Override
   public Class<?> getColumnClass(int columnNumber) {
      if (columnNumber == 0) {
         return Boolean.class;
      }
      return super.getColumnClass(columnNumber);
   }

   public void removeCheckedItems() {
      int rowCount = getRowCount();
      for (int row = rowCount - 1; row >= 0; row--) {
         if ((Boolean) getValueAt(row, 0)) {
            removedItemsList.add(getValueAt(row, 1).toString());
            removeRow(row);
         }
      }

   }
}
1 голос
/ 22 апреля 2011

Этот Пример вложенного макета имеет JButton слева до Add Another Label. Добавляет метки в столбцах по два. Тот же основной принцип может применяться для добавления любого числа JCheckBox.

Чтобы удалить их, вызовите Container.removeAll() и затем вызовите те же методы для обновления GUI.

0 голосов
/ 20 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...