Как мне узнать, нажата ли кнопка увеличения / уменьшения на JSpinner? - PullRequest
0 голосов
/ 22 июня 2010

У меня есть несколько JSpinners, и они представляют собой числовые значения, начинающиеся с 10, и могут увеличиваться до 99.

В моей программе пользователь имеет 15 баллов, которые можно равномерно распределить по 6 навыкам. У каждого JSpinner есть EventListener, чтобы определять, нажата ли она, но более конкретно мне нужно знать, какая кнопка была нажата, чтобы я знал, какое действие предпринять. Они не хотят брать точку силы и уменьшать общее количество очков на 1; вместо этого, если нажать кнопку «Уменьшение», следует добавить 1.

Каков наилучший способ выполнить это?

(Также я использую NetBeans, поэтому часть программы генерируется автоматически.)

Ответы [ 2 ]

1 голос
/ 22 июня 2010

Предположительно, вы находитесь где-то внутри ChangeListener stateChanged метода - взгляните на ChangeEvent # getSource ()


Хорошо, ваше изменение сделало мой оригиналответить довольно бессмысленно.

Был бы жизнеспособным вариант создания собственного SpinnerModel?

0 голосов
/ 10 июля 2010

Я столкнулся с той же проблемой, вот как я решил реализацию для моего сценария действий:

Сначала я соберу все кнопки со стрелками :

private static HashMap<String, BasicArrowButton> getSpinnerButtons(JSpinner spinner, String[] arrowNames) {
    final Stack<String> arrows = new Stack<String>();
    arrows.addAll( Arrays.asList( arrowNames ) );
    final HashMap<String, BasicArrowButton> buttons = new HashMap<String, BasicArrowButton>();
    while (buttons.size()<2) {
        for (final Component c : spinner.getComponents()) {
            if (c instanceof BasicArrowButton) {
                final BasicArrowButton bab = (BasicArrowButton)c;
                for (final String sName : arrows) {
                    if (sName.equals(bab.getName())&&!buttons.containsKey(sName)) {
                        buttons.put(sName,bab);
                        break;
                    }
                }
            }
        }
    }
    return buttons;
}

Затем я присоединяю слушателя :

    final String KEY_PROP = ".DIRECTION";
    final String BS = spinner.getName(), BN="Spinner.nextButton", BP="Spinner.previousButton";
    final String BSKEY = BS+KEY_PROP, BNKEY = BN+KEY_PROP, BPKEY = BP+KEY_PROP;

    final HashMap<String, BasicArrowButton> buttons = getSpinnerButtons(spinner, new String[]{BN,BP});

    spinner.putClientProperty( BSKEY, 1000);
    spinner.putClientProperty( BNKEY, buttons.get(BN).getDirection()*+10000);
    spinner.putClientProperty( BPKEY, buttons.get(BP).getDirection()*-10000);

    final PropertyChangeListener pcl = new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            final JSpinner spinnerRef = ((JSpinner)evt.getSource());
            final String pName = evt.getPropertyName();
            final short swing = Short.parseShort( String.valueOf(evt.getOldValue()) );
            final short val = Short.parseShort( String.valueOf(evt.getNewValue()) );
            if (Math.abs(swing)<2D)
                System.out.printf("This is a DIRECTION CHANGE\nOld Direction=%s;\nNew Direction=%s;\nProp Value: %s", swing, val, spinnerRef.getClientProperty(pName) ).println();
            else //arrows
                System.out.printf("This is the CURRENT DIRECTION\nArrow=%s;\nDirection=%s;\nProp Value: %s", swing, val, spinnerRef.getClientProperty(pName) ).println();

            System.out.println("==============");
        }
    };

    spinner.addPropertyChangeListener(BSKEY, pcl);
    spinner.addPropertyChangeListener(BNKEY, pcl);
    spinner.addPropertyChangeListener(BPKEY, pcl);

    final ActionListener spinnerActions = new ActionListener() {
        private short oldDir=0;
        @Override
        public void actionPerformed(ActionEvent e) {
            final BasicArrowButton bab = ((BasicArrowButton)e.getSource()); 
            final short swingDir = (short)bab.getDirection();
            final short newDir = (swingDir!=SwingConstants.NORTH&&swingDir!=SwingConstants.WEST) ? Integer.valueOf(-1).shortValue() : Integer.valueOf(+1).shortValue();
            bab.getParent().firePropertyChange(bab.getName()+KEY_PROP, swingDir*1000, newDir);
            bab.getParent().firePropertyChange(bab.getParent().getName()+KEY_PROP, oldDir, newDir);
            this.oldDir=newDir;
        }
    };
    buttons.get(BP).addActionListener(spinnerActions);
    buttons.get(BN).addActionListener(spinnerActions);
...