带有最小和最大按钮的JSpinner

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

是否有这样的组件,或者我应该自己编写代码? 谢谢你的帮助。

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

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

此外,如果您的值是离散的,您可以考虑使用JCombobox,如果不是,则可以考虑使用JSlider,因为这两个组件对用户更清楚地呈现上限和下限。

此致,Stéphane

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

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实例。

你必须阅读如何使用旋转器 ,然后你可以准确地为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() { } }