2012-03-08 15 views
9

का उपयोग कर जावा में चित्रण करना मैं जावा के कैनवास में आकर्षित करना चाहता हूं लेकिन यह काम नहीं कर सकता क्योंकि मुझे नहीं पता कि मैं क्या कर रहा हूं। यहाँ मेरी सरल कोड है:कैनवास

import javax.swing.JFrame; 
import java.awt.Canvas; 
import java.awt.Graphics; 
import java.awt.Color; 

public class Program 
{ 
    public static void main(String[] args) 
    { 
     JFrame frmMain = new JFrame(); 
     frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frmMain.setSize(400, 400); 

     Canvas cnvs = new Canvas(); 
     cnvs.setSize(400, 400); 

     frmMain.add(cnvs); 
     frmMain.setVisible(true); 

     Graphics g = cnvs.getGraphics(); 
     g.setColor(new Color(255, 0, 0)); 
     g.drawString("Hello", 200, 200); 
    } 
} 

कुछ भी नहीं है खिड़की पर दिखाई देता है।

क्या मुझे लगता है कि कैनवास एक पेपर है और ग्राफिक्स मेरा पेंसिल है? क्या यह ऐसे ही कार्य करता है?

+0

तुम सिर्फ ग्राफिक्स आकर्षित करने के लिए कोशिश कर रहे हैं? – John

उत्तर

31

सुझाव:

  • कैनवास का प्रयोग न करें आप स्विंग घटकों अनावश्यक रूप से AWT मिश्रण नहीं किया जाना चाहिए के रूप में।
  • इसके बजाए जेपीनल या जेकंपोनेंट का उपयोग करें।
  • ग्राफिक्स ऑब्जेक्ट प्राप्त होने के कारण getGraphics() पर कॉल करके अपने ग्राफिक्स ऑब्जेक्ट को प्राप्त न करें क्योंकि ग्राफ़िक्स ऑब्जेक्ट प्राप्त किया जाएगा।
  • जेपीनेल की paintComponent() विधि में ड्रा करें।
  • यह सब आसानी से पाए जाने वाले कई ट्यूटोरियल में अच्छी तरह से समझाया गया है। इस सामान पर अनुमान लगाने से पहले उन्हें पहले क्यों नहीं पढ़ा?

कुंजी ट्यूटोरियल लिंक:

+5

धन्यवाद! मैंने वेब पर खोज की। हां वे आसानी से पा सकते हैं, लेकिन आसानी से नहीं समझा जा सकता है। – dpp

+0

इच्छा है कि मैं प्रत्येक बिंदु पर अपवित्र दे सकता हूं, लेकिन ऐसा लगता है कि स्विंग के लिए कैनवास का उपयोग पहले स्थान पर नहीं होता है। –

+0

+1 अच्छा जवाब, मुझे लगता है कि यह जानकारी प्रश्नकर्ता – John

6

आपको अपने कैनवास की paint(Graphics g) विधि को ओवरराइड करना होगा और वहां अपना ड्राइंग करना होगा। the paint() documentation.

जैसा कि यह कहता है, डिफ़ॉल्ट ऑपरेशन कैनवास को साफ़ करना है, इसलिए कैनवास के ग्राफिक्स ऑब्जेक्ट पर आपका कॉल ऐसा नहीं करता है जैसा आप उम्मीद करेंगे।

1

पहला तरीका काम क्यों नहीं होता। कैनवास ऑब्जेक्ट बनाया गया है और आकार सेट है और grahpics सेट हैं। मुझे हमेशा यह अजीब लगता है। इसके अलावा, अगर एक वर्ग JComponent फैली आप

paintComponent(){ 
    super... 
} 

ओवरराइड कर सकते हैं और उसके बाद नहीं आप बनाने में सक्षम और उदाहरण अन्य वर्ग के अंदर होना चाहिए वर्ग की और फिर बस फोन NewlycreateinstanceOfAnyClass.repaint();

मैं इस दृष्टिकोण की कोशिश की है कुछ गेम प्रोग्रामिंग के लिए मैं काम कर रहा हूं और ऐसा लगता है कि यह ऐसा नहीं लगता है कि यह होना चाहिए।

डौग Hauf

1

निम्नलिखित काम करना चाहिए:

public static void main(String[] args) 
{ 
    final String title = "Test Window"; 
    final int width = 1200; 
    final int height = width/16 * 9; 

    //Creating the frame. 
    JFrame frame = new JFrame(title); 

    frame.setSize(width, height); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    frame.setResizable(false); 
    frame.setVisible(true); 

    //Creating the canvas. 
    Canvas canvas = new Canvas(); 

    canvas.setSize(width, height); 
    canvas.setBackground(Color.BLACK); 
    canvas.setVisible(true); 
    canvas.setFocusable(false); 


    //Putting it all together. 
    frame.add(canvas); 

    canvas.createBufferStrategy(3); 

    boolean running = true; 

    BufferStrategy bufferStrategy; 
    Graphics graphics; 

    while (running) { 
     bufferStrategy = canvas.getBufferStrategy(); 
     graphics = bufferStrategy.getDrawGraphics(); 
     graphics.clearRect(0, 0, width, height); 

     graphics.setColor(Color.GREEN); 
     graphics.drawString("This is some text placed in the top left corner.", 5, 15); 

     bufferStrategy.show(); 
     graphics.dispose(); 
    } 
}