AWT Bilder und Java

erxx

Mitglied
Hallo Community,

Wie man unschwer am Titel erkennen kann tu ich mich etwas schwer mit dem Umgang mit Bildern und Java.
Ich habe zum Abschluss meines Abiturs ein Projekt zu realisieren. Ich habe mich dafür entschieden mich in Java einzuarbeiten und es in Java umzusetzen. (Eigentlich arbeiten wir in der Schule (NOCH) mit Delphi). Jedenfalls arbeite ich an einem Programm, das helfen soll die Basis des Bruchrechnens zu erlernen. Es soll bestimmte häufige Fehler am Schüler ausfindig machen und dann Videos zum entsprechenden Fehler vorschlagen.

Zur Verschönerung des ganzen hatte ich vor die Brüche anhand von Bildern darzustellen wie man sie mit Hilfe von JDOM & JMathTex erstellen kann.

Bsp:

formule.png



Das Problem liegt aber nun hier, dass ich zwar 1000 Möglichkeiten finde das Bild einzubinden, zB als Icon für ein Label oder direkt am anfang des Konstruktors mit super(); auf eine Klasse zugreifen die das erledigt.

Bei der Methode mit super(); liegt das Problem da, dass das Bild geladen wird bevor überhaupt die zufällig generierten Nenner / Teiler zur Verfügung stehen.

Bei der methode mit dem Label Icon kommt manchmal das hier:

sun.awt.image.PNGImageDecoder$PNGException: crc corruption
at sun.awt.image.PNGImageDecoder.getChunk(PNGImageDecoder.java:699)
at sun.awt.image.PNGImageDecoder.getData(PNGImageDecoder.java:707)
at sun.awt.image.PNGImageDecoder.produceImage(PNGImageDecoder.java:234)
at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:246)
at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)


Ausserdem soll das Bild auch mit jeder initialisierung des Programms ändern (neuer Bruch generiert)...

Die Klasse die das Bild generiert:

Java:
import java.awt.Graphics2D;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.JLabel;

import be.ugent.caagt.jmathtex.TeXConstants;
import be.ugent.caagt.jmathtex.TeXFormula;

public class mathRender {

        public static void RenderIt(String Formula) {
            	TeXFormula formula = new TeXFormula(Formula);
		Icon icon = formula.createTeXIcon(TeXConstants.STYLE_DISPLAY, 25);
		BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight()+20, BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2 = image.createGraphics();
		icon.paintIcon(new JLabel(), g2, 10, 10); // component can't be null
		// fill a file path below
		File file = new File("f:\\formule.png");
		try {
			ImageIO.write(image, "png", file.getAbsoluteFile());
		} catch (IOException ex) {
			//
		}
        }
	public static void main(String[] args) {
       String Formula;
                  Formula = "\\frac{10}{1}\\nbsp + \\nbsp \\frac{1}{10}\\nbsp";
                  RenderIt(Formula);

	}

}


Hier die Klasse die das Bild anzeigen soll und auf die im Konstruktor meines Hauptprogramms mit super zugegriffen werden soll:
Java:
public class imgShow 
        extends Canvas {
    private Image img;
    int x,y;

    public imgShow(String fname) {
       img = getToolkit().getImage(fname);
       MediaTracker mt = new MediaTracker(this);

       mt.addImage(img, 0);
       try {
           //Warten bis das Bild geladen ist.
           //damit getWidth und getHeight funktionieren
           mt.waitForAll();
       } catch (InterruptedException e) {
          // nichts
       }
       repaint();
    }

    public void paint(Graphics g) {
        if(img != null) {
            g.drawImage(img,x,y,this);
        }
    }

    public Dimension getPreferredSize() {
     return new Dimension(
             img.getWidth(this),
             img.getHeight(this)
     );
    }
    public Dimension getMinimumSize() {
       return new Dimension(
         img.getWidth(this),
         img.getHeight(this)
       ); 
    }

    public static void main(String[] args) {

    }



}


dieser code soll direkt oben im Konstruktor stehen:
Java:
super("imgShow");
setBackground(Color.lightGray);
setVisible(true);
//Hinzufügen der Komponente
setLayout(new GridLayout(1,1));
add(new imgShow("formule.png"));
pack();

//Window Listener
addWindowListener(new WindowClosingAdapter(true));
Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken.

Gruss erxx
 
Zuletzt bearbeitet:

javimka

Top Contributor
Wäre es nicht viel einfacher, selbst eine neue Komponente zu schreiben, die von JComponent erbt und im paint-Component das Bild zeichnet? Dann könntest du es auch einfacher verändern, indem du eine Methode setImage(Image image) schreibst, die der Komponente einfach ein neues Image übergibt, welches dann gezeichnet wird.
 

erxx

