Флажки Java качели - PullRequest
       0

Флажки Java качели

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

Есть ли в Java простой способ разрешить проверку только 3 из 10 флажков одновременно?Затем сохраните значения, которые проверены в массиве.

Спасибо

Ответы [ 4 ]

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

Добавьте слушателя к каждому из флажков. Держите текущий список отмеченных флажков.

Если флажок установлен, добавить его в конец списка.

Если флажок снят, удалите его из списка.

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

0 голосов
/ 07 апреля 2011

К сожалению, нет ничего такого бесплатно.Технически даже реализовать это было бы не так просто.Хотя мысль звучит круто, я могу создать этот компонент завтра.

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

MaxToggleController (List toggleButtons, int maxToSelect)

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



import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;

/**
 * Controller of toggle button selection. User can specify a maximum 
 * allowed number of toggle buttons that can be selected at a particular time.
 * The controller will make sure that up to the defined maximum number 
 * of buttons can be selected.
 * @author Konrad Borowiecki
 */
public class MaxToggleController
{
    /** List of toggle buttons to control. */
    private List<JToggleButton> toggleButtons;
    /** The maximum number of toggle buttons that can be selected at once. */
    private int maxToSelect;
    /** The number of toggle buttons that is currently selected. */
    private int currentlySelected = 0;

    public MaxToggleController(List<JToggleButton> toggleButtons, int maxToSelect)
    {
        this.toggleButtons = toggleButtons;
        this.maxToSelect = maxToSelect;
        //install the action listener on each toggle button
        for(JToggleButton tB : toggleButtons)
            tB.addActionListener(toggleButtonAL);
    }
    private ActionListener toggleButtonAL = new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            JToggleButton tB = (JToggleButton) e.getSource();
            System.out.println("actionPerformed toggleButtonAL; tB.getText()=" + tB.getText()
                    + "; tB.isSelected()=" + tB.isSelected());
            //if user deselects it then allow for it
            if(!tB.isSelected())
            {
                currentlySelected--;
                tB.setSelected(false);//can be removed
            }
            else//user tries to select it
            {
                //if max reached do not allow for the tB selection
                if(currentlySelected == maxToSelect)
                {
                    //must be deselected as it is already selected
                    tB.setSelected(false);
                }
                else
                {
                    currentlySelected++;
                    tB.setSelected(true);//can be removed
                }
            }
            String textsSeparator = ", ";
            String toggleButtonTexts = "{";
            for(JToggleButton toggleB : getSelectedToggleButtons())
                toggleButtonTexts += toggleB.getText() + textsSeparator;
            int idx = toggleButtonTexts.lastIndexOf(textsSeparator);
            if(idx != -1)
                toggleButtonTexts = toggleButtonTexts.substring(0, idx)
                        + toggleButtonTexts.substring(idx + textsSeparator.length(), toggleButtonTexts.length());
            toggleButtonTexts += "}";
            System.out.println("actionPerformed toggleButtonAL; currentlySelected="
                    + currentlySelected + "; getSelectedToggleButtons().size()=" + getSelectedToggleButtons().size()
                    + "\n         ; toggleButtonTexts=" + toggleButtonTexts);
        }
    };

    public List<JToggleButton> getSelectedToggleButtons()
    {
        List<JToggleButton> selectedToggleButtons = new ArrayList();
        for(JToggleButton tB : toggleButtons)
            if(tB.isSelected())
                selectedToggleButtons.add(tB);
        return selectedToggleButtons;
    }

    public static void main(String[] args)
    {
        List<JToggleButton> tBs = new ArrayList<JToggleButton>();
        int noOfTBs = 10;
        JPanel contentPane = new JPanel();
        for(int i = 0; i < noOfTBs; i++)
        {
            JToggleButton tB = new JToggleButton("Toggle " + i);
            tBs.add(tB);
            contentPane.add(tB);
        }
        int maxToSelect = 3;
        MaxToggleController tC = new MaxToggleController(tBs, maxToSelect);

        JFrame f = new JFrame();
        f.setContentPane(contentPane);
        f.setSize(400, 400);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}

У меня было свободное время, поэтому я реализовал свой собственный контроллер.Осталось много отладочного кода, который позволит вам наблюдать за тем, что там происходит, когда вы его запускаете.Имейте в виду, что это не идеально.Это быстрый набросок, и здесь есть некоторые очевидные проблемы, например, программный вызов setSelected пользователем для кнопки переключения.

