दिलचस्प पोस्ट
UIPageViewController में बाउंस प्रभाव अक्षम करें MySQL दिन, घंटा, मिनट, दूसरे प्रारूप में टाइम-ईफ आउटपुट बदलता है हॉटस्पॉट जेवीएम में कम्प्रेश्ड स्ट्रिंग्स का समर्थन किया जा रहा है? इंस्टॉल पर स्वचालित रूप से एक विंडोज सर्विस शुरू करें फ़ाइल के बाद फाइल को बंद करना। जावा 8 में यह सामान्य कोड कम्पाइल क्यों करता है? ओपन फाइल संवाद MVVM प्रारंभ / अंत विंडो के साथ जुड़ें रोल तैयार करने के लिए इस्तेमाल करने के तरीके आरएम, सीपी, एमवी कमांड्स के लिए तर्क सूची बहुत लंबी त्रुटि है पृष्ठभूमि में StartUpdateLocations, अपग्रेडिंगटोक स्थान केवल 10-20 बार कहा जाता है ताज़ा करने के बिना एक पृष्ठ पर डेटा अपडेट करें कंपैटर-अवरोही क्रम (उपयोगकर्ता परिभाषित कक्षाएं) का उपयोग करके छंटनी एक फ़ोन कॉल को प्रोग्रामेटिक रूप से बनाएं स्क्रीन आकार में बिटमैप कैसे स्केल करें?

जेपीएनएल के कार्य के बारे में चिंताएं: पेंटवॉम्पोनेंट ()

नमस्ते मैं जावा प्रोग्रामिंग में नया हूँ, और मुझे किसी को यह कोड की ये रेखाएँ समझाए जाने की आवश्यकता है:

public class drawpanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); ... } } 

मैं लाइन public void paintComponent(Graphics g) समझ नहीं पा रहा हूं: मुझे उस फ़ंक्शन की तरह ही घोषित करना पड़ता है, अगर यह जेपीएनएल में पूर्वनिर्धारित है?

और यह लाइन super.paintComponent(g) : मैं इसे बिल्कुल समझ नहीं पा रहा हूं। आपके सहयोग के लिए धन्यवाद।

Solutions Collecting From Web of "जेपीएनएल के कार्य के बारे में चिंताएं: पेंटवॉम्पोनेंट ()"

मूल संरचना:

DrawPanel कीवर्ड का मतलब है कि DrawPanel को DrawPanel मिला है। दूसरे शब्दों में, DrawPanel "एक है" DrawPanel जैसे, यह अपने तरीकों को ओवरराइड कर सकता है (जिनको final रूप से चिह्नित नहीं किया गया है)। आप कई कारणों से ऐसा कर सकते हैं। उदाहरण के लिए, आप पैनल के Graphics क्लास तक पहुंच प्राप्त करना चाह सकते हैं, जिसे आप पैनल पर एक मंडल, या बार ग्राफ या पाठ की एक स्ट्रिंग आकर्षित करने के लिए उपयोग कर सकते हैं।

