带有最小和最大按钮的JSpinner

时间:2011-08-02 11:17:09

标签: java swing jspinner

我正在寻找一个类似JSpinner的组件,它会提供内置按钮,可以立即将微调器值设置为jspinner模型的最小值或最大值。在我自己实现这个之前,我认为有人可能以前做过,虽然我对谷歌搜索的主题没有成功。

那里有这样的组件,还是我应该自己编写代码?谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

我想不出任何可以开箱即用的组件。但基本上,一个带有减号按钮,微调器和最大按钮的简单流程布局就可以了。这两个按钮都有actionListeners,它会向微调器询问最小值和最大值并设置其值。

使用微调器上的changeListener以编程方式(使用按钮)和用户交互通知值更改。

另外,如果你的值是离散的,你可以考虑使用JCombobox,如果不是,你可以考虑使用JSlider,因为两个组件都更清楚地向用户显示上限和下限。

此致  斯特凡

答案 1 :(得分:2)

我认为自己实施它会很简单

1)我会创建一个扩展JPanel的类。

class MyPanel extends JPanel

2)在这个课程中,您必须定义滑块和按钮的放置位置以及与按钮相关的操作。

public MyPanel(){
  super();
  // set the layout
  JSlider slider = new Slider();
  this.add(slider);
  // ..
  JButton button1 = new JButton();
  //
}

3)您可以向您的应用程序添加已实现的类的JPanel实例。

答案 2 :(得分:2)

您必须阅读How to Use Spinners,然后您才能为SpinnerNumberModel

准确设置这些值
JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, 20, 1));

例如(作者StanislavL)

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;
import javax.swing.text.*;

public class TestDigitsOnlySpinner {

    public static void main(String... args) {
        SwingUtilities.invokeLater((Runnable) new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame("enter digit");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JSpinner jspinner = makeDigitsOnlySpinnerUsingDocumentFilter();
                frame.getContentPane().add(jspinner, BorderLayout.CENTER);
                frame.getContentPane().add(new JButton("just another widget"), BorderLayout.SOUTH);
                frame.pack();
                frame.setVisible(true);
            }

            private JSpinner makeDigitsOnlySpinner_BasicAttempt() {
                JSpinner spinner = new JSpinner(new SpinnerNumberModel());
                return spinner;
            }

            private JSpinner makeDigitsOnlySpinnerUsingDocumentFilter() {
                JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, 20, 1));
                JSpinner.NumberEditor jsEditor = (JSpinner.NumberEditor) spinner.getEditor();
                final Document jsDoc = jsEditor.getTextField().getDocument();
                if (jsDoc instanceof PlainDocument) {
                    AbstractDocument doc = new PlainDocument() {

                        private static final long serialVersionUID = 1L;

                        @Override
                        public void setDocumentFilter(DocumentFilter filter) {
                            if (filter instanceof MyDocumentFilter) {
                                super.setDocumentFilter(filter);
                            }
                        }
                    };
                    doc.setDocumentFilter(new MyDocumentFilter());
                    jsEditor.getTextField().setDocument(doc);
                }
                return spinner;
            }
        });
    }

    private static class MyDocumentFilter extends DocumentFilter {

        @Override
        public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
            if (stringContainsOnlyDigits(string)) {
                super.insertString(fb, offset, string, attr);
            }
        }

        @Override
        public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
            super.remove(fb, offset, length);
        }

        @Override
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
            if (stringContainsOnlyDigits(text)) {
                super.replace(fb, offset, length, text, attrs);
            }
        }

        private boolean stringContainsOnlyDigits(String text) {
            for (int i = 0; i < text.length(); i++) {
                if (!Character.isDigit(text.charAt(i))) {
                    return false;
                }
            }
            return true;
        }
    }

    private TestDigitsOnlySpinner() {
    }
}