मुझे एक उदाहरण मिला जिसमें पैनलों में बटन जोड़े गए हैं (JPanel
के उदाहरण) तो पैनलों को कंटेनरों में जोड़ा जाता है (getContentPane()
द्वारा उत्पन्न उदाहरण) और फिर कंटेनर, निर्माण द्वारा, JFrame
(विंडोज़) में शामिल हैं।कंटेंटपेन और जेपीनेल के बीच संबंध क्या है?
मैं कंटेनर से छुटकारा मिला:
मैं दो बातें करने की कोशिश की। अधिक जानकारी में, मैंने पैनल में बटन जोड़े (
JPanel
का उदाहरण) और फिर मैंने विंडोज़ में पैनल जोड़ा (JFrame
का उदाहरण)। यह ठीक काम किया।मैंने पैनलों से छुटकारा पा लिया। अधिक जानकारी में, मैंने सीधे कंटेनर पर बटन जोड़े और फिर मैंने विंडो में कंटेनर जोड़ा (
JFrame
का उदाहरण)।
तो, मुझे दो चीजें समझ में नहीं आती हैं।
हमारे पास एक ही चीज करने के लिए दो प्रतिस्पर्धी तंत्र क्यों हैं?
पैनलों के साथ संयोजन में कंटेनर का उपयोग करने का क्या कारण है (
JPanel
)? (उदाहरण के लिए, हम जेपीनल में बटन शामिल करने के लिए क्या करते हैं और फिर हम कंटेनरों में जेपीनल शामिल करते हैं)। क्या हमJPanel
JPanel
में शामिल कर सकते हैं? क्या हम कंटेनर में एक कंटेनर शामिल कर सकते हैं?
जोड़ा:
frame.getContentPane().add(panel);
क्या के लिए हम में getContentPane()
डाल के बीच:
हो सकता है कि मेरे सवाल का सार कोड में से एक लाइन में रखा जा सकता है? मैंने बस frame.add(panel);
की कोशिश की और यह ठीक काम करता है।
जोड़ा 2:
मैं चाहते हैं कि मैं क्या मतलब के बारे में अधिक स्पष्ट होना कुछ कोड जोड़ने के लिए। इस उदाहरण में मैं केवल JPane का उपयोग करें:
import java.awt.*;
import javax.swing.*;
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorldSwing");
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(new JButton("W"), BorderLayout.NORTH);
panel.add(new JButton("E"), BorderLayout.SOUTH);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
और इस उदाहरण में मैं केवल सामग्री फलक का उपयोग करें:
import java.awt.*;
import javax.swing.*;
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorldSwing");
Container pane = frame.getContentPane();
pane.setLayout(new BorderLayout());
pane.add(new JButton("W"), BorderLayout.NORTH);
pane.add(new JButton("E"), BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
दोनों काम ठीक! मैं सिर्फ यह जानना चाहता हूं कि चीजों को करने के इन दो तरीकों के बीच एक बेहतर (सुरक्षित) है।
@Nate देखें, "आंतरिक रूप से, यह एक जेपीनल का उपयोग कर रहा है" का क्या मतलब है। आपका मतलब है कि कंटेनर एक जेपीनेल का उपयोग कर रहा है? उससे तुम्हारा क्या मतलब है? हालांकि मैं जेपीनेल कंटेनर का उप-वर्ग है। और मैं "setContentPane" से क्या बदल सकता हूं? ठीक। आप कहते हैं कि कंटेनर एक वर्ग है (और मैं हमेशा कंटेनर को कक्षा के रूप में मानता हूं)। लेकिन जेपेन भी एक वर्ग है। हम सिर्फ जेपीन या सिर्फ कंटेनर का उपयोग क्यों नहीं कर सकते?मैं केवल जेपीन का उपयोग करके वही काम करने में सक्षम था। मैं केवल कंटेनरों का उपयोग कर ऐसा करने में भी सक्षम था। – Roman
'जेएफआरएएम' 'getContentPane()' विधि को वापस करने के लिए आंतरिक रूप से 'जेपीनल' ऑब्जेक्ट का उपयोग कर रहा है। यही कारण है कि जॅचरी का जवाब काम करता है। वास्तविक 'जेपीनेल' संदर्भ को 'JFrame.rootPane' फ़ील्ड में दफनाया गया है। आप 'जेएफआरएएम' पर 'setContentPane()' को कॉल करेंगे - उदाहरण के लिए, आप 'frame.add (पैनल) 'से' frame.setContentPane (पैनल)' से अपने पहले उदाहरण में लाइन 10 बदल सकते हैं। 'कंटेनर 'एक वर्ग है। 'जेपीनेल' एक वर्ग है (जो 'कंटेनर' का उप-वर्ग है)। आप रेफरेंस संदर्भों के ऑब्जेक्ट के प्रकार के साथ संदर्भ के प्रकार को भ्रमित कर रहे हैं। 'कंटेनर कंटेनर = नया जेपीनेल()' – Nate
@ स्रोत के बारे में सोचें (http://pragmaticjava.blogspot.com.ar/2008/08/program-to-interface-not-implementation.html) को हटा दिया गया है। – Lucio