JSpinner:增加编辑框的长度

时间:2011-09-10 20:54:40

标签: java swing user-interface

我有一个JSpinner,显示从0.0到999.0的十进制值。它似乎工作正常,除了它在编辑器框中显示一个长度为四位数的数字,例如123.4;然后它会切断部分最后一位数,因为它不够长。

所以我的问题是:有谁知道如何增加JSpinner编辑器窗口的长度?

谢谢!

5 个答案:

答案 0 :(得分:12)

您可以通过

转到文本字段,实际上是JFormattedTextField
  • 首先在JSpinner上调用getEditor()以获取微调器的编辑器
  • 将返回的对象强制转换为JSpinner.DefaultEditor
  • 然后就此致电getTextField()。然后,如果需要,您可以将其设置为preferredSize。

编辑:正如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();
         }
      });
   }
}

答案 1 :(得分:12)

第一个气垫船的答案一点也不差。您无法直接更改大小,但您可以执行以下操作:

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

您可以在其中定义编辑器显示的列数。它会改变微调器的大小。

答案 2 :(得分:8)

由于FontMetrics因平台而异,因此最好依靠组件自己的首选大小计算。此示例显示了各种JSpinnermin值的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 :(得分:8)

JSpinner spn=new JSpinner();
spn.setPreferredSize(new Dimension(100,25));

在这里,看看这是一个简单的答案。

答案 4 :(得分:2)

更改微调器的最大值将增加文本框的大小以容纳大数字。如果你不想让最大值变大,我会推荐@JorgeHortelano建议的......

  

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