Disegno in Java usando Canvas
Voglio disegnare nella tela di Java ma non riesco a farlo funzionare perché non so cosa sto facendo. Ecco il mio semplice codice:
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);
}
}
Non appare nulla sulla finestra.
Sbaglio a pensare che la tela sia una carta e la grafica sia la mia matita? E 'cosi' che funziona?
4 answers
Suggerimenti:
- Non usare Canvas come non si dovrebbe mescolare AWT con componenti Swing inutilmente.
- Invece usa un JPanel o JComponent.
- Non ottenere l'oggetto Graphics chiamando
getGraphics()
su un componente poiché l'oggetto Graphics ottenuto sarà transitorio. - Disegna nel metodo
paintComponent()
di JPanel. - Tutto questo è ben spiegato in diversi tutorial che si trovano facilmente. Perché non leggerli prima di provare a indovinare questo roba?
Link chiave del tutorial:
- Tutorial di base: Lezione: Esecuzione di pittura personalizzata
- Informazioni più avanzate: Pittura in AWT e Swing
Devi sovrascrivere il metodo paint(Graphics g)
della tua tela ed eseguire il tuo disegno lì. Vedere la documentazione di paint ().
Come afferma, l'operazione predefinita è cancellare la tela, quindi la chiamata all'oggetto grafico della tela non funziona come ci si aspetterebbe.
Perché il primo modo non dovrebbe funzionare. Viene creato l'oggetto Canvas e viene impostata la dimensione e vengono impostati i grahpics. Lo trovo sempre strano. Inoltre, se una classe estende JComponent, è possibile sovrascrivere
paintComponent(){
super...
}
E quindi non dovresti essere in grado di creare e istanza della classe all'interno di un'altra classe e quindi chiamare NewlycreateinstanceOfAnyClass.repaint();
Ho provato questo approccio per alcuni giochi di programmazione che ho lavorato e non sembra funzionare nel modo in cui penso che dovrebbe essere.
Doug Hauf
Dovrebbe funzionare quanto segue:
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();
}
}