JSpinner с кнопками min и max - PullRequest
       29

JSpinner с кнопками min и max

1 голос
/ 02 августа 2011

Я ищу JSpinner-подобный компонент, который бы обеспечивал встроенные кнопки, которые бы немедленно устанавливали значение счетчика на минимум или максимум модели jspinner.Прежде чем реализовать это самостоятельно, я подумал, что кто-то мог бы сделать это раньше, хотя мои поиски в Google по этой теме не увенчались успехом.

Есть ли такой компонент или я должен сам его кодировать?Спасибо за вашу помощь.

Ответы [ 3 ]

2 голосов
/ 02 августа 2011

Я думаю, было бы просто реализовать это самостоятельно

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 голосов
/ 02 августа 2011

вы должны прочитать Как использовать счетчики , и тогда вы сможете установить эти значения точно для SpinnerNumberModel

JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, 20, 1));

например (по Станиславу)

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() {
    }
}
2 голосов
/ 02 августа 2011

Я не могу придумать ни одного компонента, который сделал бы это из коробки.Но в основном, простая схема потока с кнопкой «минус», спиннером и кнопкой «макс» подойдет.Обе кнопки будут иметь actionListeners, который будет запрашивать у прядильщика минимальное и максимальное значения и устанавливать его значение.

Используйте changeListener на прядильщике, чтобы получать уведомления об изменениях значений как программно (с помощью кнопок), так и через пользователя.взаимодействие.

Кроме того, вы можете рассмотреть возможность использования JCombobox, если ваши значения являются дискретными, или JSlider, если это не так, поскольку оба компонента более четко представляют верхнюю и нижнюю границы пользователям.

С уважением,Stéphane

...