2010-06-22 22 views
0

我有几个JSpinners,它们是从10开始的数值,可以递增到99.如何知道JSpinner上的递增/递减是否被按下?

在我的程序中,用户有15点可以平均分散6个技能。每个JSpinner都有一个EventListener来检测它是否被按下,但更具体地说,我需要知道哪个按钮被按下,所以我知道要采取哪种操作。他们不希望从强度中减去一点,并将总分减1,而如果按下减数,则应该加1。

执行此操作的最佳方法是什么?

(另外我使用NetBeans因此该方案的一个位被自动生成的。)

回答

1

想必你是某处ChangeListener的内线stateChanged方法 - 看看ChangeEvent#getSource()


好,你的编辑让我原来的回答毫无意义。

会创建自己的SpinnerModel是一个可行的选择吗?

+0

我已经有了一个SpinnerModel用于定义默认的每个JSpinner t值,增量等。 – Kitsune 2010-06-22 05:49:52

+0

你看过重写'getNextValue'和'getPreviousValue'方法吗? – 2010-06-22 05:56:31

+0

不,这不会让我去我需要的地方。 – Kitsune 2010-06-22 06:10:21

-1

我遇到同样的问题,这是我如何解决了我的行动方案的执行情况:

首先我收集所有箭头按钮

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);