JSpinner学习心得

来源:互联网 发布:盗梦三国龙将无双java 编辑:程序博客网 时间:2024/05/25 18:09

在JDK里面,定义了三个与JSpinner相对应的model,分别是SpinnerDateModel,SpinnerListModel,SpinnerNumberModel,根据不同的需求,创建不同不得model,注意在JSpinner的构造方法中如果不传入相应的model,那么就会按照SpinnerNumberModel处理。SpinnerDateModel对应JSpinner生成的编辑器为DateEditor,SpinnerListModel对应JSpinner生成的编辑器为ListEditor,SpinnerNumberModel对应JSpinner生成的编辑器为NumberEditor,当然也可以自己定义一个model,但是这时候从JDK中就可以看出-----除了上述三种model,对于别的model,它都是按照DefaultEditor来处理,这样就来了一个麻烦,就是在DefaultEditor的构造方法中就定义这里面的组件是不可以编辑的,(本人愚钝,不知如何修改,但是我想肯定可以改成可以修改的,我继承过来 弄了半天也没好。)

   对于设计UI来说,三种情况似乎是少了点,例如这种情况我想利用SpinnerNumberModel,但是有一点,就是在初始化的时候不要显示“0”,而是什么也不显示。这种情况下可以这样处理,就是给JSpinner加上一个编辑器(setEditor方法),我们可以让编辑器来显示,那么如何让JSpinner中的值改变的时候去通知编辑器哪?JDK里面当JSpinner会触发fireStateChanged,fireStateChanged恰好会触发监听事件,那么这样让编辑器实现ChangeListener接口,这样就会把问题迎刃而解。可以看下source:

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Test extends JPanel {
   public Test(){
    this.setPreferredSize(new Dimension(60,60));
    SpinnerNumberModel model = new SpinnerNumberModel();
    JSpinner spinner = new JSpinner(model);
    spinner.setPreferredSize(new Dimension(50,20));
    spinner.setEditor( new TextFile(spinner));
    this.add(spinner, BorderLayout.CENTER);
   }
   public static void main(String[] args) {
 JFrame frame = new JFrame();
 JPanel panel = new Test();
 frame.add(panel);
 frame.pack();
 frame.setVisible(true);
 frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
   class TextFile extends JTextField implements ChangeListener{
    public TextFile(JSpinner spinner1){
     this.spinner = spinner1;
     this.spinner.addChangeListener(this);
   //  this.setText(spinner1.getValue().toString());
    }
    JSpinner spinner;
 public JSpinner getSpinner() {
  return spinner;
 }
 public void setSpinner(JSpinner spinner) {
  this.spinner = spinner;
 }
 public void stateChanged(ChangeEvent e) {
  this.setText(this.spinner.getValue().toString());
 }
   
   }
}

原创粉丝点击