2017-03-13 129 views
0

我现在正在为一个学校的小项目工作,而且我对使用的JSpinners有一个很大的问题。我有三个JSpinners,它们的最大值是8,但是三个JSpinners的所有数字一起不能超过20.所以我们假设三个Spinners是A,B和C,并且我已经将A和B一直切换到8,那么C应该只能达到4.如果我将A切换回4,我可以将C全部切换到8,依此类推。问题是,我无法在JSpinner中找到任何支持此方法的方法。如果有人知道我能做到这一点,我会非常感激。Java Swing让JSpinner停止加起来

回答

0

你可以这样创建一个JSpinnerModel:

SpinnerModel sm = new SpinnerNumberModel(0, 0, 8, 1); 
JSpinner spinner = new JSpinner(sm); 

你需要一个变化监听所有JSpinners。当你增加或减少一个微调器时,你增加/减少所有三个微调器的总和。您可以添加一个ChangeListener这样的:

aSpinner.addChangeListener(new ChangeListener(){ 
    @Override 
    public void stateChanged(ChangeEvent event) { 
    //count and update here 
    } 
}); 

然后你遍历JSpinners,并为他们每个人一个新的SpinnerModel,与新的最大值,并将其设置为JSpinner的。

例如: A:8,B:7,C:0。您现在正在增加B到8,那么你一共是16 您创建一个新的SpinnerModel,并把它添加到JSpinner的为C:

SpinnerModel sm = new SpinnerNumberModel(0, 0, 20-16, 1); 
cSpinner.setModel(sm); 

我希望,可以帮助!

+0

哼哼,改变模型实例完美(则 - )选择有效的值,即使会失去先前的选择。 –

+0

您可以将旧值添加为模型构造函数中的默认值。 – GAlexMES

+0

谢谢你的回答。但是这不需要大量不同的模型吗?假设我将第一个A切换到7,B切换到7,那么C的最大值将是6.我必须为每个可能的组合编写一个模型,或者我错了吗? – Brainworm

1

您可以继承JSpinner和覆盖getNextValue,做的情况下,接下来的值会太高,做其平常的东西(return super.getNextValue())无(return null),如果它不是。

JSpinner的每个上注册ChangeListener

当发生ChangeEvent时,只需重新计算当前总计。

下面是一个例子:

import java.awt.GridLayout; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSpinner; 
import javax.swing.SpinnerModel; 
import javax.swing.SpinnerNumberModel; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Spinners implements ChangeListener { 

    private int currentTotal = 15; 
    private final int maxTotal = 20; 
    private final JSpinner[] spins = new JSpinner[3]; 

    public Spinners() { 

     JFrame frame = new JFrame(); 
     JPanel content = new JPanel(new GridLayout(3, 1)); 

     for (int i = 0; i < 3; i++) { 

      SpinnerModel model = new SpinnerNumberModel(5, //initial value 
        1, //min 
        10, //max 
        1); //step 
      JSpinner spinner = new AutoBlockSpinner(); 
      spinner.setModel(model); 
      spinner.addChangeListener(this); 
      spins[i] = spinner; 
      content.add(spinner); 
     } 

     computeCurrentTotal(); 

     frame.setContentPane(content); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 

    } 

    private void computeCurrentTotal() { 

     currentTotal = 0; 

     for (JSpinner spin : spins) { 

      currentTotal += (Integer) spin.getModel().getValue(); 
     } 

    } 

    @Override 
    public void stateChanged(final ChangeEvent e) { 

     computeCurrentTotal(); 

    } 

    public static void main(final String[] args) { 

     Spinners spinners = new Spinners(); 

    } 

    class AutoBlockSpinner extends JSpinner { 

     @Override 
     public Object getNextValue() { 

      if (currentTotal + 1 <= maxTotal) { 
       return super.getNextValue(); 
      } else { 
       return null; 
      } 

     } 

    } 

} 
1

下面是创建一个自定义SpinnerModel的方法。然后将每个模型链接到其他模型以形成一个组。

基本上,代码覆盖SpinnerModelgetNextValue()方法,以确定您是否处于最大值。该值仅在您低于组最大值时更新。

只能提高纺纱为10,总价值:

import java.awt.*; 
import java.util.List; 
import java.util.ArrayList; 
import javax.swing.*; 

public class GroupSpinner 
{ 
    private int groupMaximum; 

    private List<GroupSpinnerNumberModel> models = new ArrayList<GroupSpinnerNumberModel>(); 

    public GroupSpinner(int maximum) 
    { 
     this.groupMaximum = maximum; 
    } 

    public SpinnerNumberModel createGroupModel(int value, int minimum, int maximum, int step) 
    { 
     GroupSpinnerNumberModel model = new GroupSpinnerNumberModel(value, minimum, maximum, step, this); 
     models.add(model); 

     return model; 
    } 

    public Object getNextValue(int currentValue, int step) 
    { 
     int maximum = getGroupValue() + step; 

     if (maximum > groupMaximum) 
     { 
      return currentValue; 
     } 
     else 
     { 
      groupValueUpdated(maximum); 
      int nextValue = currentValue + step; 
      return nextValue; 
     } 
    } 

    public int getGroupValue() 
    { 
     int maximum = 0; 

     for (GroupSpinnerNumberModel model: models) 
     { 
      maximum += model.getNumber().intValue(); 
     } 

     return maximum; 
    } 

    private void groupValueUpdated(int value) 
    { 
     System.out.println(value); 
    } 

    public class GroupSpinnerNumberModel extends SpinnerNumberModel 
    { 
     private GroupSpinner model; 

     public GroupSpinnerNumberModel(int value, int minimum, int maximum, int step, GroupSpinner model) 
     { 
      super(value, minimum, maximum, step); 

      this.model = model; 
     } 

     public Object getNextValue() 
     { 
      int currentValue = super.getNumber().intValue(); 
      int step = super.getStepSize().intValue(); 

      return model.getNextValue(currentValue, step); 
     } 
    } 

    private static void createAndShowGUI() 
    { 
     JPanel panel = new JPanel(new GridLayout(0, 1)); 

     GroupSpinner group = new GroupSpinner(10); 

     JSpinner number1 = new JSpinner(group.createGroupModel(0, 0, 10, 1)); 
     panel.add(number1); 
     panel.add(new JSpinner(group.createGroupModel(0, 0, 10, 1))); 
     panel.add(new JSpinner(group.createGroupModel(0, 0, 10, 1))); 
     panel.add(new JSpinner(group.createGroupModel(0, 0, 10, 1))); 

     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(() -> createAndShowGUI()); 
/* 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
*/ 
    } 

}