【问题标题】:A JSpinner with min and max buttons带有最小和最大按钮的 JSpinner
【发布时间】:2011-08-02 11:17:09
【问题描述】:

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

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

【问题讨论】:

    标签: java swing jspinner


    【解决方案1】:

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

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

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

    问候, 斯蒂芬

    【讨论】:

    • 谢谢。我担心没有现成的组件。我会执行的。
    【解决方案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 实例添加到您的应用程序中。

    【讨论】:

      【解决方案3】:

      您必须阅读 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() {
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多