2012-03-08 19 views
9

Quiero dibujar en el lienzo de Java pero no puedo hacer que funcione porque no sé lo que estoy haciendo. Aquí está mi código simple:Dibujo en Java usando 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); 
    } 
} 

No aparece nada en la ventana.

¿Me equivoco al pensar que Canvas es un papel y Graphics es mi Lápiz? ¿Así es como funciona?

+0

se acaba de intentar dibujar los gráficos? – John

Respuesta

31

Sugerencias:

  • no utilice lienzo, ya que no se debe mezclar con AWT componentes Swing innecesariamente.
  • En su lugar use un JPanel o JComponent.
  • No obtenga su objeto Graphics llamando al getGraphics() en un componente ya que el objeto Graphics obtenido será transitorio.
  • Dibuje en el método paintComponent() de JPanel.
  • Todo esto está bien explicado en varios tutoriales que se encuentran fácilmente. ¿Por qué no leerlos primero antes de intentar adivinar estas cosas?

enlaces clave tutorial:

+5

Gracias! Yo busqué en la web. Sí, se pueden encontrar fácilmente, pero no se pueden entender fácilmente. – dpp

+0

Desearía poder dar un voto al alza en cada punto, pero parece que no usar Canvas para Swing en primer lugar tiene un peso importante. –

+0

+1 Buena respuesta, creo que esta información es útil para el asker – John

6

Tiene que anular el método paint(Graphics g) de su lienzo y realizar su dibujo allí. Ver the paint() documentation.

Como se indica, la operación predeterminada es borrar el lienzo, por lo que su llamada al objeto de gráficos del lienzo no funciona como era de esperar.

1

¿Por qué la primera forma de no trabajar. Se crea el objeto de lienzo y se establece el tamaño y se establecen los grahpics. Siempre me parece extraño. Además, si una clase se extiende JComponent puede sustituir la

paintComponent(){ 
    super... 
} 

y luego no debe ser capaz de crear y la instancia de la clase dentro de otra clase y luego llamas a NewlycreateinstanceOfAnyClass.repaint();

He intentado este enfoque para algunos juegos de programación he estado trabajando y no parece funcionar de la manera que creo que debería ser.

Doug Hauf

1

El siguiente debería funcionar:

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(); 
    } 
} 
Cuestiones relacionadas