2011-09-10 8 views
6

0.0から999.0までの10進値を表示するJSpinnerがあります。 123.4などの4桁の数字をエディタボックスに表示する場合を除いて、正常に動作しているようです。それはそれが十分に長くないので、最後の桁の一部を切り捨てます。JSpinner:エディタボックスの長さを増やす

私の質問は:どのようにJSpinnerのエディタウィンドウの長さを増やすか知っていますか?

ありがとうございます!

+4

スピナーを入れるコンテナのレイアウトは何ですか? an [sscce](http://sscce.org/)が理想的です。 – trashgod

+0

テスト時に間違っていたので私の答えを削除しました。 –

答えて

10

あなたは、実際にあるテキストフィールドに取得することができJFormattedTextField

  • まず次にgetTextField()を呼び出す
  • JSpinner.DefaultEditor
  • に返されたオブジェクトをキャストスピナーのエディタ得るためにあなたのJSpinnerの上getEditor()を呼び出すことで、これに。必要に応じてpreferredSizeを設定することができます。

編集:trashgodにも記載されているように、適切なレイアウトを使用することが重要であり、使用しているレイアウトが最適であることを確認することがおそらくこの問題を解決する最良の方法です。

編集2:テキストフィールドの推奨サイズを設定すると何も起こりませんので、上記は間違っています。ただし、エディター自体の推奨サイズを設定することができます。例えば、FontMetricsとして

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ほとんどの場合、RullesがEditorからPreferredSizeを返すのに対し、Eelsはあなたの人を動かすことはありません。私は、4-5の数値の存在があることを知っていれば、これはLayoutManagerではないプログラマーの仕事だと思います。負の数値符号がありますが、さらに水平方向に5〜8ピクセル、垂直には醜く見えない場合には2〜5です。JSpinner#setPreferredSize()、btw +1を正確には解決しない方法コンパウンドJComponentのコンポーネント – mKorbel

+1

-1のためにsetXXSize – kleopatra

7

は、好ましいサイズの成分自身の計算に依存する方が良いでしょう、一つのプラットフォームから次へと変わります。この例は、さまざまなminおよびmaxの値の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

スピナーの最大値を変更すると、大きな数に対応するためにテキストボックスのサイズが大きくなります。あなたは、最大値を大きくしたくない場合は、私は

JComponentのエディタ= mySpinner.getEditor()... @JorgeHortelanoが提案何をお勧めします。 JFormattedTextField tf =((JSpinner.DefaultEditor)エディタ).getTextField(); tf.setColumns(4);

関連する問題