java - 如何才能拥有一组总值(value)最大的 JSpinner 对象?

标签 java swing jspinner

我正在设计一个程序,其中有一组 JSpinner 对象,并且我需要确保所有对象的总数永远不会超过指定值。有内置的方法可以做到这一点,还是我需要自己动手?

举例来说,这是当前界面:

SM attribute interface

我想确保更改 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() 方法来确定是否处于最大值。仅当您低于组最大值时,该值才会更新。

关于java - 如何才能拥有一组总值(value)最大的 JSpinner 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40228892/

相关文章:

java - jar 的认证(不包含小程序)

Java System.out.println 格式

java - 如何从 vcard 中获取电话号码

java - 卡片布局不工作

java - 使用 JSpinner stateChanged 方法更新 JOptionPane 中的消息

java - @Transactional spring JPA .save() 没有必要吗?

java - Jtree节点添加

Java swing 在鼠标拖放中绘制矩形

java - JSpinner 和双点或逗号作为分隔符

java - 如何从微调器中获取 int 值