我怎样才能拥有一组具有最大总值的 JSpinner 对象?
How can I have a group of JSpinner objects with a maximum total value?
我正在设计一个程序,其中有一组 JSpinner 对象,我需要确保所有对象的总数永远不会超过指定值。有没有 built-in 方法可以做到这一点,还是我需要自己动手?
举例来说,这是当前界面:
我想确保更改 JSpinner 会更新顶部的剩余部分,但不允许它低于 0。
据我所知,ChangeListener 仅在更改后通知,无法阻止更改。
我相信有更好的方法来做到这一点,但这里有一些非常基本的东西可以给你一些想法。
您只能将微调器的总值增加到 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();
}
});
*/
}
}
基本上,代码覆盖了 SpinnerModel 的 getNextValue()
方法来确定您是否处于最大值。该值仅在您低于组最大值时更新。
我正在设计一个程序,其中有一组 JSpinner 对象,我需要确保所有对象的总数永远不会超过指定值。有没有 built-in 方法可以做到这一点,还是我需要自己动手?
举例来说,这是当前界面:
我想确保更改 JSpinner 会更新顶部的剩余部分,但不允许它低于 0。
据我所知,ChangeListener 仅在更改后通知,无法阻止更改。
我相信有更好的方法来做到这一点,但这里有一些非常基本的东西可以给你一些想法。
您只能将微调器的总值增加到 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();
}
});
*/
}
}
基本上,代码覆盖了 SpinnerModel 的 getNextValue()
方法来确定您是否处于最大值。该值仅在您低于组最大值时更新。