相关文章推荐
不要命的茶叶  ·  vue ...·  1 年前    · 
酷酷的小蝌蚪  ·  logstash filter json ...·  1 年前    · 
大方的蚂蚁  ·  javascript - ...·  1 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I have a JSpinner that displays decimal values from 0.0 to 999.0. It seems to work fine, except for when it displays a number in the editor box that is four-digits long, such as 123.4; it then cuts off part of the final digit because it is not long enough.

So my question is: Does anyone know how to increase the length of the editor window of a JSpinner?

Thanks!

What is the layout of the container into which you place the spinner? An an sscce would be ideal. trashgod Sep 10, 2011 at 21:01
  • First calling getEditor() on your JSpinner to get the spinner's editor
  • cast the returned object to JSpinner.DefaultEditor
  • Then call getTextField() on this. Then you can set it's preferredSize if desired.
  • Edit: as noted by trashgod though, using a proper layout is paramount and being sure that the layouts you use are the best is probably the best way to solve this issue.

    Edit 2: The above is wrong as setting the textfield's preferred size does nothing. You can however set the preferred size of the editor itself, and that works. e.g .,

    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();
                    @Hovercraft Full Of Eels not agaist your person, just against rulles returns PreferredSize from Editor, in most cases I think that this's exactly job for programator not for LayoutManager, if I know that there are 4-5 numeric possitions ... or possible negative numeric sign, still is there moreover plus 5-8 pixels Horizontally and 2-5 Vertically for non-ugly look, how to solve that without exactly to JSpinner#setPreferredSize(), btw +1 for extract Component from compound JComponent
    – mKorbel
                    Sep 10, 2011 at 21:35
    

    The first Hovercraft answers is not bad at all. You can not change the size directly, but you can do something like this:

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

    Where you can define the columns numbers showed by the editor. It will change the size of the spinner.

    Thank you so much for the simple 3-line example! I've been looking everywhere for this :) – uyuyuy99 Mar 1, 2014 at 9:15 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();

    Changing the max value of a spinner will increase the size of the text box to accommodate the large number. If you do not wish to make the max value larger, i would recommend what @JorgeHortelano suggested...

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

    Thanks for contributing an answer to Stack Overflow!

    • Please be sure to answer the question. Provide details and share your research!

    But avoid

    • Asking for help, clarification, or responding to other answers.
    • Making statements based on opinion; back them up with references or personal experience.

    To learn more, see our tips on writing great answers.