2011-09-10 5 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()를 호출 이에. 원하는 경우 원하는 크기로 설정할 수 있습니다.

편집 : 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 전체가 Eels가 아니라 귀하의 사람 agaist 귀하의 사람이 아니라 그냥 Rulles 반환합니다 PreferredSize 편집기에서 대부분의 경우 나는 4-5 숫자 possitions 있습니다 ... 또는 가능하다는 것을 알고 있다면 이것은 LayoutManager가 아닌 프로그래머를위한 직업이라고 생각합니다 음수 부호, 여전히 거기에 더하기 5-8 픽셀 수평 및 2-5 비 꼬인 모양을 위해 수직으로, JSpinner # setPreferredSize(), btw +1을 정확히 사용하지 않고 그것을 해결하는 방법 복합 JComponent의 구성 요소 – mKorbel

+1

-1 에 대해 setXXSize – kleopatra

7

는 적절한 사이즈의 구성 요소의 자신의 계산에 의존하는 것이 좋습니다, 하나 개의 플랫폼에서 다음 다릅니다. 이 예는 다양한 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 editor = mySpinner.getEditor(); JFormattedTextField tf = ((JSpinner.DefaultEditor) editor) .getTextField(); tf.setColumns (4);

관련 문제