2009-11-19 8 views
11

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

 

public class MyClass extends JPanel 
{ 
    private JLayeredPane layeredPane; 
    private JLabel imageContainer = new JLabel(); 
    private JButton info = new JButton("i"); 

    MyClass(ImageIcon image) 
    { 
     super(); 

     this.imageContainer.setIcon(image); 

     this.layeredPane = new JLayeredPane(); 
     layeredPane.setPreferredSize(new Dimension(300, 300)); 
     layeredPane.add(imageContainer, new Integer(50)); 
     layeredPane.add(info, new Integer(100)); 

     this.add(layeredPane); 
    } 
}  
 
+1

बिना किसी प्रकार के फ्रेम में MyClass कहां और कैसे जोड़ते हैं, वहां कोई जानकारी नहीं है कि आप गलत कहां गए हैं। –

उत्तर

15
tutorial

डिफ़ॉल्ट रूप से एक स्तरित फलक कोई लेआउट प्रबंधक है से

। इसका मतलब यह है कि आपको आम तौर पर उस कोड को लिखना होता है जो आपके द्वारा एक स्तरित फलक में रखे गए घटकों को स्थान और आकार देता है। एक ही पंक्ति में उद्घाटन ब्रेस डाल करने के लिए

1) यह (बेहतर है मेरी राय में):

import java.awt.*; 
import javax.swing.*; 
public class MyClass extends JPanel { 
    private JLayeredPane layeredPane; 
    private JLabel imageContainer = new JLabel(); 
    private JButton info = new JButton("i"); 

    MyClass(ImageIcon image) { 
     super(); 

     this.imageContainer.setIcon(image); 

     this.layeredPane = new JLayeredPane(); 
     layeredPane.setPreferredSize(new Dimension(300, 300)); 
     layeredPane.add(imageContainer, new Integer(50)); 
     layeredPane.add(info, new Integer(100)); 
     this.add(layeredPane); 
     // CHANGED CODE 
     // Manually set layout the components. 
     imageContainer.setBounds(0, 0, 
            image.getIconWidth(), 
            image.getIconHeight()); 
     info.setBounds(200, 00, 50, 40); 
    } 
    public static void main(String [] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new MyClass(new ImageIcon("logo.png") )); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
}  

अतिरिक्त नोट्स:

आपके कोड में परिवर्तन देखें। इस तरह अधिकांश जावा कोड दिखता है।

2) यदि आप वास्तव में उप-वर्ग नहीं बना रहे हैं तो जेपीनेल (या कोई अन्य घटक) से विरासत से बचें। आप इसे प्राप्त करने के बिना सीधे इसका उपयोग कर सकते हैं (जब तक कि आप वास्तव में एक नया घटक नहीं बना रहे हैं।

+2

उत्तर के लिए धन्यवाद! उद्घाटन ब्रेस टिप्पणी के जवाब में, मुझे ऐसा करने का कारण सफेद अंतरिक्ष पठनीयता के कारण नहीं है। मुझे लगता है कि यह एक दृश्य डिजाइन चिंता है क्योंकि इसका कोई प्रभाव नहीं पड़ता है। इससे मुझे और मुझे पता है यह दूसरों (सभी नहीं) की मदद करता है जो कोड से परिचित नहीं हैं। – asawilliams

+0

@asawilliams: वास्तव में इसका कोई अन्य प्रभाव नहीं है लेकिन कोड पठनीयता। यदि आप पहले से ही उस शैली के बारे में जानते थे और आप जानबूझकर इसे टाल रहे हैं तो मुझे लगता है कि यह ठीक है। मैं वैसे भी सिफारिश करता हूं जो इसे नहीं जानते हैं। मुझे लगता है कि अन्य प्रोग्रामिंग भाषाओं से आने वाले डेवलपर्स इस शैली को अपनाने के लिए विरोध करते हैं। किसी भी मौके से आप पीआर पहले घुंघराले ब्रेसिज़ प्रोग्रामिंग भाषा में ogram? सहायता के लिए, आपका स्वागत है;) – OscarRyz

+0

हाँ, सी, सी ++, सी #, एक्शनस्क्रिप्ट 3, PHP, ...। यह वही तरीका था जो मुझे सिखाया गया था। मैं समझ सकता हूं कि कुछ प्रोग्रामर कैसे तंग कोड चाहते हैं, लेकिन मुझे वरीयता के अलावा इसे करने का कोई अन्य कारण नहीं दिखता है। – asawilliams

4

JLayeredPane, डिफ़ॉल्ट रूप से एक अशक्त लेआउट प्रबंधक है। आप JLayeredPane पर एक लेआउट मैनेजर सेट कर सकते हैं, लेकिन यह संभवतः स्तरित प्रतिपादन को अस्वीकार कर देगा जो मैं अनुमान लगा रहा हूं, क्योंकि आप एक स्तरित फलक का उपयोग कर रहे हैं।

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