यदि आप किसी भी तरीके को ओवरराइड नहीं करते हैं, तो जब आप JPanel बढ़ाते हैं तो आपको ऐसा कुछ मिलता है:

 public class DrawPanel extends JPanel { //TODO not much } 

हालांकि, यह बहुत उपयोगी नहीं है … जब तक आप केवल नाम AwesomePanel नहीं पसंद करते हैं और इसे AwesomePanel करना चाहते हैं AwesomePanel ( ध्यान दें: ऐसा मत करो )। अगर आपके पास ये सब कुछ है, तो आप बेहतर हैं कि आप सिर्फ JPanel drawPanel = new JPanel(); का एक उदाहरण बना रहे हैं, जैसे: JPanel drawPanel = new JPanel();


paintComponent:

JPanel को विस्तारित करने का उद्देश्य paintComponent विधि को ओवरराइड करना है। JPanel अदृश्य है जब तक आप paintComponent ओवरराइड नहीं करते ( नोट: अदृश्य होने के कारण यह बटन और अन्य घटकों के लिए एक उपयोगी कंटेनर बनाता है )। आप सही हैं कि paintComponent विधि को पूर्व-परिभाषित किया गया है (यदि आप सोच रहे थे तो JComponent क्लास में), लेकिन ये सभी विधि रिक्त JPanel बनाते हैं यदि आप पैनल में कुछ आकर्षित करना चाहते हैं, तो आपको इसे ओवरराइड करना होगा, जैसे:

 public class DrawPanel extends JPanel { @Override public void paintComponent(Graphics g) { // <-- HERE! //TODO draw stuff } } 

नोट: @Override भाग सख्ती से जरूरी नहीं है, लेकिन इसमें शामिल करने के लिए अच्छा अभ्यास है क्योंकि यह नंबर रनटाइम त्रुटियों को कम करता है और कोड पठनीयता में सुधार करता है

अब आपके पास पैनल के लिए Graphics ऑब्जेक्ट g पहुंच है। Graphics एक सहायक वर्ग है जो आपको पैनल पर चीजों को खींचने की अनुमति देता है, जैसे:

 public class DrawPanel extends JPanel { @Override public void paintComponent(Graphics g) { g.drawOval(50, 50, 50, 50); // <-- draws an oval on the panel } } 

super.paintComponent:

उपयोगी रूपक (जो मैंने अभी बनाया है): super.paintComponent(g) कैनवास है, Graphics ऑब्जेक्ट आपका पेंटब्रश है, और super.paintComponent(g) आपका इरेज़र है super.paintComponent(g) (इसके अलावा, JFrame अपने चित्रफलक है।)

तो super.paintComponent(g) विधि को super.paintComponent(g) क्लास super.paintComponent(g) जो कि वर्तमान में पैनल पर खींचा गया है। यह एनीमेशन के लिए उपयोगी है

उदाहरण के लिए, पैनल पर एनालॉग घड़ी को चित्रित करने पर विचार करें। आपको इसे हर दूसरे को रीफ़्रेश करना होगा, इसलिए प्रत्येक सेकंड को आपको पिछली घड़ी को मिटाना होगा और दूसरा हाथ समायोजित करना, घड़ी को फिर से करना होगा। यदि आप घड़ी को फिर से तैयार करने से पहले super.paintComponent(g) नहीं बुलाते हैं, तो यह पुरानी घड़ियों के ऊपर नए घड़ियां बनाए रखेगा और 60 सेकंड में जो आपके पास होगा वह सिर्फ एक चक्र में भर जाएगा, अधिक या कम।

याद रखने के लिए केवल एक और चीज: हमेशा super.paintComponent(g) विधि में पहले कॉल करें, जैसे:

 public class DrawPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); // <-- HERE! g.drawOval(50, 50, 50, 50); } } 

बस। आप मुझसे कभी भी संपर्क कर सकते हैं।


उदाहरण:

मैंने एक सरल उदाहरण बनाया है जो एक पैनल पर पाठ की एक स्ट्रिंग प्रदर्शित करने के लिए इन अवधारणाओं का उपयोग करता है (जिसे एक फ्रेम के अंदर रखा गया है)। TestPanel.java के रूप में अपने IDE में सहेजें

 import java.awt.*; import java.util.*; import javax.swing.*; /** * A frame containing a panel that is sometimes red and sometimes * blue. Also, it displays the word to go with it. * * Inspired by www.sometimesredsometimesblue.com. * */ public class TestPanel extends JPanel { private Random random = new Random(); private boolean isRed; private String s = ""; public TestPanel() { //randomly determine whether the background should be red isRed = random.nextBoolean(); //set the background to blue setBackground(Color.BLUE); s = "BLUE"; //if 'isRed' is true, set the background to red if (isRed) { setBackground(Color.RED); s = "RED"; } } @Override public void paintComponent(Graphics g) { super.paintComponent(g); //write either "RED" or "BLUE" using graphics g.setColor(Color.WHITE); g.setFont(new Font("serif", Font.BOLD, 60)); g.drawString(s, getWidth() / 2 - g.getFontMetrics().stringWidth(s) / 2, getHeight() / 2 + g.getFontMetrics().getHeight() / 2); } //main method: create an instance of TestPanel and output it on a JFrame public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(500, 500); f.setTitle("Sometimes Red, Sometimes Blue"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setContentPane(new TestPanel()); f.setVisible(true); } } 

paintComponent() मूल रूप से अमूर्त वर्ग JComponent में परिभाषित एक विधि है जो घटक जेसीमुन्नेट को प्रत्यक्ष रूप से अप्रत्यक्ष रूप से विस्तारित करते हैं (यदि उजागर किया जाता है) को पेंट कॉमोनेंट () को ओवरराइड करने का विकल्प होता है super.paintComponent(g) कॉल करने के लिए सुपर क्लास को super.paintComponent(g) के कार्यान्वयन (आपके मामले में यह super.paintComponent(g) कहते हैं। आप paintComponent() को ओवरराइड करना चाहते हैं यदि आप Graphics g साथ अन्य सामान करना चाहते हैं, इसके अलावा जेपीएनएल पहले से ही क्या करता है

यदि आपको खींचा जाने पर आपका घटक बदलना है, तो आपको केवल अपनी कक्षा में paintComponent() को परिभाषित करने की आवश्यकता है अपने कस्टम कार्यान्वयन में आपको super.paintComponent(g); को कॉल super.paintComponent(g); अर्थात paintComponent() का आधार वर्ग संस्करण, क्योंकि यह ड्राइंग के लिए घटक तैयार करने के लिए कुछ आवश्यक कार्य करता है।