Java JSpinner:增加编辑器框的长度

Java JSpinner:增加编辑器框的长度,java,swing,user-interface,Java,Swing,User Interface,我有一个JSpinner,它显示从0.0到999.0的十进制值。它似乎工作得很好,除了在编辑器框中显示一个四位数长的数字,如123.4;因为最后一个数字不够长,所以它会把它的一部分切掉 所以我的问题是:有人知道如何增加JSpinner编辑器窗口的长度吗 谢谢 您可以通过 首先在JSpinner上调用getEditor(),以获取微调器的编辑器 将返回的对象强制转换为JSpinner.DefaultEditor 然后在此基础上调用getTextField()。然后,如果需要,您可以设置它的pre

我有一个JSpinner,它显示从0.0到999.0的十进制值。它似乎工作得很好,除了在编辑器框中显示一个四位数长的数字,如123.4;因为最后一个数字不够长,所以它会把它的一部分切掉

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


谢谢

您可以通过

  • 首先在JSpinner上调用
    getEditor()
    ,以获取微调器的编辑器
  • 将返回的对象强制转换为
    JSpinner.DefaultEditor
  • 然后在此基础上调用
    getTextField()
    。然后,如果需要,您可以设置它的preferredSize
编辑:正如垃圾神所指出的,使用正确的布局是至关重要的,确保你使用的布局是最好的,这可能是解决这个问题的最好方法

编辑2:上述内容是错误的,因为设置文本字段的首选大小没有任何作用。但是,您可以设置编辑器本身的首选大小,这是可行的。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();
         }
      });
   }
}

由于不同平台的
FontMetrics
有所不同,因此最好依靠组件自己对首选大小的计算。此示例显示了各种
min
max
值的
JSpinner
大小范围。请特别注意,“允许每个组件假定其自然(首选)大小。”

导入java.awt.EventQueue;
导入java.awt.FlowLayout;
导入javax.swing.Box;
导入javax.swing.BoxLayout;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JSpinner;
导入javax.swing.SpinnerNumberModel;
/**@见http://stackoverflow.com/questions/7374659 */
公共类SpinnerTest扩展框{
专用静态最终双台阶=0.1d;
私有静态最终字符串格式=“0.0000000000”;
公共喷丝头测试(int轴){
超级(轴);
对于(int i=0;i<8;i++){
int v=(int)Math.pow(10,i);
添加(genParamPanel((i+1)+“:”,-v,v));
}
}
专用JPanel genParamPanel(字符串名称,双最小值,双最大值){
JPanel面板=新的JPanel(新的FlowLayout(FlowLayout.training));
JLabel label=新的JLabel(名称,JLabel.TRAILING);
JSpinner js=新JSpinner(新喷丝头编号模型(最小、最小、最大、步长));
setEditor(新的JSpinner.numberditor(js,格式));
面板。添加(标签);
panel.add(js);
返回面板;
}
专用void display(){
JFrame f=新JFrame(“喷丝头测试”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 加上(这个);
f、 包装();
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
新喷丝头测试(BoxLayout.Y_轴).display();
}
});
}
}

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

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

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

更改微调器的最大值将增大文本框的大小以适应较大的数字。如果您不希望使最大值变大,我建议@JorgeHortelano建议的

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


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

放置微调器的容器的布局是什么?一个An是理想的答案。我删除了我的答案,因为测试时答案是完全错误的。+1,它尊重首选尺寸,在这种情况下特别有用。@Hovercraft充满鳗鱼,不针对你的人,只是针对Rules从编辑器返回PreferredSize,在大多数情况下,我认为这正是程序员的工作,而不是LayoutManager的工作,如果我知道有4-5个数字拥有。。。或者可能的负号,还有另外5-8个像素水平方向和2-5个像素垂直方向的非难看外观,如何解决这一问题而不精确到JSpinner#setPreferredSize(),顺便说一句,从化合物中提取成分为1JComponent@Hovercraft全是鳗鱼:效果很好。谢谢我已经提出了一个依赖于组件首选大小的解决方案。非常感谢您提供了一个简单的三线示例!我到处找这个:)
JComponent editor = mySpinner.getEditor();
JFormattedTextField tf = ((JSpinner.DefaultEditor) editor).getTextField();
tf.setColumns(4);
JSpinner spn=new JSpinner();
spn.setPreferredSize(new Dimension(100,25));