2011-09-10 15 views
6

मेरे पास एक जेएसपीनर है जो 0.0 से 999.0 तक दशमलव मान प्रदर्शित करता है। ऐसा लगता है कि यह ठीक काम करता है, सिवाय इसके कि जब यह संपादक बॉक्स में एक संख्या प्रदर्शित करता है जो चार अंकों लंबा है, जैसे कि 123.4; इसके बाद यह अंतिम अंक के हिस्से में कटौती करता है क्योंकि यह काफी लंबा नहीं है।जेएसपीनर: संपादक बॉक्स की लंबाई बढ़ाएं

तो मेरा सवाल यह है: क्या कोई जानता है कि जेएसपीनर की संपादक विंडो की लंबाई कैसे बढ़ाएं?

धन्यवाद!

+4

कंटेनर का लेआउट क्या है जिसमें आप स्पिनर डालते हैं? एक [एसएससीई] (http://sscce.org/) आदर्श होगा। – trashgod

+0

मैंने अपना जवाब हटा दिया जब परीक्षण किया गया यह सादा गलत था। –

उत्तर

10

आप टेक्स्ट फ़ील्ड जो वास्तव में है करने के लिए प्राप्त कर सकते हैं एक JFormattedTextField द्वारा

  • पहले स्पिनर के संपादक पाने के लिए अपने JSpinner पर getEditor() बुला
  • JSpinner.DefaultEditor
  • को लौट वस्तु डाली तो getTextField() फोन इस पर। फिर वांछित अगर आप इसे पसंदीदा आकार सेट कर सकते हैं।

संपादित करें: जैसा कि ट्रैशगोड द्वारा नोट किया गया है, उचित लेआउट का उपयोग करना सर्वोपरि है और यह सुनिश्चित करना कि आपके द्वारा उपयोग किए जाने वाले लेआउट सबसे अच्छे हैं, शायद इस समस्या को हल करने का सबसे अच्छा तरीका है।

संपादित करें 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

@ होवरक्राफ्ट फुल ऑफ़ ईल्स आपके व्यक्ति को परेशान नहीं करता है, सिर्फ फैसलों के खिलाफ संपादक से पसंदीदा आकार देता है, ज्यादातर मामलों में मुझे लगता है कि यह प्रोग्रामर के लिए बिल्कुल सही काम है, लेआउटमैनेजर के लिए नहीं, अगर मुझे पता है कि 4-5 संख्यात्मक संभावनाएं हैं ... या संभव ऋणात्मक संख्यात्मक संकेत, अभी भी 5-8 पिक्सेल क्षैतिज रूप से और 2-5 लंबवत रूप से गैर-बदसूरत दिखने के लिए है, बिना किसी JSPinner के लिए इसे कैसे हल करें # setPreferredSize(), बीटीडब्ल्यू +1 निकालने के लिए यौगिक से घटक JComponent – mKorbel

+1

-1 setXXSize – kleopatra

7

FontMetrics के रूप में, एक मंच से अगले करने के लिए अलग-अलग हो यह प्राथमिकता दी आकार के घटक की अपनी गणना पर भरोसा करना बेहतर है। यह उदाहरण विभिन्न 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 डाउनवोट के लिए धन्यवाद। मैं अपने कई अनुप्रयोगों में बिल्कुल इस कोड को निष्पादित करता हूं और यह काम कर रहा है। क्या आप वाकई इन पंक्तियों में त्रुटि है? – JorgeHortelano

0

स्पिनर के अधिकतम मूल्य को बदलने से बड़ी संख्या को समायोजित करने के लिए टेक्स्ट बॉक्स का आकार बढ़ जाएगा। आप अधिकतम मूल्य बड़ा बनाने के लिए नहीं करना चाहते हैं, मैं सिफारिश करेंगे क्या @JorgeHortelano सुझाव दिया ...

JComponent संपादक = mySpinner.getEditor(); JFormattedTextField tf = ((JSpinner.DefaultEditor) संपादक) .getTextField(); tf.set कॉलम (4);

संबंधित मुद्दे