Ниже приведена обновленная версия моего контроллера, которая обрабатывает настройку выбора JToggleButton, даже если это сделано вкод.


import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;

/**
 * Controller of toggle button selection. User can specify a maximum 
 * allowed number of toggle buttons that can be selected at a particular time.
 * The controller will make sure that up to the defined maximum number 
 * of buttons can be selected.
 * @author Konrad Borowiecki
 */
public class MaxToggleController
{
    /** List of toggle buttons to control. */
    private List<JToggleButton> toggleButtons;
    /** The maximum number of toggle buttons that can be selected at once. */
    private int maxToSelect;
    /** The list with the buttons which are currently selected. */
    private  List<JToggleButton> selectedToggleButtons;

    public MaxToggleController(List<JToggleButton> toggleButtons, int maxToSelect)
    {
        this.toggleButtons = toggleButtons;
        this.maxToSelect = maxToSelect;
        this.selectedToggleButtons = new ArrayList<JToggleButton> ();        
        //install the action listener on each toggle button
        for(JToggleButton tB : toggleButtons)
            tB.addItemListener(itemListener);
    }

    private ItemListener itemListener = new ItemListener()
    {
        @Override
        public void itemStateChanged(ItemEvent e)
        {
            JToggleButton tB = (JToggleButton) e.getSource();
            System.out.println("itemStateChanged; tB.getText()=" + tB.getText()
                    + "; tB.isSelected()=" + tB.isSelected());
            //if the tB is inside the selected toggle button list then remove it from there
            if(isInSelected(tB))
            {
                selectedToggleButtons.remove(tB);
                //set false only if it is already true 
                if(tB.isSelected())
                    tB.setSelected(false);
            }
            else//otherwise add it if the size is not max
            {
                if(selectedToggleButtons.size() == maxToSelect)
                {               
                    //set false only if it is already true 
                    if(tB.isSelected())
                        tB.setSelected(false);//deselect the tB if the list has maximum size
                }
                else
                {
                    selectedToggleButtons.add(tB);
                }
            }
            String textsSeparator = ", ";
            String toggleButtonTexts = "{";
            for(JToggleButton toggleB : getSelectedToggleButtons())
                toggleButtonTexts += toggleB.getText() + textsSeparator;
            int idx = toggleButtonTexts.lastIndexOf(textsSeparator);
            if(idx != -1)
                toggleButtonTexts = toggleButtonTexts.substring(0, idx)
                        + toggleButtonTexts.substring(idx + textsSeparator.length(), toggleButtonTexts.length());
            toggleButtonTexts += "}";
            System.out.println("; selectedToggleButtons.size()=" + selectedToggleButtons.size()
                    + "; toggleButtonTexts=" + toggleButtonTexts);
        }

    };

    private boolean isInSelected(JToggleButton tB)
    {
        return selectedToggleButtons.contains(tB);
    }

    public List<JToggleButton> getSelectedToggleButtons()
    {
        return selectedToggleButtons;
    }

    public static void main(String[] args)
    {
        List<JToggleButton> tBs = new ArrayList<JToggleButton>();
        int noOfTBs = 10;
        JPanel contentPane = new JPanel();
        for(int i = 0; i < noOfTBs; i++)
        {
            JToggleButton tB = new //JCheckBox("Check "+i);
                    JToggleButton("Toggle " + i);
            tBs.add(tB);
            contentPane.add(tB);
        }
        int maxToSelect = 3;
        MaxToggleController tC = new MaxToggleController(tBs, maxToSelect);

        tBs.get(0).setSelected(true);
        tBs.get(5).setSelected(true);       
        tBs.get(6).setSelected(true);
        //the Toggle 7 will not be selected
        tBs.get(7).setSelected(true);

        JFrame f = new JFrame();
        f.setContentPane(contentPane);
        f.setSize(400, 400);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}

Наслаждайся, Боро.

0 голосов
/ 07 апреля 2011

Я не верю, что для этого есть что-то встроенное. Но сохраняя простой

 Set<JComponent> 

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

0 голосов
/ 07 апреля 2011

Нет. Вы должны сделать это вручную. Например, если помечены 3 поля, вы можете установить другие поля на

 box[i].setEditable (false);

, поэтому пользователь должен сначала отключить помеченное поле.

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