我现在正在为一个学校的小项目工作,而且我对使用的JSpinners有一个很大的问题。我有三个JSpinners,它们的最大值是8,但是三个JSpinners的所有数字一起不能超过20.所以我们假设三个Spinners是A,B和C,并且我已经将A和B一直切换到8,那么C应该只能达到4.如果我将A切换回4,我可以将C全部切换到8,依此类推。问题是,我无法在JSpinner中找到任何支持此方法的方法。如果有人知道我能做到这一点,我会非常感激。Java Swing让JSpinner停止加起来
0
A
回答
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);
我希望,可以帮助!
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
的方法。然后将每个模型链接到其他模型以形成一个组。
基本上,代码覆盖SpinnerModel
的getNextValue()
方法,以确定您是否处于最大值。该值仅在您低于组最大值时更新。
只能提高纺纱为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();
}
});
*/
}
}
相关问题
- 1. Java Swing - JSpinner中的问题
- 2. 在java swing中禁用jspinner
- 3. Android等价于Java的Swing JSpinner
- 4. Java Swing看起来像Windows
- 5. 停止计时器在java Swing
- 6. 如何通过按下Java Swing按钮来停止线程?
- 7. 从JSpinner获取价值(SWING)
- 8. JavaFX相当于Swing的JSpinner?
- 9. 如何停止Swing EDT
- 10. JSpinner来源?
- 11. 防止jSpinner中的负值
- 12. 的Java Swing的JSpinner与NumberEditor显示空白,而不是零
- 13. 如何暂停Java Swing Timer?
- 14. 让JSpinner完全数字化
- 15. 让jQuery mousemove停止
- 16. 让ListView ItemCheck停止!
- 17. 停止旧会话列表对象加起来
- 18. JAVA Swing Gui窗口挂起
- 19. Java swing形式挂起
- 20. CPU模式在3-4回合后停止播放(JAVA SWING)
- 21. Java Swing 2D游戏 - 在CardLayout开关后EventQueue停止发射
- 22. Java Swing ActionListener不工作并停止构造函数
- 23. Java GUI/Swing,停止线程,在类之间传递整数
- 24. 当特定值达到时停止Java swing定时器
- 25. 为什么Swing应用程序会停止我的Java servlet?
- 26. 为什么java swing定时器自动停止?
- 27. 的Java Swing显示停止更新,直到X事件产生
- 28. 如何停止在java swing中执行的动作
- 29. Java Swing KeyBindings仅在Mac上停止工作
- 30. 让球停下来
哼哼,改变模型实例完美(则 - )选择有效的值,即使会失去先前的选择。 –
您可以将旧值添加为模型构造函数中的默认值。 – GAlexMES
谢谢你的回答。但是这不需要大量不同的模型吗?假设我将第一个A切换到7,B切换到7,那么C的最大值将是6.我必须为每个可能的组合编写一个模型,或者我错了吗? – Brainworm