BufferedImage in JFrame nicht
versucht, ein Bild zu drucken, in einem Fenster. Läuft alles ohne Fehler, und es funktioniert auch, wenn ich ersetzen Sie die Methode drawImage mit einem anderen graphics-Klasse. Aber das Fenster fehlt das Bild, und ich bin nicht sicher, warum. Wieder, die JFrame Zeug und Grafiken arbeiten gut mit der Zeichnung, andere Grafiken, aber nur nicht zeichnen das Bild hier. Danke.
import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.imageio.*;
import javax.imageio.stream.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
public class GraphicsMovement2 extends JApplet{
BufferedImage image = null;
public static void main(String args[]){
BufferedImage image = null;
try {
File file = new File("C:\\Users/Jonheel/Google Drive/School/10th Grade/AP Computer Science/Junkbin/MegaLogo.png");
ImageInputStream imgInpt = new FileImageInputStream(file);
image = ImageIO.read(file);
}
catch(FileNotFoundException e) {
System.out.println("x");
}
catch(IOException e) {
System.out.println("y");
}
JApplet example = new GraphicsMovement2();
JFrame frame = new JFrame("Movement");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(example);
frame.setSize(new Dimension(1366,768)); //Sets the dimensions of panel to appear when run
frame.setVisible(true);
}
public void paint (Graphics page){
page.drawImage(image, 100, 100, 100, 100, Color.RED, this);
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Definiert haben
image
zweimal...Dies bedeutet im wesentlichen, dass durch die Zeit, die Sie bekommen, um die
paint
Methode, es istnull
als Sie noch nicht initialisiert die Instanz-variable.Einem anderen problem, das Sie haben wird, ist die Tatsache, dass Sie versuchen, laden Sie das Bild von einem statischen Verweis, aber die
image
ist nicht deklariert, wiestatic
. Besser, verschieben Sie diese Logik in den Konstruktor oder eine Instanz-Methode.Nicht verwenden
JApplet
als Ihrem container, wenn Sie sind das hinzufügen zu einerJFrame
, du bist besser mit so etwas wieJPanel
. Es wird Ihnen helfen, wenn es um das hinzufügen Dinge auf den container.RUFEN SIE
super.paint(g)
...in der Tat, NICHT überschreiben derpaint
Methode der top-level-Container wieJFrame
oderJApplet
. Verwenden Sie so etwas wieJPanel
ab und setzen diepaintComponent
- Methode statt. Top-level-Container nicht doppelt gepuffert.Den
paint
Methoden macht eine Menge wichtige Arbeit, und es ist einfach nur einfacherJComponent#paintComponent
... aber vergessen Sie nicht, rufensuper.paintComponent
AKTUALISIERT
Müssen Sie definieren
image
im Kontext es verwendet wird.Weil Sie erklärte, die
image
als ein Instanz-Feld vonGraphicsMovement2
benötigen Sie eine Instanz vonGraphicsMovement2
um zu verweisen.Jedoch, in der Sie
main
Methode, diestatic
Sie auch deklariert eine variable mit dem Namenimage
.Den
paint
Methode derGraphicsMovement2
nicht sehen können, die Variablen, die Sie deklariertmain
nur die Instanz-Feld (dienull
).Um das problem zu beheben, müssen Sie bewegen das laden des Bildes in den Kontext einer Instanz von
GraphicsMovement2
dies lässt sich am besten in unseren Tests (in Ihrem Kontext), aber verschieben Sie das Bild laden in den Konstruktor vonGraphicsMovement2
Die zwei folgenden Beispiele werden zu produzieren das gleiche Ergebnis...
Der Einfache Weg
Der Harte Weg
Nehmen Sie sich die Zeit und Lesen Sie die tutorials
ImagePane
in meinem Beispiel sollte völlig unabhängig voneinander und Wiederverwendung Sicht, ja, es kann, in einem eigenen source-DateiIhre Klasse erweitern sollte nicht JApplet, wenn Sie sich nicht selbst mit applets-das macht keinen Sinn. Stattdessen
Nicht mischen Datei Trennwänden,
sollte ersetzt werden mit: