2011-09-10 25 views
6

我有一個顯示從0.0到999.0的十進制值的JSpinner。它似乎工作正常,除了當它在四位數的編輯框中顯示一個數字時,例如123.4;然後它會切斷最後一位數字的一部分,因爲它不夠長。JSpinner:增加編輯框的長度

所以我的問題是:有誰知道如何增加JSpinner編輯器窗口的長度?

謝謝!

+4

放置微調器的容器的佈局是什麼?一個[sscce](http://sscce.org/)將是理想的。 – trashgod

+0

我刪除了我的答案,因爲測試時顯然是錯誤的。 –

回答

10

你可以得到的文本字段這實際上是一個由

  • 首先對你的JSpinner呼籲getEditor()得到微調的編輯
  • 投返回的對象JSpinner.DefaultEditor
  • 然後調用getTextField()JFormattedTextField在這。然後,如果需要,您可以將其設置爲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

+1 ['BoxLayout'](http://download.oracle.com/javase/7/docs/api/javax/swing/BoxLayout.html)尊重首選尺寸,在這種情況下特別有用。 – trashgod

+0

@Hovercraft完整的鰻魚不會agaist你的人,只是針對rulles返回編輯器中的PreferredSize,在大多數情況下,我認爲這對於Programator而言並不適用於LayoutManager,如果我知道有4-5個數字possitions ...或可能負數字符號,還有更多的加5-8像素水平和2-5垂直爲非醜陋的樣子,如何解決,沒有完全對JSpinner#setPreferredSize(),btw +1提取複合成分JComponent – mKorbel

+1

-1對於setXXSize – kleopatra

7

由於FontMetrics變化從一個平臺到下一個,最好是依靠組件自己的首選大小的計算。此示例顯示了各種minmax值的JSpinner大小的頻譜。特別要注意的是,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(); 
      } 
     }); 
    } 
} 
7

第一氣墊船的答案是不壞。你不能直接改變尺寸,但你可以這樣做:

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

你可以在哪裏定義編輯器顯示的列數。它會改變微調器的大小。

+1

非常感謝您提供簡單的3行示例!我一直在尋找這個:) – uyuyuy99

+0

不適合我。 –

+0

@ ivan.ukr感謝downvote。我在許多應用程序中執行這個代碼,它正在工作。你確定這個錯誤是在這些行嗎? – JorgeHortelano

0

更改微調器的最大值將增加文本框的大小以容納大數字。如果你不希望使最大值更大,我會推薦什麼@JorgeHortelano建議...

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