【问题标题】:JSpinner: Increase length of editor boxJSpinner:增加编辑框的长度
【发布时间】:2011-11-14 12:52:49
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 放置微调器的容器的布局是什么?一个sscce 将是理想的。
  • 我删除了我的答案,因为在测试时它是完全错误的。

标签: java swing user-interface


【解决方案1】:

您可以通过

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

编辑:正如垃圾神所指出的,使用正确的布局至关重要,确保您使用的布局是最好的可能是解决此问题的最佳方法。

编辑 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 BoxLayout 尊重首选尺寸,在这种情况下特别有用。
  • @Hovercraft Full Of Eels 不反对你的人,只是反对规则从编辑器返回 PreferredSize,在大多数情况下,我认为这正是程序员的工作而不是 LayoutManager,如果我知道有 4-5数字位置...或可能的负数字符号,仍然存在另外加上 5-8 像素水平和 2-5 垂直不难看的外观,如何解决这个问题不完全到 JSpinner#setPreferredSize(),顺便说一句 +1 提取来自复合 JComponent 的组件
  • @Hovercraft Full Of Eels:完美运行。谢谢!
  • 我已经提交了一个variation,它依赖于组件的首选大小。
【解决方案2】:

由于FontMetrics 因平台而异,因此最好依靠组件自己计算的首选大小。此示例显示了各种minmax 值的JSpinner 大小范围。请特别注意FlowLayout“让每个组件都采用其自然(首选)大小。”

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】:

    第一个气垫船答案一点也不差。你不能直接改变大小,但你可以这样做:

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

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

    【讨论】:

    • 非常感谢简单的 3 行示例!我一直在到处寻找这个:)
    【解决方案4】:

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

    JComponent 编辑器 = mySpinner.getEditor(); JFormattedTextField tf = ((JSpinner.DefaultEditor) 编辑器).getTextField(); tf.setColumns(4);

    【讨论】:

      【解决方案5】:
      JSpinner spn=new JSpinner();
      spn.setPreferredSize(new Dimension(100,25));
      

      看,这就是简单的答案。

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 1970-01-01
        • 2020-01-03
        • 1970-01-01
        • 2012-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-18
        相关资源
        最近更新 更多