2009-03-06 17 views
7

घुमाएं मैं वर्तमान में JLabel से विरासत में एक स्विंग घटक को कार्यान्वित करने की कोशिश कर रहा हूं, जिसे केवल एक लेबल का प्रतिनिधित्व करना चाहिए जो लंबवत उन्मुख हो सकता है।एक स्विंग जेएलएबल

इस के साथ शुरुआत:

public class RotatedLabel extends JLabel { 

    public enum Direction { 
    HORIZONTAL, 
    VERTICAL_UP, 
    VERTICAL_DOWN 
    } 

    private Direction direction; 

मैंने सोचा कि यह एक अच्छा विचार बस getPreferredSize() से परिणाम को बदलने के लिए हो रहा है:

@Override 
    public Dimension getPreferredSize() { 
    // swap size for vertical alignments 
    switch (getDirection()) { 
    case VERTICAL_UP: 
    case VERTICAL_DOWN: 
     return new Dimension(super.getPreferredSize().height, super 
      .getPreferredSize().width); 
    default: 
     return super.getPreferredSize(); 
    } 
    } 

और फिर बस Graphics वस्तु को बदलने से पहले मैं करने के लिए पेंटिंग ऑफलोड मूल JLabel:

@Override 
    protected void paintComponent(Graphics g) { 
    Graphics2D gr = (Graphics2D) g.create(); 

    switch (getDirection()) { 
    case VERTICAL_UP: 
     gr.translate(0, getPreferredSize().getHeight()); 
     gr.transform(AffineTransform.getQuadrantRotateInstance(-1)); 
     break; 
    case VERTICAL_DOWN: 
     // TODO 
     break; 
    default: 
    } 

    super.paintComponent(gr); 
    } 
} 

ऐसा लगता है कि किसी भी तरह-पाठ में अब लंबवत प्रदर्शित किया गया है। हालांकि, प्लेसमेंट और आकार बंद हैं:

असल में, पृष्ठभूमि की चौड़ाई (इस मामले में नारंगी) आसपास के JFrame की ऊंचाई के समान है जो ... मेरे मन में काफी कुछ नहीं था।

कोई विचार उचित तरीके से इसे कैसे हल करें? क्या superclasses को प्रतिपादन प्रतिनिधि भी प्रोत्साहित किया जाता है?

+0

मिस्ड "(" gr.translate0 में, getPreferredSize()। GetHeight()); ' – brownian

उत्तर

8

मुझे अब एक सहकर्मी की थोड़ी मदद से काम करने के लिए मिला। असल में अब मेरे पास एक ऐसा क्षेत्र है जो इंगित करता है कि ऊंचाई/चौड़ाई स्वैप करना है जो उस समय के लिए सक्रिय है जब मूल JLabel इसकी पेंटिंग करता है।

private boolean needsRotate; 

@Override 
public Dimension getSize() { 
    if (!needsRotate) { 
    return super.getSize(); 
    } 

    Dimension size = super.getSize(); 

    switch (getDirection()) { 
    case VERTICAL_DOWN: 
    case VERTICAL_UP: 
     return new Dimension(size.height, size.width); 
    default: 
    return super.getSize(); 
    } 
} 

@Override 
public int getHeight() { 
    return getSize().height; 
} 

@Override 
public int getWidth() { 
    return getSize().width; 
} 

@Override 
protected void paintComponent(Graphics g) { 
    Graphics2D gr = (Graphics2D) g.create(); 

    switch (getDirection()) { 
    case VERTICAL_UP: 
    gr.translate(0, getSize().getHeight()); 
    gr.transform(AffineTransform.getQuadrantRotateInstance(-1)); 
    break; 
    case VERTICAL_DOWN: 
    gr.transform(AffineTransform.getQuadrantRotateInstance(1)); 
    gr.translate(0, -getSize().getWidth()); 
    break; 
    default: 
    } 

    needsRotate = true; 
    super.paintComponent(gr); 
    needsRotate = false; 
} 
+0

क्या आप पूर्ण कक्षा प्रदान कर सकते हैं? –

+1

http://hypftier.de/dump/RotatedLabel देखें।जावा - उल्लिखित लाइसेंस बीएसडी के बाद मॉडलिंग किया गया है (हालांकि लाइसेंस टेक्स्ट केवल जर्मन में उपलब्ध है)। – Joey

0

मुझे लगता है कि यह बंद है क्योंकि आप गलत बिंदु के बारे में अनुवाद कर रहे हैं।

ऑब्जेक्ट का आकार इस बात पर निर्भर करता है कि आपके पास कौन सा कंटेनर है, इसलिए जब आपका पसंदीदा आकार आप चाहते हैं, तो आपका वास्तविक आकार नहीं है?

यदि आप एक BorderLayout के केंद्र में यह लेबल हो, आकार हमेशा कंटेनर का पूर्ण आकार है (ऋण उत्तर + दक्षिण ऊंचाई, शून्य से पूर्व + पश्चिम चौड़ाई)

ताकि आप की जरूरत नहीं है वास्तविक आकार के बारे में अनुवाद, पसंदीदा आकार नहीं?

+0

हम्म ... नहीं ... काफी। प्लेसमेंट थोड़ा बंद है क्योंकि लेबल का लंबवत (अब क्षैतिज) संरेखण केंद्रित है, लेकिन आकार अब बिल्कुल वर्ग है। क्या यह हो सकता है कि सुपरक्लास मेरे ओवरराइड getPreferredSize विधि के बारे में परवाह नहीं करता है और इस प्रकार मेरी सीमाओं के संबंध में खुद को आकर्षित नहीं करता है? – Joey

2

अगर यह अब तक प्रासंगिक है मैं नहीं जानता, लेकिन जब एक ही बात के लिए खोज, मैं वेब में एक बहुत अच्छा कार्यान्वयन, http://macdevcenter.com/pub/a/mac/2002/03/22/vertical_text.html

इसे देखें पाया, यह है लंबवत पाठ के साथ TabbedPane पर एक कार्यान्वयन, देखें कि यह आपके उद्देश्यों को सुइट करता है या नहीं।

2

मेरे पास इसके साथ एक खेल है, यह शुरुआत में बहुत अच्छी तरह से काम नहीं कर रहा था क्योंकि लेबल सीमाएं बिल्कुल वर्ग थीं और लेबल के दाईं ओर घटकों को स्थानांतरित करने और अस्पष्ट होने के कारण घटकों का कारण बनता था। लेकिन मुझे तब एहसास हुआ कि ऐसा इसलिए था क्योंकि मैं JGoodies FormLayout का उपयोग कर रहा हूं। यदि आप इस लेआउट मैनेजर का उपयोग करते हैं, तो सुनिश्चित करें कि आप कॉलम आकार को "पसंदीदा" "डिफ़ॉल्ट" पर सेट करें। HTH।

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