Java 自定义JSpinner模型不工作
我尝试实现自己的Java 自定义JSpinner模型不工作,java,swing,jspinner,changelistener,Java,Swing,Jspinner,Changelistener,我尝试实现自己的JSpinner模型来接受枚举(包括I18N),因此我喜欢这样: searchSpinner.setModel(new AbstractSpinnerModel() { int index = 0; int minIndex = 0; int maxIndex = MY_ENUM.values().length - 1; Object selected = MY_ENUM.values()[index]; @Override p
JSpinner
模型来接受枚举
(包括I18N
),因此我喜欢这样:
searchSpinner.setModel(new AbstractSpinnerModel() {
int index = 0;
int minIndex = 0;
int maxIndex = MY_ENUM.values().length - 1;
Object selected = MY_ENUM.values()[index];
@Override
public Object getValue() {
return selected;
}
@Override
public void setValue(Object value) {
selected = value;
fireStateChanged();
}
@Override
public Object getNextValue() {
if (index < maxIndex) {
index++;
}
fireStateChanged();
return MY_ENUM.values()[index];
}
@Override
public Object getPreviousValue() {
if (index > minIndex) {
index--;
}
fireStateChanged();
return MY_ENUM.values()[index];
}
@Override
public void addChangeListener(ChangeListener l) {
}
@Override
public void removeChangeListener(ChangeListener l) {
}
});
searchSpinner.setModel(新的AbstractSpinnerModel(){
int指数=0;
int minIndex=0;
int maxIndex=MY_ENUM.values().length-1;
所选对象=我的枚举值()[index];
@凌驾
公共对象getValue(){
返回选中的;
}
@凌驾
公共无效设置值(对象值){
所选=值;
fireStateChanged();
}
@凌驾
公共对象getNextValue(){
如果(索引<最大索引){
索引++;
}
fireStateChanged();
返回我的_ENUM.values()[index];
}
@凌驾
公共对象getPreviousValue(){
如果(索引>最小索引){
索引--;
}
fireStateChanged();
返回我的_ENUM.values()[index];
}
@凌驾
公共无效addChangeListener(ChangeListener l){
}
@凌驾
public void removeChangeListener(ChangeListener l){
}
});
问题是它不起作用,甚至微调器列表看起来也像是禁用的。我做错了什么
更新:根据第一个答案你应该扩展到(注意他的问题的新成员——注意他最初的问题有一个实现SpinnerModel接口的类。他后来更改了他的代码以反映我的建议)并确保在适当的时候调用fireStateChanged()
方法。此外,您还没有考虑边缘情况和超出边缘的情况
e、 g
import javax.swing.*;
导入javax.swing.JSpinner.DefaultEditor;
公共类MySpinnerPanel扩展了JPanel{
公共静态void main(字符串[]args){
JSpinner微调器=新的JSpinner(新的MyEnumSpinnerModel());
JSpinner.DefaultEditor=(DefaultEditor)spinner.getEditor();
editor.getTextField().setColumns(5);
JPanel面板=新的JPanel();
panel.add(微调器);
showMessageDialog(空,面板);
}
}
髓鞘{
FE、FI、FO、FUM、FOO、FUBAR、SPAM
}
类MyEnumSpinnerModel扩展了AbstractSpinnerModel{
私有整数指数=0;
@凌驾
公共对象getValue(){
返回MyEnum.values()[index];
}
@凌驾
公共无效设置值(对象值){
if(MyEnum的值instanceof){
索引=((MyEnum)值).ordinal();
fireStateChanged();
}否则{
字符串text=value.toString()+“不是有效的枚举项”;
抛出新的IllegalArgumentException(文本);
}
}
@凌驾
公共对象getNextValue(){
如果(索引>=MyEnum.values().length-1){
返回null;
}否则{
返回MyEnum.values()[index+1];
}
}
@凌驾
公共对象getPreviousValue(){
if(index您应该从(注意,他的问题的新成员——注意,他最初的问题有一个实现SpinnerModel接口的类。他后来更改了代码以反映我的建议)扩展,并确保调用fireStateChanged()
方法。此外,您没有考虑边缘情况和超出边缘情况
e、 g
import javax.swing.*;
导入javax.swing.JSpinner.DefaultEditor;
公共类MySpinnerPanel扩展了JPanel{
公共静态void main(字符串[]args){
JSpinner微调器=新的JSpinner(新的MyEnumSpinnerModel());
JSpinner.DefaultEditor=(DefaultEditor)spinner.getEditor();
editor.getTextField().setColumns(5);
JPanel面板=新的JPanel();
panel.add(微调器);
showMessageDialog(空,面板);
}
}
髓鞘{
FE、FI、FO、FUM、FOO、FUBAR、SPAM
}
类MyEnumSpinnerModel扩展了AbstractSpinnerModel{
私有整数指数=0;
@凌驾
公共对象getValue(){
返回MyEnum.values()[index];
}
@凌驾
公共无效设置值(对象值){
if(MyEnum的值instanceof){
索引=((MyEnum)值).ordinal();
fireStateChanged();
}否则{
字符串text=value.toString()+“不是有效的枚举项”;
抛出新的IllegalArgumentException(文本);
}
}
@凌驾
公共对象getNextValue(){
如果(索引>=MyEnum.values().length-1){
返回null;
}否则{
返回MyEnum.values()[index+1];
}
}
@凌驾
公共对象getPreviousValue(){
如果(索引,则应使用ChangeListener
通知模型中的更改视图
spinner = new JSpinner(new SpinnerModel() {
private ChangeListener l;
@Override
public void setValue(Object value) {
...
if(l != null) {
l.stateChanged(new ChangeEvent(this));
}
}
...
@Override
public void addChangeListener(ChangeListener l) {
this.l = l;
}
@Override
public void removeChangeListener(ChangeListener l) {
if(this.l == l) {
this.l = null;
}
}
});
编辑:您可以使用列表注册多个侦听器。您应该使用ChangeListener
通知模型中的更改视图
spinner = new JSpinner(new SpinnerModel() {
private ChangeListener l;
@Override
public void setValue(Object value) {
...
if(l != null) {
l.stateChanged(new ChangeEvent(this));
}
}
...
@Override
public void addChangeListener(ChangeListener l) {
this.l = l;
}
@Override
public void removeChangeListener(ChangeListener l) {
if(this.l == l) {
this.l = null;
}
}
});
编辑:您可以使用列表注册多个侦听器。只需将此:if(this.l==l)更改为if(this.l!=l),你的答案很好。这不是一个错误。要正确删除侦听器,它必须提交给同一个侦听器。在这种情况下,没有太多问题,但如果指出删除了什么内容非常重要。这个答案是不正确的,因为模型不应该要求侦听器通知它自己的更改。正确的解决方案是触发e通知方法。此方法是模型的一部分。我说的是基本接口的直接实现,您使用它的实现,它有一个通知侦听器的方法。请参阅“编辑我的答案”以及“源代码”以了解此答案不正确的原因。另请参阅以了解如何o扩展抽象Swing模型,特别是“触发数据更改事件”部分,你的答案很好。这不是一个错误。要正确删除一个侦听器,它必须提交给同一个侦听器。在这种情况下,没有太多问题,但如果指出删除了什么内容非常重要。此answ