2016-10-24 1 views
0

Я разрабатываю программу, где у меня есть набор объектов JSpinner, и мне нужно убедиться, что общее количество всех объектов никогда не превышает заданное значение. Есть ли встроенный способ сделать это, или мне нужно катиться самостоятельно?Как я могу создать группу объектов JSpinner с максимальным общим значением?

В качестве примера, вот текущий интерфейс:

SM attribute interface

Я хочу, чтобы убедиться, что изменение JSpinner обновляет оставшиеся в верхней части, но не позволяет ему опуститься ниже 0.

Из-за того, что я могу видеть, ChangeListener уведомляет только после изменение, без возможности его остановить.

+0

Вы зашли в учебник JSpinner? Это точно говорит вам, как это сделать. Если вы Google: 'JSpinner tutorial', это самый первый хит. –

+0

Также API JSpinner и API для его числовой модели расскажут вам все, что вам нужно знать. Я откровенно немного удивлен, что вы, кажется, задали этот вопрос, прежде чем проверять эти стандартные ресурсы. Что дает? –

+1

Этот вопрос был первоначально закрыт как дубликат: http://stackoverflow.com/questions/15880844/how-to-limit-jspinner. Я не думаю, что это дубликат (так что я снова открыл вопрос), поскольку это только показывает, как ограничить отдельный счетчик. Этот вопрос связан с ограничением общего значения всех прядильщиков. – camickr

ответ

1

Я уверен, что есть лучший способ сделать это, но вот что-то действительно базовое, чтобы дать вам некоторые идеи.

Вы можете только увеличить счетчики на общую сумму 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(); 
      } 
     }); 
*/ 
    } 

} 

В основном код перекрывая getNextValue() метод SpinnerModel, чтобы определить, если вы на максимуме или нет. Значение обновляется только тогда, когда вы находитесь ниже максимального.

+0

Похож на хорошую базовую реализацию. Я начал исследовать 'VetoableChangeListener', но это выглядит более простым и элегантным. Только один вопрос: в чем разница между возвратом ** 'null' ** и значением' super.getValue() '? –

+0

@BenJaguarMarshall, не знаю, есть ли разница. Я обновил подход, чтобы добавить метод 'groupValueUpdated (...)'. Идея здесь в том, что всякий раз, когда изменяется значение, вы можете вызывать некоторый код. Может быть, вы перейдете на ярлык, и вы можете отобразить текущую сумму. Конечно, вам также потребуется реализовать логику getPreviousValue(). – camickr

Смежные вопросы