JSpinner: увеличить длину окна редактора - PullRequest
10 голосов
/ 11 сентября 2011

У меня есть JSpinner, который отображает десятичные значения от 0,0 до 999,0.Кажется, он работает нормально, за исключением случаев, когда в окне редактора отображается число, состоящее из четырех цифр, например 123.4;затем он обрезает часть последней цифры, потому что она недостаточно длинна.

Итак, мой вопрос: кто-нибудь знает, как увеличить длину окна редактора JSpinner?

Спасибо!

Ответы [ 5 ]

12 голосов
/ 10 января 2013

Первые ответы на воздушной подушке совсем не плохи. Вы не можете изменить размер напрямую, но вы можете сделать что-то вроде этого:

JComponent editor = mySpinner.getEditor();
JFormattedTextField tf = ((JSpinner.DefaultEditor) editor).getTextField();
tf.setColumns(4);

Где вы можете определить номера столбцов, показанные редактором. Это изменит размер блесны.

12 голосов
/ 11 сентября 2011

Вы можете перейти к текстовому полю, которое на самом деле является JFormattedTextField с помощью

  • Первый вызов getEditor() на вашем JSpinner для получения редактора счетчика
  • приведение к возвращенномуобъект JSpinner.DefaultEditor
  • Затем вызовите getTextField() на этом.Затем вы можете установить его предпочитаемый размер, если хотите.

Редактировать: как отмечает trashgod, использование правильного макета имеет первостепенное значение и, вероятно, лучший способ решить - использовать макеты, которые вы используете лучше всего.эта проблема.

Редактировать 2: Вышеприведенное неверно, поскольку установка предпочтительного размера текстового поля ничего не делает.Однако вы можете установить предпочтительный размер самого редактора, и это работает.например,

import java.awt.Dimension;

import javax.swing.*;

public class SpinnerBigTextField {
   private static void createAndShowGui() {
      JSpinner spinner = new JSpinner(new SpinnerNumberModel(0.0, 0.0, 999.0,
            0.5));

      JPanel panel = new JPanel();
      panel.setPreferredSize(new Dimension(300, 100));
      panel.add(spinner);

      JComponent field = ((JSpinner.DefaultEditor) spinner.getEditor());
      Dimension prefSize = field.getPreferredSize();
      prefSize = new Dimension(200, prefSize.height);
      field.setPreferredSize(prefSize);

      JFrame frame = new JFrame("SpinnerBigTextField");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(panel);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
8 голосов
/ 11 сентября 2011

Поскольку FontMetrics варьируется от одной платформы к другой, лучше полагаться на собственный расчет предпочтительного размера компонента. В этом примере показан спектр размеров JSpinner для различных значений min и max. В частности, обратите внимание, что FlowLayout "позволяет каждому компоненту принимать свой естественный (предпочтительный) размер."

enter image description here

import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;

/** @see http://stackoverflow.com/questions/7374659 */
public class SpinnerTest extends Box {

    private static final double STEP = 0.1d;
    private static final String FORMAT = "0.0000000000";

    public SpinnerTest(int axis) {
        super(axis);
        for (int i = 0; i < 8; i++) {
            int v = (int) Math.pow(10, i);
            this.add(genParamPanel((i + 1) + ":", -v, v));
        }
    }

    private JPanel genParamPanel(String name, double min, double max) {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
        JLabel label = new JLabel(name, JLabel.TRAILING);
        JSpinner js = new JSpinner(new SpinnerNumberModel(min, min, max, STEP));
        js.setEditor(new JSpinner.NumberEditor(js, FORMAT));
        panel.add(label);
        panel.add(js);
        return panel;
    }

    private void display() {
        JFrame f = new JFrame("SpinnerTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new SpinnerTest(BoxLayout.Y_AXIS).display();
            }
        });
    }
}
3 голосов
/ 17 марта 2018
JSpinner spn=new JSpinner();
spn.setPreferredSize(new Dimension(100,25));

Вот, посмотрите, это простой ответ.

2 голосов
/ 27 мая 2015

Изменение максимального значения счетчика увеличит размер текстового поля для размещения большого числа. Если вы не хотите увеличивать максимальное значение, я бы порекомендовал то, что предложил @JorgeHortelano ...

JComponent editor = mySpinner.getEditor (); JFormattedTextField tf = (редактор (JSpinner.DefaultEditor)) .getTextField (); tf.setColumns (4); * +1004 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...