Mitglied
Erstmal Danke für deine Antwort, jedoch muss ich da nochmal drauf hinweisen dass ich noch lange keine geübter Java Entwickler bin und ich mir unter deiner Antwort nur sehr schwammig vorstellen kann was du meinst.

Könntest du das eventuell anders erklären ?

Danke dir
 

javimka

Top Contributor
Ich stelle mir diese Komponente etwa so vor:
Java:
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JComponent;

public class ImageComponent extends JComponent {

	private Image image;
	
	/**
	 * Default Konstruktor, falls das Image noch nicht existiert
	 */
	public ImageComponent() {
		// krieg ich halt nix
	}
	
	/**
	 * Übergebe der Komponente von Anfang an ein Bild
	 */
	public ImageComponent(Image image) {
		this.image = image;
	}
	
	/**
	 * Übergebe ein neues Image
	 */
	public void setImage(Image image) {
		this.image = image;
		repaint();
	}
	
	/**
	 * Zeichne das Bild
	 */
	@Override
	public void paintComponent(Graphics g) {
		g.drawImage(image,0,0,this);
	}
}
 

erxx

Mitglied
Das Problem ist nicht dass das Bild nicht existiert, sondern dass das Bild reingeladen wird bevor die Zahlen feststehen, das heisst er lädt beim erstenmal nichts, und beim zweiten Mal das beim ersten Mal erstellte Bild.
 

javimka

Top Contributor
hast du hier zwei Programme? Das eine ist mathRender und ein anderes, das dann den Konstruktor, den du oben beschrieben hast, von irgendeiner anderen Klasse aufruft? Du generierst einen Bruch, speicherst das Bild davon auf die Festplatte und liesst es dann wieder ein? Warum so umständlich?

Und nun wird das Frame mit dem Bild also erstellt, bevor das aktuelle Bild auf die Festplatte gespeichert worden ist? Aber wer instanziert denn überhaupt diesen Konstruktor, den du da noch angegeben hast?
 

erxx

Mitglied
Also
ich habe 4 Klassen

1. Frame.java -> der Frame mit etwas Programmausführung
2. imgShow.java -> soll im Konstruktor von Frame.java mit super("imgShow"); etc aufgerufen werden und das Bild soll reingeladen werden.
3. mathRender.java -> nimmt einen FormelString und wandelt es in ein Bild um -> formule.png
4. reigster.java -> allerlei Funktionen zum Ausrechnen... für das Bild nicht relevant.

Falls es ginge das Bild nicht abspeichern und reinladen zu müssen wäre das natürlich sehr viel sauberer...

Edit:

Ich hab mathRender nun so umgeändert dass ich ein Icon als return value habe,

dann im Frame habe ich ein label welches ich mit lblImage.setIcon(mathRender.RenderIt(Formula)); initialisiere.

Dies funktioniert jedenfalls, aber ist es auch sauber?
 
Zuletzt bearbeitet:

javimka

Top Contributor
Sicher viel besser.

Ich habe mir folgende Lösung überlegt:
Java:
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class MathRender {

	private Icon icon;
	
	public MathRender(String formula) {
		icon = renderIt(formula);
	}
	
	public Icon renderIt(String formula) {
		Icon icon = null;
		/*
		 * Hier kreiirst du dein Icon
		 * 
		 * TeXFormula formula = new TeXFormula(Formula);
         * icon = formula.createTeXIcon(TeXConstants.STYLE_DISPLAY, 25);
		 */
		try { // Ich verwende zu Testzwecken ein anderes Icon
			icon = new ImageIcon(new URL("http://www.java-forum.org/images/misc/java_forum_org.gif"));
		} catch (MalformedURLException e) {}
		
		return icon;
	}
	
	/**
	 * erstelle ein JFrame mit der Formel
	 */
	public void start() {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame frame = new JFrame("imgShow");
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				JLabel lbl = new JLabel(icon);
				frame.add(lbl);
				frame.pack();
				frame.setLocationRelativeTo(null);
				frame.setVisible(true);
			}
		});
	}
	
	public static void main(String[] args) {
		String formula = "\\frac{10}{1}\\nbsp + \\nbsp \\frac{1}{10}\\nbsp";
		new MathRender(formula).start();
	}
}
Kannst es ja mal vergleichen
 

erxx

Mitglied
Vielen Dank für die Antwort.
Ist das nicht in etwa das gleiche wie ich es grade umgesetzt habe? Du gibst ein icon als resultat und verwendest das resultat der funktion (das icon) als icon für das Label.
 

WiETiT

Mitglied
Schönen guten Abend!

Ich beschäftige mich zur Zeit auch mit der Darstellung von Formeln in Java.
Konnte soweit auch alles implementieren, jedoch scheitert es bei mir mit der Eingabe der Formel.

Bspw. schaffe ich es nicht eine einfache Sinus-Funktion anzeigen zu lassen (wirft immer eine ParseException).

