2012-03-08 19 views
9

Voglio disegnare in Java Canvas ma non riesco a farlo funzionare perché non so cosa sto facendo. Ecco il mio codice semplice:Disegno in Java con Canvas

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); 
    } 
} 

Nulla appare sulla finestra.

Mi sbaglio pensare che Canvas sia un foglio e Graphics is my Pencil? È così che funziona?

+0

stai solo cercando di disegnare elementi grafici? – John

risposta

31

Suggerimenti:

  • Non utilizzare su tela come non si deve mescolare con AWT componenti Swing inutilmente.
  • Utilizzare invece JPanel o JComponent.
  • Non ottenere l'oggetto grafico chiamando getGraphics() su un componente poiché l'oggetto grafico ottenuto sarà transitorio.
  • Disegna nel metodo paintComponent() di JPanel.
  • Tutto questo è ben spiegato in diversi tutorial che sono facilmente reperibili. Perché non leggerli prima di provare a indovinare questa roba?

collegamenti chiave del tutorial:

+5

Grazie! Ho cercato sul web. Sì, possono essere trovati facilmente, ma non possono essere capiti facilmente. – dpp

+0

Vorrei poter rinunciare ad ogni punto, ma sembra che non usare Canvas for Swing in primo luogo abbia un peso maggiore. –

+0

+1 Buona risposta, penso che questa informazione sia utile al richiedente – John

6

Devi eseguire l'override del metodo paint(Graphics g) della tua Canvas ed eseguire qui il tuo disegno. Vedi the paint() documentation.

Come afferma, l'operazione di default è di cancellare la tela, quindi la chiamata all'oggetto grafico della tela non funziona come ci si aspetterebbe.

1

Perché il primo modo non funziona. L'oggetto Canvas viene creato e la dimensione viene impostata e i grahpics sono impostati. Lo trovo sempre strano Anche se una classe estende JComponent si può ignorare la

paintComponent(){ 
    super... 
} 

e poi non si dovrebbe essere in grado di creare e un'istanza della classe all'interno di un'altra classe e poi basta chiamare NewlycreateinstanceOfAnyClass.repaint();

Ho provato questo approccio per alcune programmazioni di giochi ho lavorato e non sembra funzionare nel modo in cui penso che dovrebbe essere.

Doug Hauf

1

Il seguente dovrebbe funzionare:

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(); 
    } 
} 
Problemi correlati