【问题标题】:how to use ChangeListener for JSpinner?如何为 JSpinner 使用 ChangeListener?
【发布时间】:2017-05-23 10:06:25
【问题描述】:
private String[]fontsizelist = {"10","15","20"};
private SpinnerListModel spinmodel = new SpinnerListModel(fontsizelist);
private JSpinner fontsizeitem= new JSpinner(spinmodel);
//Constructor

some codes


         fontsizeitem.addChangeListener(new ChangeListener(){

        public void stateChanged(ChangeEvent e){
            for(int i=0;i<fontsizelist.length;i++){
                fontsizeitem [i]=new JSpinner(fontsizelist[i]);<-shows error 
            }
        }
    });

此代码向我显示一条错误消息

需要数组,但找到了 JSpinner

我知道问题出在哪里,但我不知道应该如何解决。

我使用的是字符串数组,因为整数数组不适用于

SpinnerNumberModel 和 SpinnerListModel。

JSpinner的状态是自动改变字体大小

改变了。在我的情况下我应该怎么做?

【问题讨论】:

  • 使用JSpinner#getValueJSpinner获取当前值,这将是String,因此您需要将其转换为Integer
  • SpinnerNumberModel model = new SpinnerNumberModel(10, 10, 20, 5); 也会为您提供与您的fontsizelist类似的结果
  • fontsizeitem [i]=new JSpinner(fontsizelist[i]); 你想在那个代码行中实现什么......这对我来说毫无意义。 1)微调器已经实例化了,为什么还要再创建呢? 2)第一部分确实暗示fontsizeitem 是一个数组。它没有被宣布为一个。 3)它似乎试图创建一个微调器数组,每个微调器都有一个原始微调器的项目。带有单个项目的微调器没有意义,而将它们组成的数组则更没有意义。
  • @AndrewThompson 我认为它的工作方式与 JMenuItem 相同。我只是想从数组中获取项目并将其放入 JSpinner
  • @MadProgrammer 感谢 cmets。我会尝试你和答案的建议

标签: java swing jspinner


【解决方案1】:

你应该从How to Use Spinners开始

SpinnerNumberModel 设置正确(10 的最小值,20 的最大值和5 的步长)会给您与fontsizelist 相同的结果

基本思想是,JSpinner 将在值更改时通知您的ChangeListener,由此,您需要获取JSpinner 的引用并获取它的当前值,例如...

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            SpinnerNumberModel model = new SpinnerNumberModel(10, 10, 20, 5);
            JSpinner spinner = new JSpinner(model);
            add(spinner);

            spinner.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    JSpinner spinner = (JSpinner) e.getSource();
                    int value = (int)spinner.getValue();
                    System.out.println("Value is " + value);
                }
            });
        }

    }

}

【讨论】:

  • int value = (int)spinner.getValue(); 为了避免演员,我通常会打电话给model.getNumber().intValue() ..
  • @AndrewThompson 这是一个公平的评论,我认为 OP 可能没有对模型的引用,在这个例子中,我可以“几乎”证明盲目演员:P
  • “我认为 OP 可能没有对模型的引用。” 我经常使用微调器,但从不保留对组件的引用,只保留对模型的引用。我对选角有病态的厌恶。 ;)
  • @AndrewThompson 猜我的经验是相反的,但在这种情况下,你是对的,我可以将监听器附加到模型,但我仍然必须投射源,也,我也不喜欢选角?
  • “我本可以将侦听器附加到模型” 呵呵..我刚刚学到了一些新东西。我没有意识到我可以将侦听器直接添加到模型中(尽管这似乎合乎逻辑,..现在你提到它了!)。目前,我将侦听器添加到微调器组件中,然后才超出范围。 :P
猜你喜欢
  • 1970-01-01
  • 2020-09-27
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多