String formula = "\\sin^{2}{x}"

Den Beispiel-String aus den Beiträgen weiter oben, kann ich ohne Probleme darstellen.

Irgendwie verstehe ich noch nicht so ganz wie ich meinen String aufbauen muss. Außerdem würde mich interessieren warum \\nbsp als Leerzeichen und nicht \, verwendet wird...

Wäre euch sehr dankbar für eine kurze Hilfe :)

mfG WiETiT
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N eclipse Java, bilder benutzten Funktioniert nicht AWT, Swing, JavaFX & SWT 6
A Java Print: Bilder werden zu groß ausgedruckt AWT, Swing, JavaFX & SWT 6
G GUI in Java-Layout+Bilder AWT, Swing, JavaFX & SWT 23
I [Java 6] Tray-Menu und Bilder? AWT, Swing, JavaFX & SWT 3
G Spiel frage zu bilder in java einbinden AWT, Swing, JavaFX & SWT 3
MiMa Fonts, Icons, Bilder in JavaFX Anwendung AWT, Swing, JavaFX & SWT 5
F Bilder zu ausführbarer Jar-Datei hinzufügen AWT, Swing, JavaFX & SWT 5
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
S AffineTranformation Bilder verschwinden von Anzeige bei Pan, Zoom AWT, Swing, JavaFX & SWT 6
G Bilder in javafx Project AWT, Swing, JavaFX & SWT 11
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
Kirby.exe Bilder in GUI einfügen AWT, Swing, JavaFX & SWT 8
T Bilder bei einem JFrame einfügen AWT, Swing, JavaFX & SWT 4
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
L Bilder werden in exportierter Datei nicht geladen AWT, Swing, JavaFX & SWT 6
C Bilder so einbinden, dass sie sich ändern AWT, Swing, JavaFX & SWT 6
J Bilder aus dem SceneBuilder werden in der Jar nicht dargestellt AWT, Swing, JavaFX & SWT 4
TheWhiteShadow JavaFX Bilder werden ungewollt Skaliert AWT, Swing, JavaFX & SWT 1
B JavaFX Bilder in einem Gewissen bereich halten AWT, Swing, JavaFX & SWT 1
J Bilder proportional verkleiner AWT, Swing, JavaFX & SWT 12
E Bilder skalieren AWT, Swing, JavaFX & SWT 4
DaCrazyJavaExpert Swing Bilder überlagern AWT, Swing, JavaFX & SWT 19
A Bilder als Hintergrund AWT, Swing, JavaFX & SWT 2
@SupressWarnings() JavaFX Bilder in executable jar laden AWT, Swing, JavaFX & SWT 5
Sugan JavaFX Bilder drucken AWT, Swing, JavaFX & SWT 0
K JPanel Bilder bei Windows nicht darstellbar AWT, Swing, JavaFX & SWT 6
Sugan Java FX Verzeichnisüberwachung -> Bilder auf GUI anzeigen AWT, Swing, JavaFX & SWT 4
E AWT Bilder als "Array" abspeichern. AWT, Swing, JavaFX & SWT 4
MrSnake Bilder aus Unterordner einfügen AWT, Swing, JavaFX & SWT 2
I 2D-Grafik Bilder Eingefügt, button jetzt im Hintergrund AWT, Swing, JavaFX & SWT 2
C SWT Treeview mit Bilder im Label verändert Expanded Icon AWT, Swing, JavaFX & SWT 1
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
A Mit dem Scene Builder eine Collage erstellen (Bilder beziehen aus Flickr) AWT, Swing, JavaFX & SWT 1
thet1983 JTable Bilder AWT, Swing, JavaFX & SWT 6
GenerationLost Bilder an bestimmten Platz einfügen/Objekte visualisieren AWT, Swing, JavaFX & SWT 1
F Bilder in jFrame einfügen AWT, Swing, JavaFX & SWT 3
J Bilder als Variable an einem Objekt speichern AWT, Swing, JavaFX & SWT 3
I Swing Bilder werden nach Export nicht angezeigt AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Bilder anzeigen AWT, Swing, JavaFX & SWT 4
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
vodkaz JFrame,Bilder und Zeitverzögerung AWT, Swing, JavaFX & SWT 2
A Swing Bilder werden nicht angezeigt AWT, Swing, JavaFX & SWT 3
I SWT Bilder, bzw. ein einzelnes Bild AWT, Swing, JavaFX & SWT 6
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
Xbody 2D-Grafik JavaFX Bilder transformieren AWT, Swing, JavaFX & SWT 2
C 2D-Grafik Steganographie - Verschlüsselung von Dateien in Bildern - Bilder zeigen schwarze Rechtecke AWT, Swing, JavaFX & SWT 13
P Durch Bilder Scrollen AWT, Swing, JavaFX & SWT 2
F Bilder werden nicht in's Array geladen AWT, Swing, JavaFX & SWT 4
K Bilder übereinanderlegen AWT, Swing, JavaFX & SWT 11
windl Querstreifen beim Bilder malen und anpassen an neue CPU AWT, Swing, JavaFX & SWT 12
V Fertige Komponente zum Anzeigen mehrerer Bilder AWT, Swing, JavaFX & SWT 5
Karuka 2D-Grafik Bilder in GridLayout einfügen AWT, Swing, JavaFX & SWT 7
J Bilder in ausführbare jar einbinden AWT, Swing, JavaFX & SWT 7
J Swing Bilder anzeigen in Gridlayout AWT, Swing, JavaFX & SWT 11
H 2D-Grafik Bilder laden ist nicht zuverlässig AWT, Swing, JavaFX & SWT 3
F Bilder ineinander kopieren AWT, Swing, JavaFX & SWT 3
P Bilder verkleinern AWT, Swing, JavaFX & SWT 2
C SWT Mehrere Bilder in GUI laden AWT, Swing, JavaFX & SWT 5
Furtano AWT Skalierung mehrerer Bilder / Histogramme im Fenster AWT, Swing, JavaFX & SWT 4
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
T 2D-Grafik Statisches Hintergrundbild, dynamische Bilder drüber AWT, Swing, JavaFX & SWT 2
C Zwei Bilder übereinander legen AWT, Swing, JavaFX & SWT 1
L [SWT] Daten und Bilder drucken AWT, Swing, JavaFX & SWT 2
S Flickr Bilder in Gui Oberfläche AWT, Swing, JavaFX & SWT 21
L Bilder im JPanel als Hintergrund - Swing AWT, Swing, JavaFX & SWT 2
K Bilder nacheinander einfügen AWT, Swing, JavaFX & SWT 3
H Bilder auf Buttons per Klick tauschen ( Puzzle ) AWT, Swing, JavaFX & SWT 8
H Bilder in Array zufällig anordnen AWT, Swing, JavaFX & SWT 4
P 2D-Grafik Viele Bilder zu einem Video AWT, Swing, JavaFX & SWT 3
J Vergleicher zweier Bilder AWT, Swing, JavaFX & SWT 2
C zwei Bilder nacheinander anzeigen AWT, Swing, JavaFX & SWT 2
L Swing Bilder über andere Bilder laden AWT, Swing, JavaFX & SWT 3
J Bilder überlappen AWT, Swing, JavaFX & SWT 18
P Bilder werden nach Änderung nicht angezeigt AWT, Swing, JavaFX & SWT 15
3 2D-Grafik Rechtecke auf Bilder legen und auslesen AWT, Swing, JavaFX & SWT 4
M Mehrere Bilder auf einmal anzeigen AWT, Swing, JavaFX & SWT 9
P Swing html mit bilder drin AWT, Swing, JavaFX & SWT 12
F Nicht alle Bilder werden angezeigt AWT, Swing, JavaFX & SWT 2
E Bilder auf JFrame AWT, Swing, JavaFX & SWT 7
R Bilder über URL einfügen AWT, Swing, JavaFX & SWT 4
F Applet zeigt Bilder nicht an AWT, Swing, JavaFX & SWT 5
M FileChooser Bilder auswählen AWT, Swing, JavaFX & SWT 8
G Swing Bilder zeichnen AWT, Swing, JavaFX & SWT 28
L Swing Bilder im Icons-Ordner AWT, Swing, JavaFX & SWT 4
U Bilder in Jar werden nicht gefunden AWT, Swing, JavaFX & SWT 5
S SWT Canvas: Flackernde Bilder AWT, Swing, JavaFX & SWT 3
A Bilder vergleichen AWT, Swing, JavaFX & SWT 4
E Swing JTextPane Inhalt(Text und Bilder) als HTML text bekommen AWT, Swing, JavaFX & SWT 3
P Bilder einfügen AWT, Swing, JavaFX & SWT 4
D Swing JEditorPane mit HTML aber ohne Bilder AWT, Swing, JavaFX & SWT 3
S Swing Kleine Bilder in Panel einfügen AWT, Swing, JavaFX & SWT 13
A AWT Bilder als Link verwenden? AWT, Swing, JavaFX & SWT 11
T SWT Wie Bilder aus JAR-Dateien einbinden? AWT, Swing, JavaFX & SWT 12
S Bilder aus der Google Book Search API auslesen AWT, Swing, JavaFX & SWT 3
J Bilder in JScrollPane zentrieren AWT, Swing, JavaFX & SWT 5
M Bilder in einem Textfeld darstellen AWT, Swing, JavaFX & SWT 2
N Bilder aus Infos generieren lassen. Welches Framework? AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben