2010-11-25 9 views
5

मैं जावा स्विंग में एक आभासी पियानो प्रकार कार्यक्रम बना रहा हूं। पियानो चाबी के लिए मेरे क्षेत्र अभी सफेद कुंजी के रूप में सफेद JButtons युक्त एक क्षैतिज BoxLayout के साथ एक JPanel है। मैं काले चाबियाँ भी जोड़ना चाहता हूं, और उन्हें सफेद कुंजी ओवरलैप कराना चाहता हूं।बनाना JButtons ओवरलैप

दो अलग दृष्टिकोण मैं कोशिश की है रहे हैं। एक ओवरलेलेआउट का उपयोग कर रहा है। दुर्भाग्य से ओवरलेलेआउट प्रबंधक के लिए ऑनलाइन अधिक दस्तावेज नहीं है, और यह नेटबीन जीयूआई बिल्डर में उपलब्ध नहीं है। मेरे पास कोई संकेत नहीं है कि इसे कैसे काम करें। मैंने जो दूसरी चीज कोशिश की है वह जेलेयरपेन्स का उपयोग कर रही है। नेटबीन्स में इसके साथ गड़बड़ करने के बाद भी मुझे लगता है कि एक भी बाहर नहीं है।

तो मुझे लगता है मेरे सवाल का बहुत सरल है। अन्य JButtons के शीर्ष पर JButtons जोड़ने के लिए, यदि कोई है, तो सबसे अच्छा तरीका क्या है? या शायद पियानो कुंजी के लिए JButtons का उपयोग करने का एक विकल्प है?

संपादित

मैं संयोजित कर दी है aioobe की और परिणाम मैं चाहता था पाने के लिए dacwe के कोड। मैंने मूल रूप से एओबेब के मूल आयामों (थोड़ा सा बढ़ाया गया) और मोड 7 भाग के साथ डैकवे के जेड-ऑर्डरिंग का भी उपयोग किया। मैंने चीजों को और स्पष्ट करने के लिए कुछ चर भी जोड़े। मेरे पास अब यही है।

import javax.swing.*; 
import java.awt.Color; 

public class Test2 { 

public static void main(String[] args) { 

    JFrame frame = new JFrame("Test"); 

    JLayeredPane panel = new JLayeredPane(); 
    frame.add(panel); 

    int maxKeys = 8; 

    int width = 60; 
    int height = 240; 

    for (int i = 0; i < maxKeys; i++) { 
     JButton b = new JButton(); 
     b.setBackground(Color.WHITE); 
     b.setLocation(i * width, 0); 
     b.setSize(width, height); 

     panel.add(b, 0, -1); 
    } 

    int width2 = 48; 
    int height2 = 140; 
    for (int i = 0; i < maxKeys; i++) { 
     int j = i % 7; 
     if (j == 2 || j == 6) 
      continue; 

     JButton b = new JButton(); 
     b.setBackground(Color.BLACK); 
     b.setLocation(i*(width) + (width2*3/4), 0); 
     b.setSize(width2, height2); 

     panel.add(b, 1, -1); 
    } 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(500,280); 
    frame.setVisible(true); 
    } 
} 

धन्यवाद दोस्तों! अब मुझे किसी भी तरह से इन बटनों पर श्रोता और पाठ संलग्न करने की आवश्यकता है।

उत्तर

5

मैं एक कस्टम PianoLayoutManager लिखने और सफेद बटन तुलना में एक उच्च ज़ेड-ऑर्डर के साथ काले रंग कुंजी स्थिति होगा। अपने खुद के "बाधा" वर्ग आप इस तरह के घटकों को जोड़ने के लिए अनुमति देता है कि बनाएँ:

add(new WhiteKey(), new PianoLayoutConstraint(WHITE, 1); 
add(new WhiteKey(), new PianoLayoutConstraint(WHITE, 2); 
... 
add(new WhiteKey(), new PianoLayoutConstraint(WHITE, n); 

add(new BlackKey(), new PianoLayoutConstraint(BLACK, 1); 
add(new BlackKey(), new PianoLayoutConstraint(BLACK, 2); 
... 
add(new BlackKey(), new PianoLayoutConstraint(BLACK, m); 

से Using Swing Components tutorial trail

नोट: ज़ेड-ऑर्डर के लिए कि घटकों चित्रित किया जाता है निर्धारित करता है। उच्चतम जेड-ऑर्डर पेंट्स वाला घटक पहले और सबसे कम जेड-ऑर्डर पेंट्स वाला घटक आखिरी है। जहां घटक ओवरलैप होते हैं, निचले जेड-ऑर्डर वाले घटक उच्च जेड-ऑर्डर वाले घटक पर पेंट करते हैं।

यहां एक बदसूरत हैक है जो आपको प्रारंभ करने के लिए शून्य-लेआउट का उपयोग करता है।

import java.awt.Color; 
import javax.swing.*; 

class PianoComponent extends JPanel { 

    PianoComponent() { 

     setLayout(null); 

     for (int i = 0; i < 20; i++) { 
      JButton key = new JButton(); 
      key.setBackground(Color.WHITE); 
      key.setLocation(i * 20, 0); 
      key.setSize(20, 120); 
      add(key); 
      setComponentZOrder(key, i); 
     } 

     for (int i = 0; i < 20; i++) { 
      int j = i % 7; 
      if (j == 2 || j == 6) 
       continue; 

      JButton key = new JButton(); 
      key.setBackground(Color.BLACK); 
      key.setLocation(i * 20 + 12, 0); 
      key.setSize(16, 80); 
      add(key); 
      setComponentZOrder(key, 0); 
     } 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     JFrame jf = new JFrame("Piano!"); 
     jf.setSize(400, 200); 
     jf.add(new PianoComponent()); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.setVisible(true); 
    } 
} 

enter image description here

+0

घटक जेड आदेश गड़बड़ कर रहे हैं !! – dacwe

+0

आपको लगता है? मुझे लगता है कि यह अच्छा लग रहा है ... :) – aioobe

+0

एहह, संकलित और चलाया और माउस पर ले जाया गया ... यह फिर से प्रस्तुत किए जाने पर गलत क्रम में बटन प्रस्तुत करेगा। – dacwe

0

GridBag लेआउट विजेट अतिव्यापी समर्थ बनाता है,; आप इच्छित लेआउट बनाने के लिए ओवरलैपिंग स्पैन का उपयोग कर सकते हैं। लेकिन हाँ, अपने लेआउट मैनेजर लिखना अच्छा होगा।

0

मैं स्विंग में एक जोड़े खेल किया है, और मैं यह सिर्फ एक लेआउट प्रबंधक का उपयोग करें या अपने खुद के बनाने के लिए नहीं आसान है पाते हैं। उदाहरण के लिए मेरे पास एक कार्ड गेम और एक कस्टम लेआउट मैनेजर है जो देखता है कि कार्ड कहां खेला गया है और उस स्थिति और वर्तमान पैनल आकार के आधार पर स्थित है।

1

अपने स्वयं के लेआउट प्रबंधक लिखने के अलावा, आप केवल null लेआउटमैनेजर (यानी, स्वचालित लेआउट प्रबंधन नहीं) का उपयोग कर सकते हैं और चाबियाँ मैन्युअल रूप से रख सकते हैं। फिर कंटेनर पर setComponentZOrder का उपयोग यह सुनिश्चित करने के लिए करें कि काले रंग के ऊपर सफेद कुंजी दिखाई दें।

+0

आप एओबोब की समस्याओं को कैसे संभालेंगे? – dacwe

+0

हम्म, मेरे ओएसएक्स पर 1.6.0_22 चल रहा है, मुझे ज़ेड-ऑर्डरिंग के साथ कोई समस्या नहीं दिख रही है। – jackrabbit

3

यह layeredpane का एक उदाहरण है (यह अपेक्षा के अनुसार काम करता है):

public static void main(String[] args) { 

    JFrame frame = new JFrame("Test"); 

    JLayeredPane panel = new JLayeredPane(); 
    frame.add(panel); 


    for (int i = 0; i < 8; i++) { 
     JButton b = new JButton(); 
     b.setBackground(Color.WHITE); 
     b.setLocation(i * 20, 0); 
     b.setSize(20, 100); 

     panel.add(b, 0, -1); 
    } 

    for (int i = 0; i < 4; i++) { 
     JButton b = new JButton(); 
     b.setBackground(Color.BLACK); 
     b.setLocation(10 + i * 40, 0); 
     b.setSize(20, 70); 

     panel.add(b, 1, -1); 
    } 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(400, 300); 
    frame.setVisible(true); 
} 

हालांकि, अगर आप सही क्रम में पियानो चाबियाँ बाहर रखना करने की आवश्यकता है (:)):

alt text

+0

बढ़िया! यह एक मूर्ख सवाल की तरह प्रतीत हो सकता है, लेकिन क्या मैं उन अज्ञात JButtons को ActionListeners और टेक्स्ट असाइन कर सकता हूं? – aharlow

+0

एक और प्रश्न पोस्ट करें ताकि मुझे स्वीकार हो सके! ;) हां, बस 'b.addActionListener (नया एक्शन लिस्टनर() {सार्वजनिक शून्य क्रियाप्रदर्शित (एक्शनवेन्ट एई) {/ * आपका कोड * /}} जोड़ें; '' – dacwe

0

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

हालांकि, साफ हिस्सा यह है कि कुंजी क्लिक करते समय वास्तव में ध्वनि उत्पन्न करते हैं।

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