Bilderschau Bild Skalieren

Status
Nicht offen für weitere Antworten.

Jomama09

Aktives Mitglied
Habe eine Bilderschau soweit fertig, jetzt fehlt mir noch eine Kleinigkeit.
Habe es soweit hinbekommen, das ein Bild skaliert wird wenn der haken sitzt, leider ist ein bereits ausgewähltes Bild nicht möglich. Ich möchte aber das auch ein bereits angezeigtes Bild durch anklicken der JCheckbox noch geändert wird. Hat vielleicht jemand einen Tip. Habe bereits soweit ich meine alles vorbereitet Listener für die Checkbox.
Code einfach mal ansehen. ???:L


[Java]
package bildbetrachter;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;


public class Bildbetrachter extends JFrame{

//automatisch über Eclipse ergänzt
private static final long serialVersionUID = 5926848670766709720L;

//für die Schaltflächen
private JButton oeffnen, beenden, oeffnenSchau, beendenSchau;
//für die Eingabe
private JTextField eingabe;
//für die Anzeige
private BildPanel bildAnzeige, bildAnzeigeSchau;
//für die Anpassung
private JCheckBox skalieren;
// Drehfeld für die Zeitspanne
private JSpinner zeitschalter;
// Variable für die Anzeigendauer
private int anzeigenDauer;
// Variable für den Wert im Spinner
private int sekunden;

//die innere Klasse mit dem Listener
class MeinListener implements ActionListener, ChangeListener,ItemListener {

@Override
public void actionPerformed(ActionEvent e) {
//für die Schaltflächen zum Beenden
if (e.getActionCommand().equals("Ende"))
System.exit(0);
//für die Auswahl eines einzelnen Bildes
if (e.getActionCommand().equals("Laden"))
bildLaden();
//für die Auswahl der Bilder für die Bilderschau
if (e.getActionCommand().equals("LadenSchau"))
bilderSchau();

// Grundeinstellung Sekundenanzeige des Drehfeldes
sekunden = 5;
//Grundeinstellung für die Pause bei der Bilderschau in Millisekunden
anzeigenDauer = 1000 * sekunden;}

// Reaktion auf Statuswechsel in dem Drehfeld
// Abfrage des Spinnerwertes und Ändern der Anzeigendauer
@Override
public void stateChanged(ChangeEvent e) {
if (e.getSource()instanceof JSpinner){
int sekunden = (Integer) zeitschalter.getValue();
anzeigenDauer = 1000 * sekunden;
}
}
// Änderung an der JCheckbox feststellen und reagieren
// Bild sofort skalieren
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getSource()instanceof JCheckBox)
;
}
}
//der Konstruktor
public Bildbetrachter(String titel) {
super(titel);
initGUI();
}
//die Methode zum Erstellen der Oberfläche
private void initGUI() {
//die Panels für die Register
JPanel registerEinzel = new JPanel();
JPanel registerSchau = new JPanel();

//das TabbedPane
JTabbedPane panelKomplett = new JTabbedPane();

//das Register für die Einzelanzeige
//eine neue Instanz für das Panel mit der Grafik erzeugen
bildAnzeige = new BildPanel();

//die Komponenten erstellen und einbauen
registerEinzel.setLayout(new FlowLayout(FlowLayout.LEFT));
registerEinzel.add(bildAnzeige);

oeffnen = new JButton("Bild laden");
beenden = new JButton("Beenden");
oeffnen.setActionCommand("Laden");
beenden.setActionCommand("Ende");
eingabe = new JTextField(20);

skalieren = new JCheckBox("Anpassen");

registerEinzel.add(new JLabel("Bilddatei: "));
registerEinzel.add(eingabe);
registerEinzel.add(skalieren);
registerEinzel.add(oeffnen);
registerEinzel.add(beenden);

//die Listener verbinden
MeinListener listener = new MeinListener();
oeffnen.addActionListener(listener);
beenden.addActionListener(listener);
skalieren.addItemListener(listener);

//das Register für die Bilderschau
//eine neue Instanz für das Panel mit der Grafik erzeugen
bildAnzeigeSchau = new BildPanel();

//die Komponenten erstellen und einbauen
registerSchau.setLayout(new FlowLayout(FlowLayout.LEFT));
registerSchau.add(bildAnzeigeSchau);

oeffnenSchau = new JButton("Bilder laden");
beendenSchau = new JButton("Beenden");
oeffnenSchau.setActionCommand("LadenSchau");

// Variable setzen für zeitschalter Drehfeld
SpinnerNumberModel drehFeldModel = new SpinnerNumberModel(5,0,10,1);
zeitschalter = new JSpinner(drehFeldModel);
//die Schaltfläche zum Beenden bekommt dasselbe ActionCommand wie im anderen Register
beendenSchau.setActionCommand("Ende");

registerSchau.add(oeffnenSchau);
registerSchau.add(beendenSchau);
registerSchau.add(zeitschalter);

//die Listener verbinden
oeffnenSchau.addActionListener(listener);
beendenSchau.addActionListener(listener);
zeitschalter.addChangeListener(listener);

//und nun alles zusammenbauen

panelKomplett.add("Einzelbild",registerEinzel);
panelKomplett.add("Bilderschau",registerSchau);

add(panelKomplett);

//Größe setzen, anzeigen, keine Größenänderungen zulassen und Standard-Verhalten festlegen
setSize(350,450);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}

//die Methode zum Laden eines Bildes über den Dialog
private void bildLaden() {
//einen Standard-Öffnen-Dialog erzeugen
BildbetrachterDialog dialog = new BildbetrachterDialog();
//die Rückgabe holen
String datei = dialog.dialogZeigen();
//wenn eine Datei ausgewählt wurde, laden
if (datei != null) {
bildAnzeige.grafikLaden(datei, skalieren.isSelected());
//den Namen der Datei im Eingabefeld anzeigen
eingabe.setText(datei);
}
}

//die Methode zur Anzeige der Bilderschau
private void bilderSchau() {
//einen Standard-Öffnen-Dialog erzeugen
BildbetrachterDialog dialogSchau = new BildbetrachterDialog();
//die Rückgabe holen und in einem Array vom Typ File ablegen
File[] dateien = dialogSchau.dialogZeigenMehrere();

//wenn eine Datei ausgewählt wurde, alle Dateien nacheinander anzeigen
if (dateien != null) {
for (File datei: dateien) {
bildAnzeigeSchau.grafikLaden(datei.toString(), true);
//nach jeder Datei machen wir eine kurze Pause
// Wert wird über JSpinner gesetzt
try {
Thread.sleep(anzeigenDauer);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
[/Java]

und hier das AnzeigePanel

[Java]
package bildbetrachter;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;

//die Klasse erzeugt ein Panel, in das eine Grafik geladen werden kann

public class BildPanel extends JPanel{
//automatisch über Eclipse ergänzt
private static final long serialVersionUID = 7482508662820162216L;

//für das Bild
private BufferedImage bild;

//für die Änderungen beim Skalieren
private double neueBildBreite;
private double neueBildHoehe;

//der Konstruktor
//er setzt die Größe, zeichnet einen Rahmen
//und beschafft den Grafik-Kontext
public BildPanel() {
setPreferredSize(new Dimension(300,300));
setBorder(new BevelBorder(BevelBorder.LOWERED));
}

//die Methode zum Laden der Grafik
//der Name der Datei wird als Zeichenkette übergeben
//skaliert steuert, ob die Bildgröße angepasst wird oder nicht
public void grafikLaden(String datei, boolean skaliert) {
//eine lokale Variable für die Änderung der Proportionen
double proportion;

//die Ausnahmebehandlung ist zwingend erforderlich
try {
bild = ImageIO.read(new File(datei));
//soll das Bild angepasst werden?
if (skaliert == true) {
//ist das Bild höher als breit?
if (bild.getHeight() > bild.getWidth())
//dann ermitteln wir die optimale neue Höhe
proportion = (double) this.getSize().height / bild.getHeight();
else
//sonst die optimale neue Breite
proportion = (double) this.getSize().width / bild.getWidth();
}
else
//wenn nicht, bleibt die Proportion unverändert
proportion = 1.0;
//die "neue" Breite und Höhe berechnen
//die Variablen müssen als Instanzvariablen vom Typ double vereinbart werden
neueBildBreite = proportion * bild.getWidth();
neueBildHoehe = proportion * bild.getHeight();
//den Grafik-Kontext beschaffen
Graphics grafikKontext = this.getGraphics();
//die Anzeige löschen
grafikKontext.clearRect(0, 0, this.getSize().width, this.getSize().height);
//das Bild anzeigen
//dabei wird die neue Höhe und Breite berücksichtigt
grafikKontext.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this);
}
catch (IOException e) {
JOptionPane.showMessageDialog(this.getParent(), "Beim Laden hat es ein Problem gegeben", "Fehler", JOptionPane.ERROR_MESSAGE);
}
}

//die Methode zum Neuzeichnen überschreiben, damit die Bilder nicht verschwinden
@Override
protected void paintComponent(Graphics g) {
//die Methode zum Neuzeichnen der übergeordneten Klasse aufrufen, damit es keine Probleme gibt
super.paintComponent(g);
//wenn ein Bild angezeigt wurde, neu zeichnen lassen
if (bild != null)
g.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this);
}
}
[/Java]

Vielen Dank
 

hdi

Top Contributor
Naja, einfach nen Getter und Setter für das BufferedImage-Objekt in deinem AnzeigePanel. Erst holst du es dir, dann ersetzt du es durch eine skalierte Version und rufst ein repaint() auf dem AnzeigePanel auf.
 

Der Müde Joe

Top Contributor
Hab das ganze nur überflogen. Aber das:
this.getGraphics();
ist fast immer falsch.

[edit]Gezeichnet wir immer in der paint bzw painComponent Methode. Wie hdi beschrieben hat: Bild holen. Original speichern, Scalen und speichern, ins panel geben und repaint() aufrufen[/edit]

Wenn du speed willst beim sklaieren:
The Perils of Image.getScaledInstance() | Java.net
Den lesen.

Irgendwo hab ich ein gutes Beispielprogramm..aber ich finds auf meiner HD net.
 
Zuletzt bearbeitet:

Jomama09

Aktives Mitglied
Na das hört sich Super einfach an, aber leider als Anfänger nicht so leicht umzusetzen.
Ist das erste mal das ich was mit Bildern mache.
Na zuerst muss ich doch Prüfen ob skalieren an ist, wenn ja das Bild holen, skalieren und neu Anzeigen lassen.
Nur wie macht man das mit Setter/Getter Methoden bei Bildern ?

Ein Beispiel wäre sicher hilfreich. Meiner Meinung nach müsste ich ja im ersten Code ab Zeile 78 auf die JCheckbox reagieren.

Vielen Dank
 

hdi

Top Contributor
Du gibts der Klasse AnzeigePanel einen Getter und Setter für das bild, das dieses Panel zum Malen verwendet:

Java:
class AnzeigePanel{

    private BufferedImage image; // das hast du ja schon

public BufferedImage getImage(){
    return image;
}

public void setImage(BufferedImage image){
    this.image = image;
}

// ...
}

In der Checkbox:

Java:
BufferedImage imageNow = meinAnzeigePanel.getImage();
BufferedImage scaled = ... // skalieren
meinAnzeigePanel.setImage(scaled);
meinAnzeigePanel.repaint();

Wie du prüfst ob es schon skaliert ist oder nicht kannst du machen wie du willst. Entweder du erstellst dafür auch noch nen boolean im AnzeigePanel (wieder mit Getter und Setter um den Status zu erfragen oder zu ändern), oder du prüfst es direkt zB über die Größe des Bildes. Dafür gibt es ja Methoden für BufferedImages.
 

Der Müde Joe

Top Contributor
ein anders Bespiel:
(den Skalierer musst du dir selber basteln)
Java:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;


public final class ImageFrame {

	private BufferedImage image;

	private JFrame frame;

	private ImagePanel imagePanel;

	public ImageFrame(BufferedImage image) {
		this.image = image;
		init();
	}

	private void init() {
		frame = new JFrame("Screenshot");
		frame.setSize(600, 450);
		frame.addComponentListener(new ResizeListener());
		imagePanel = new ImagePanel(image);
		frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		frame.getContentPane().add(imagePanel);
		frame.setVisible(true);
	}

	static class ImagePanel extends JPanel {

		private final BufferedImage image;

		private Image scaledImage;

		public ImagePanel(BufferedImage image) {
			this.image = image;
		}

		public void scale(double scale) {
			// do up or downscaling
			scaledImage = ImageUtils.getScaledImage(image, scale);
			super.repaint();
		}

		@Override
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.drawImage(scaledImage, 0, 0, null);
		}
	}

	class ResizeListener extends ComponentAdapter {

		@Override
		public void componentResized(ComponentEvent e) {
			// do some scale
			Dimension d = e.getComponent().getSize();
			double xScale = (double) image.getHeight() / d.height;
			imagePanel.scale(1d / xScale);
		}
	}

	public static void main(String[] args) throws Exception {
		BufferedImage testImage = ImageIO.read(new File("/home/....some pic"));
		new ImageFrame(testImage);
	}
}
 

Jomama09

Aktives Mitglied
Hi Leute habe Versucht das hinzubekommen, leider habe ich es immer noch nicht ganz geschafft.
Habe noch mal beide Dateien als Code beigefügt. Ich muss qusi ja "nur" noch hinbekommen, das ein Bild was bereits
im Panel steht sofort skaliert wird,wenn die Checkbox aktiviert wird.

[Java]
package bildbetrachter;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;


public class Bildbetrachter extends JFrame{

//automatisch über Eclipse ergänzt
private static final long serialVersionUID = 5926848670766709720L;

//für die Schaltflächen
private JButton oeffnen, beenden, oeffnenSchau, beendenSchau;
//für die Eingabe
private JTextField eingabe;
//für die Anzeige
private BildPanel bildAnzeige, bildAnzeigeSchau;
//für die Anpassung
private JCheckBox skalieren;
// Drehfeld für die Zeitspanne
private JSpinner zeitschalter;
// Variable für die Anzeigendauer
private int anzeigenDauer;
// Variable für den Wert im Spinner
private int sekunden;

//die innere Klasse mit dem Listener
class MeinListener implements ActionListener, ChangeListener,ItemListener {

@Override
public void actionPerformed(ActionEvent e) {
//für die Schaltflächen zum Beenden
if (e.getActionCommand().equals("Ende"))
System.exit(0);
//für die Auswahl eines einzelnen Bildes
if (e.getActionCommand().equals("Laden"))
bildLaden();
//für die Auswahl der Bilder für die Bilderschau
if (e.getActionCommand().equals("LadenSchau"))
bilderSchau();

// Grundeinstellung Sekundenanzeige des Drehfeldes
sekunden = 5;
//Grundeinstellung für die Pause bei der Bilderschau in Millisekunden
anzeigenDauer = 1000 * sekunden;}

// Reaktion auf Statuswechsel in dem Drehfeld
// Abfrage des Spinnerwertes und Ändern der Anzeigendauer
@Override
public void stateChanged(ChangeEvent e) {
if (e.getSource()instanceof JSpinner){
int sekunden = (Integer) zeitschalter.getValue();
anzeigenDauer = 1000 * sekunden;
}
}
// Änderung an der JCheckbox feststellen und reagieren
// Bild sofort skalieren
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getSource()instanceof JCheckBox);
}
}
//der Konstruktor
public Bildbetrachter(String titel) {
super(titel);
initGUI();
}
//die Methode zum Erstellen der Oberfläche
private void initGUI() {
//die Panels für die Register
JPanel registerEinzel = new JPanel();
JPanel registerSchau = new JPanel();

//das TabbedPane
JTabbedPane panelKomplett = new JTabbedPane();

//das Register für die Einzelanzeige
//eine neue Instanz für das Panel mit der Grafik erzeugen
bildAnzeige = new BildPanel();

//die Komponenten erstellen und einbauen
registerEinzel.setLayout(new FlowLayout(FlowLayout.LEFT));
registerEinzel.add(bildAnzeige);

oeffnen = new JButton("Bild laden");
beenden = new JButton("Beenden");
oeffnen.setActionCommand("Laden");
beenden.setActionCommand("Ende");
eingabe = new JTextField(20);

skalieren = new JCheckBox("Anpassen");

registerEinzel.add(new JLabel("Bilddatei: "));
registerEinzel.add(eingabe);
registerEinzel.add(skalieren);
registerEinzel.add(oeffnen);
registerEinzel.add(beenden);

//die Listener verbinden
MeinListener listener = new MeinListener();
oeffnen.addActionListener(listener);
beenden.addActionListener(listener);
skalieren.addItemListener(listener);

//das Register für die Bilderschau
//eine neue Instanz für das Panel mit der Grafik erzeugen
bildAnzeigeSchau = new BildPanel();

//die Komponenten erstellen und einbauen
registerSchau.setLayout(new FlowLayout(FlowLayout.LEFT));
registerSchau.add(bildAnzeigeSchau);

oeffnenSchau = new JButton("Bilder laden");
beendenSchau = new JButton("Beenden");
oeffnenSchau.setActionCommand("LadenSchau");

// Variable setzen für zeitschalter Drehfeld
SpinnerNumberModel drehFeldModel = new SpinnerNumberModel(5,0,10,1);
zeitschalter = new JSpinner(drehFeldModel);
//die Schaltfläche zum Beenden bekommt dasselbe ActionCommand wie im anderen Register
beendenSchau.setActionCommand("Ende");

registerSchau.add(oeffnenSchau);
registerSchau.add(beendenSchau);
registerSchau.add(zeitschalter);

//die Listener verbinden
oeffnenSchau.addActionListener(listener);
beendenSchau.addActionListener(listener);
zeitschalter.addChangeListener(listener);

//und nun alles zusammenbauen

panelKomplett.add("Einzelbild",registerEinzel);
panelKomplett.add("Bilderschau",registerSchau);

add(panelKomplett);

//Größe setzen, anzeigen, keine Größenänderungen zulassen und Standard-Verhalten festlegen
setSize(350,450);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}

//die Methode zum Laden eines Bildes über den Dialog
private void bildLaden() {
//einen Standard-Öffnen-Dialog erzeugen
BildbetrachterDialog dialog = new BildbetrachterDialog();
//die Rückgabe holen
String datei = dialog.dialogZeigen();
//wenn eine Datei ausgewählt wurde, laden
if (datei != null) {
bildAnzeige.grafikLaden(datei, skalieren.isSelected());
//den Namen der Datei im Eingabefeld anzeigen
eingabe.setText(datei);
}
}

//die Methode zur Anzeige der Bilderschau
private void bilderSchau() {
//einen Standard-Öffnen-Dialog erzeugen
BildbetrachterDialog dialogSchau = new BildbetrachterDialog();
//die Rückgabe holen und in einem Array vom Typ File ablegen
File[] dateien = dialogSchau.dialogZeigenMehrere();

//wenn eine Datei ausgewählt wurde, alle Dateien nacheinander anzeigen
if (dateien != null) {
for (File datei: dateien) {
bildAnzeigeSchau.grafikLaden(datei.toString(), true);
//nach jeder Datei machen wir eine kurze Pause
// Wert wird über JSpinner gesetzt
try {
Thread.sleep(anzeigenDauer);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
[/code]

und
[Java]
package bildbetrachter;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;

//die Klasse erzeugt ein Panel, in das eine Grafik geladen werden kann

public class BildPanel extends JPanel{
//automatisch über Eclipse ergänzt
private static final long serialVersionUID = 7482508662820162216L;

//für das Bild
private BufferedImage bild;

public BufferedImage getImage(){
return bild;
}

public void setImage(BufferedImage image){
this.bild = image;
}

//für die Änderungen beim Skalieren
private double neueBildBreite;
private double neueBildHoehe;

//der Konstruktor
//er setzt die Größe, zeichnet einen Rahmen
//und beschafft den Grafik-Kontext
public BildPanel() {
setPreferredSize(new Dimension(300,300));
setBorder(new BevelBorder(BevelBorder.LOWERED));
}

//die Methode zum Laden der Grafik
//der Name der Datei wird als Zeichenkette übergeben
//skaliert steuert, ob die Bildgröße angepasst wird oder nicht
public void grafikLaden(String datei, boolean skaliert) {
//eine lokale Variable für die Änderung der Proportionen
double proportion;

//die Ausnahmebehandlung ist zwingend erforderlich
try {
bild = ImageIO.read(new File(datei));
//soll das Bild angepasst werden?
if (skaliert == true) {
//ist das Bild höher als breit?
if (bild.getHeight() > bild.getWidth())
//dann ermitteln wir die optimale neue Höhe
proportion = (double) this.getSize().height / bild.getHeight();
else
//sonst die optimale neue Breite
proportion = (double) this.getSize().width / bild.getWidth();
}
else
//wenn nicht, bleibt die Proportion unverändert
proportion = 1.0;
//die "neue" Breite und Höhe berechnen
//die Variablen müssen als Instanzvariablen vom Typ double vereinbart werden
neueBildBreite = proportion * bild.getWidth();
neueBildHoehe = proportion * bild.getHeight();
//den Grafik-Kontext beschaffen
Graphics grafikKontext = this.getGraphics();
//die Anzeige löschen
grafikKontext.clearRect(0, 0, this.getSize().width, this.getSize().height);
//das Bild anzeigen
//dabei wird die neue Höhe und Breite berücksichtigt
grafikKontext.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this);
}
catch (IOException e) {
JOptionPane.showMessageDialog(this.getParent(), "Beim Laden hat es ein Problem gegeben", "Fehler", JOptionPane.ERROR_MESSAGE);
}
}

//die Methode zum Neuzeichnen überschreiben, damit die Bilder nicht verschwinden
@Override
protected void paintComponent(Graphics g) {
//die Methode zum Neuzeichnen der übergeordneten Klasse aufrufen, damit es keine Probleme gibt
super.paintComponent(g);
//wenn ein Bild angezeigt wurde, neu zeichnen lassen
if (bild != null)
g.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this);
}
}
[/code]
Vielen Dank für die Hilfe
 

Jomama09

Aktives Mitglied
Hi Leute kann mir nicht einer bei meinem Problem helfen, kriege das einfach nicht hin.
Es scheint so, als ob mein listener auch garnicht auf änderungen in der JCheckBox reagiert.
Selbst mein Test mit System.out.println("Test"); wurde in der Konsole nicht ausgegeben.

Wäre echt nett wenn mir jemand beim neuzeichnen mit skalierung helfen würde.
 

hdi

Top Contributor
Mach nicht einen "Uber"-Listener der für verschiedene Komponenten zuständig ist. Mach dir nen ActionListener für den Button, und einen anderen für die CheckBox. Du verwendest glaub ich auch die falschen Listener. zB kommt an eine Checkbox für dein Vorhaben denke ich nicht ein ItemListener. Nimm einfach nen ActionListener
 

Jomama09

Aktives Mitglied
Danke für den Tip mit dem Listener hattest du wohl recht, der andere klappt.
Kannst du mir evtl. das mit den set und get Methoden mal auskommentieren.
Und wie ich das mit dem Listener dann fertig bekomme.

Weiss das du es fast schon gelösst hingeschrieben hast ,nur kriege ich das einfach nicht hin.
Werde noch verrückt.

Vielen Dank aus Köln
 

hdi

Top Contributor
Was genau kriegst du nicht hin? Du musst es doch nur so machen wie ich weiter oben gepostet habe. Getter und Setter in deine Panel-Klasse und den anderen Code in den ActionListener deiner Checkbox.
 

Jomama09

Aktives Mitglied
Habe jetzt an meinem Code rumgebastelt, aber mit dem Scale das ist ja nicht fertig.
Bekomme in der Checkbox hier Fehler angezeigt, da ich nicht weiss was da rein muss.
Item soll richtig sein laut Webhandbuch
public synchronized void addItemListener(ItemListener l)
Adds the specified item listener to recieve item events from this checkbox.

Java:
public void itemStateChanged(ItemEvent e) {
				if (e.getSource()instanceof JCheckBox)
				BufferedImage image = bildAnzeige.getImage();
				BufferedImage scaled = ... // skalieren;
				bildAnzeige.setImage(scaled);
				bildAnzeige.repaint();;

hier das sollte ja so stimmen.

Java:
public class BildPanel extends JPanel{
    //automatisch über Eclipse ergänzt
    private static final long serialVersionUID = 7482508662820162216L;
    
    //für das Bild
    private BufferedImage bild;
    
    public BufferedImage getImage(){
        return bild;
    }
    public void setImage(BufferedImage image){
        this.bild = image;
    }
was fehlt noch ?
 

hdi

Top Contributor
Java:
  if (e.getSource()instanceof JCheckBox)
                BufferedImage image = bildAnzeige.getImage();
                BufferedImage scaled = ... // skalieren;
                bildAnzeige.setImage(scaled);
                bildAnzeige.repaint();;

Fehler-den-jeder-mindestens-einmal-in-seinem-Leben-macht #213 ;)

Wenn du die geschweiften Klammern nach dem if weglässt, wird nur die nächste Zeile darauf bezogen. Also dein Code sieht für den Compiler so aus:

Java:
if (e.getSource()instanceof JCheckBox){
         BufferedImage image = bildAnzeige.getImage();
}
BufferedImage scaled = ... // skalieren;
bildAnzeige.setImage(scaled);
bildAnzeige.repaint();

Du musst alle Anweisungen in die geschweiften Klammern packen. Die letzten 3 Anweisungen werden immer ausgeführt, egal wie die if-Bedingung resultiert.
Gleich merken: Immer geschweifte Klammern machen, auch wenn nur eine Anweisung folgt, denn das kann schnell zu dummen Fehlern führen.

Außerdem, nur damit das klar ist:
Java:
           BufferedImage scaled = ... // skalieren;
Das kompiliert nicht, schon klar oder? Du musst nach dem "=" natürlich noch etwas schreiben, und zwar musst du eben eine skalierte Version deines Bildes zurückgeben.

edit: Wie man am effizientesten skaliert kannst du hier nachlesen:
The Perils of Image.getScaledInstance() | Java.net
 
Zuletzt bearbeitet:

eliot

Bekanntes Mitglied
Hallo,

hier eine kleine fixe Lösung:

Java:
public class ScaleImage {

    public static BufferedImage scale(final BufferedImage source, final float factor) {
        final int width = (int) (source.getWidth() * factor);
        final int height = (int) (source.getHeight() * factor);
        final BufferedImage img = new BufferedImage(width, height,
                                                    BufferedImage.TYPE_INT_RGB);
        final Graphics2D g2d = (Graphics2D) img.getGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                             RenderingHints.VALUE_INTERPOLATION_BILINEAR);

        g2d.drawImage(source, 0, 0, width, height, null);
        return img;
    }
}

Java:
public class ScalePanel
        extends JPanel
        implements MouseWheelListener {

    private final BufferedImage orig;
    private float factor;
    public ScalePanel() throws IOException {
        super();
        orig = ImageIO.read(new File("test.png"));
        setVisible(true);
        addMouseWheelListener(this);
        factor=1.0f;
    }

    public void mouseWheelMoved(MouseWheelEvent e) {
        final float rotation=e.getWheelRotation()/100.0f;
       factor+=rotation;
       System.out.println(factor);
       repaint();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (orig != null) {
            g.drawImage(ScaleImage.scale(orig, factor), 0, 0, this);
        }
    }
}

Java:
public class MainFrame
        extends JFrame {

    public MainFrame() {
        super("ScaleImage");
        setBounds(0, 0, 400, 400);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        try {
            add(new ScalePanel());
        } catch (IOException ex) {
            Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
        setVisible(true);
    }

    public static void main(String[] args){
        new MainFrame();
    }
}
 

hdi

Top Contributor
@TO
Du kannst von Eliot die Klasse ScaleImage übernehmen, um deinen Code zu vervollständigen. Lass den Rest aber so wie er bei dir ist.

@Eliot
es ist nicht sonderlich effizient das Skalieren in der paint-Methode zu machen. Wenn ich das Frame nehm und ein wenig auf dem Dekstop verschiebe oder resize, berechnet er mir mal eben in 1 Sek. 500 mal eine skalierte Version des Bildes -> laggy ;) Man sollte das Abspeichern, und per Setter verändern, nur wenn es nötig ist. paint() ist eine sehr kritische Methode, die u.U. sehr sehr oft aufgerufen wird (dass es der EDT ist, der die aufruft, macht es noch ein wenig kritischer), und sollte so schnell "durch" sein wie möglich. Da geht es manchmal in der Tat um ein paar ms.
 
Zuletzt bearbeitet:

eliot

Bekanntes Mitglied
@hdi

War auch nur Quick&Dirty

Hier etwas besser:

Java:
public class ScalePanel
        extends JPanel
        implements MouseWheelListener {

    private final BufferedImage orig;
    private BufferedImage scaled;
    private float factor;

    public ScalePanel() throws IOException {
        super();
        orig = ImageIO.read(new File("test.png"));
        setVisible(true);
        addMouseWheelListener(this);
        factor = 1.0f;
        scaled = orig;
    }

    public void mouseWheelMoved(MouseWheelEvent e) {
        final float rotation = e.getWheelRotation() / 100.0f;
        factor += rotation;
        scaled = ScaleImage.scale(orig, factor);
        repaint();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (scaled != null) {
            g.drawImage(scaled, 0, 0, this);
        }
    }
}

Nur sollte man scaled noch synchronisieren.
Das Skalieren an sich sollte man in einem eigenen Thread machen.
 

Jomama09

Aktives Mitglied
Danke für die Hilfe, habe es wie folgt gelöst.

Falls das selbe Problem einen anderen ereilt.

[Java]
package Diashow;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;

//die Klasse erzeugt ein Panel, in das eine Grafik geladen werden kann

public class BildPanel extends JPanel{
//automatisch über Eclipse ergänzt
private static final long serialVersionUID = 7482508662820162216L;

//für das Bild
private BufferedImage bild;

//für die Änderungen beim Skalieren
private double neueBildBreite;
private double neueBildHoehe;

//der Konstruktor
//er setzt die Größe, zeichnet einen Rahmen
//und beschafft den Grafik-Kontext
public BildPanel() {
setPreferredSize(new Dimension(300,300));
setBorder(new BevelBorder(BevelBorder.LOWERED));
}

//die Methode zum Laden der Grafik
//der Name der Datei wird als Zeichenkette übergeben
//skaliert steuert, ob die Bildgröße angepasst wird oder nicht
public void grafikLaden(String datei, boolean skaliert) {
//eine lokale Variable für die Änderung der Proportionen
double proportion;

//die Ausnahmebehandlung ist zwingend erforderlich
try {
bild = ImageIO.read(new File(datei));
//soll das Bild angepasst werden?
if (skaliert == true) {
//ist das Bild höher als breit?
if (bild.getHeight() > bild.getWidth())
//dann ermitteln wir die optimale neue Höhe
proportion = (double) this.getSize().height / bild.getHeight();
else
//sonst die optimale neue Breite
proportion = (double) this.getSize().width / bild.getWidth();
}
else
//wenn nicht, bleibt die Proportion unverändert
proportion = 1.0;
//die "neue" Breite und Höhe berechnen
//die Variablen müssen als Instanzvariablen vom Typ double vereinbart werden
neueBildBreite = proportion * bild.getWidth();
neueBildHoehe = proportion * bild.getHeight();
//den Grafik-Kontext beschaffen
Graphics grafikKontext = this.getGraphics();
//die Anzeige löschen
grafikKontext.clearRect(0, 0, this.getSize().width, this.getSize().height);
//das Bild anzeigen
//dabei wird die neue Höhe und Breite berücksichtigt
grafikKontext.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this);
}
catch (IOException e) {
JOptionPane.showMessageDialog(this.getParent(), "Beim Laden hat es ein Problem gegeben", "Fehler", JOptionPane.ERROR_MESSAGE);
}
}

//die Methode zum Neuzeichnen überschreiben, damit die Bilder nicht verschwinden
@Override
protected void paintComponent(Graphics g) {
//die Methode zum Neuzeichnen der übergeordneten Klasse aufrufen, damit es keine Probleme gibt
super.paintComponent(g);
//wenn ein Bild angezeigt wurde, neu zeichnen lassen
if (bild != null)
g.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this);
}

}
[/code]
und
Java:
package Diashow;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;



public class Bildbetrachter extends JFrame{
	
	//automatisch über Eclipse ergänzt
	private static final long serialVersionUID = 5926848670766709720L;

	//für die Schaltflächen
	private JButton oeffnen, beenden, oeffnenSchau, beendenSchau;
	//für die Eingabe
	private JTextField eingabe;
	//für die Anzeige
	private BildPanel bildAnzeige, bildAnzeigeSchau;
	//für die Anpassung
	private JCheckBox skalieren;
	// Drehfeld für die Zeitspanne
	private JSpinner zeitschalter;
	// Variable für die Anzeigendauer
	private int anzeigenDauer;
        // Variable für den Wert im Spinner
	private int sekunden;
        // Variable für die Bilddatei
        private String datei;
	
	//die innere Klasse mit dem Listener
	class MeinListener implements ActionListener, ChangeListener,ItemListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			//für die Schaltflächen zum Beenden
			if (e.getActionCommand().equals("Ende"))
				System.exit(0);
			//für die Auswahl eines einzelnen Bildes
			if (e.getActionCommand().equals("Laden")) 
				bildLaden();
			//für die Auswahl der Bilder für die Bilderschau
			if (e.getActionCommand().equals("LadenSchau")) 
				bilderSchau();
			
			// Grundeinstellung Sekundenanzeige des Drehfeldes
			sekunden = 5;
			//Grundeinstellung für die Pause bei der Bilderschau in Millisekunden 
			anzeigenDauer = 1000 * sekunden;}
			
			// Reaktion auf Statuswechsel in dem Drehfeld
		    // Abfrage des Spinnerwertes und Ändern der Anzeigendauer
			@Override
			public void stateChanged(ChangeEvent e) {
	    	if (e.getSource()instanceof JSpinner){
	    		int sekunden = (Integer) zeitschalter.getValue();
	    			anzeigenDauer = 1000 * sekunden;
	    		}
			}
	    	// Änderung an der JCheckbox feststellen und reagieren
			// Bild sofort skalieren
			@Override
			public void itemStateChanged(ItemEvent e) {
			if (e.getSource()instanceof JCheckBox)
                            bildSkalieren();
                        }                                                        
                        }
	//der Konstruktor
	public Bildbetrachter(String titel) {
		super(titel);
		initGUI();
	}
	//die Methode zum Erstellen der Oberfläche
	private void initGUI() {
		//die Panels für die Register
		JPanel registerEinzel =  new JPanel();
		JPanel registerSchau =  new JPanel();

		//das TabbedPane
		JTabbedPane panelKomplett =  new JTabbedPane();
		
		//das Register für die Einzelanzeige
		//eine neue Instanz für das Panel mit der Grafik erzeugen
		bildAnzeige = new BildPanel();
		
		//die Komponenten erstellen und einbauen
		registerEinzel.setLayout(new FlowLayout(FlowLayout.LEFT));
		registerEinzel.add(bildAnzeige);
		
		oeffnen = new JButton("Bild laden");
		beenden = new JButton("Beenden");
		oeffnen.setActionCommand("Laden");
		beenden.setActionCommand("Ende");
		eingabe = new JTextField(20);
		
		skalieren = new JCheckBox("Anpassen");
		
		registerEinzel.add(new JLabel("Bilddatei: "));
		registerEinzel.add(eingabe);
		registerEinzel.add(skalieren);
		registerEinzel.add(oeffnen);
		registerEinzel.add(beenden);
		
		//die Listener verbinden
		MeinListener listener = new MeinListener();
		oeffnen.addActionListener(listener);
		beenden.addActionListener(listener);
		skalieren.addItemListener(listener);
		
		//das Register für die Bilderschau
		//eine neue Instanz für das Panel mit der Grafik erzeugen
		bildAnzeigeSchau = new BildPanel();
		
		//die Komponenten erstellen und einbauen
		registerSchau.setLayout(new FlowLayout(FlowLayout.LEFT));
		registerSchau.add(bildAnzeigeSchau);
		
		oeffnenSchau = new JButton("Bilder laden");
		beendenSchau = new JButton("Beenden");
		oeffnenSchau.setActionCommand("LadenSchau");
		
		// Variable setzen für zeitschalter Drehfeld
		SpinnerNumberModel drehFeldModel = new SpinnerNumberModel(5,0,10,1);
		zeitschalter = new JSpinner(drehFeldModel);
		//die Schaltfläche zum Beenden bekommt dasselbe ActionCommand wie im anderen Register
		beendenSchau.setActionCommand("Ende");
		
		registerSchau.add(oeffnenSchau);
		registerSchau.add(beendenSchau);
		registerSchau.add(zeitschalter);
		
		//die Listener verbinden
		oeffnenSchau.addActionListener(listener);
		beendenSchau.addActionListener(listener);
		zeitschalter.addChangeListener(listener);
		
		//und nun alles zusammenbauen
		
		panelKomplett.add("Einzelbild",registerEinzel);
		panelKomplett.add("Bilderschau",registerSchau);
		
		add(panelKomplett);
		
		//Größe setzen, anzeigen, keine Größenänderungen zulassen und Standard-Verhalten festlegen
		setSize(350,450);
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
	
	//die Methode zum Laden eines Bildes über den Dialog
	private void bildLaden() {
		//einen Standard-Öffnen-Dialog erzeugen
		BildbetrachterDialog dialog = new BildbetrachterDialog();
		//die Rückgabe holen
		datei = dialog.dialogZeigen();
		//wenn eine Datei ausgewählt wurde, laden
		if (datei != null) {
			bildAnzeige.grafikLaden(datei, skalieren.isSelected());
			//den Namen der Datei im Eingabefeld anzeigen
			eingabe.setText(datei);
		}
	}
	
	//die Methode zur Anzeige der Bilderschau
	private void bilderSchau() {
		//einen Standard-Öffnen-Dialog erzeugen
		BildbetrachterDialog dialogSchau = new BildbetrachterDialog();
		//die Rückgabe holen und in einem Array vom Typ File ablegen 
		File[] dateien = dialogSchau.dialogZeigenMehrere();
		
		//wenn eine Datei ausgewählt wurde, alle Dateien nacheinander anzeigen
		if (dateien != null) {
			for (File datei: dateien) {
				bildAnzeigeSchau.grafikLaden(datei.toString(), true);
				//nach jeder Datei machen wir eine kurze Pause
				// Wert wird über JSpinner gesetzt
				try {
					Thread.sleep(anzeigenDauer);
				} 
				catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
        public void bildSkalieren(){
            if (datei != null)
            bildAnzeige.grafikLaden(datei, skalieren.isSelected());
        }
}

Finde mit recht wenig Code beim skalieren, aber Ziel erreicht.
Habe das mit den Methoden nutzen glaube ich jetzt besser drauf.
 

eliot

Bekanntes Mitglied
@Jomama09

Keine gute Lösung!
Warum?
1. Du skalierst das Image in der paintComponent Methtode bei jedem Neuzeichnen.

2. Weiterhin benutzt du kein Double Buffering, sondern renderst direkt (kann man
hier noch durchgehen lassen),

3. Zeichnest du in die Komponenten außerhalb der paintComponent Methode
(Swing ist NICHT Thread safe!).

Siehe dir nochmal die Postings über deinem letzten an.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
B Bild per KeyListener drehen Java Basics - Anfänger-Themen 1
I Kamera anschließen / Bild machen / Live View / Externe Blitz Java Basics - Anfänger-Themen 19
I Innerhalb einem Bild ein Teil austauschen Java Basics - Anfänger-Themen 26
I Datei (Bild) Drucken und wie Druckeinstellung speichern? Java Basics - Anfänger-Themen 3
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
H Artefact mit Bild erzeugen Java Basics - Anfänger-Themen 11
R UML-Bild (Erkennung ob static o. nicht) Java Basics - Anfänger-Themen 18
J Bild auf Hintergrundbild zeichnen Java Basics - Anfänger-Themen 5
krgewb Bild itextpdf Java Basics - Anfänger-Themen 2
C Bild in executable JAR File mitgeben Java Basics - Anfänger-Themen 5
VPChief Bild in JEditorPane Java Basics - Anfänger-Themen 9
B Warum bekomme ich kein Bild. Java Basics - Anfänger-Themen 10
S Bild einfügen // NEU Java Basics - Anfänger-Themen 12
N Bild drehen Java Basics - Anfänger-Themen 3
S Ein Bild mit dynamischer Quelle neuzeichnen Java Basics - Anfänger-Themen 12
N GLOOP Bild nicht ansichtbar Java Basics - Anfänger-Themen 5
M Bild in JFrame Java Basics - Anfänger-Themen 1
B Signatur erstellen - Bild ist nur weiß Java Basics - Anfänger-Themen 0
CptK Interface Bild rotieren Java Basics - Anfänger-Themen 17
CptK Interface Bild rotieren Java Basics - Anfänger-Themen 1
Anica Processing Animation Bild-Position ändern Java Basics - Anfänger-Themen 9
CptK Interface Bild über Methode ändern funktioniert nicht Java Basics - Anfänger-Themen 4
CptK Interface Curser durch Bild ersetzen & MouseListner Java Basics - Anfänger-Themen 2
M jTextPane Bild anzeigen Java Basics - Anfänger-Themen 6
CptK Bild beim betätigen eines JButtons Java Basics - Anfänger-Themen 6
S Bild über JButton legen Java Basics - Anfänger-Themen 3
B Bild mit Schrift befüllen / Anpassung bei Wortlänge Java Basics - Anfänger-Themen 2
D Google maps bild mit marker versehen Java Basics - Anfänger-Themen 12
D ImageView mit einfarbigem Bild fuellen Java Basics - Anfänger-Themen 3
it_is_all Bild-Pfad wird gefunden, nicht aber Textdatei-Pfad Java Basics - Anfänger-Themen 8
M Einzelne Pixel in einem Bild auslesen und bearbeiten Java Basics - Anfänger-Themen 1
M Bild wird von JFrame nicht geladen Java Basics - Anfänger-Themen 12
J Bild in Button einsetzen Java Basics - Anfänger-Themen 6
S button kommt durch bild Java Basics - Anfänger-Themen 13
M Ein Bild durch Objekterzeugung zeichnen Java Basics - Anfänger-Themen 5
B Greenscreen (grüner Hintergrund ersetzen mit Bild) Java Basics - Anfänger-Themen 49
K Interface Kein Bild im .jar-File Java Basics - Anfänger-Themen 15
S Bild in Jar-File mit ImageIO Java Basics - Anfänger-Themen 50
S Bild einfügen Java Basics - Anfänger-Themen 16
binop Bild anzeigen lassen Java Basics - Anfänger-Themen 2
D Bild zu Text Java Basics - Anfänger-Themen 4
I HTML Code in Bild (transparent) konvertieren Java Basics - Anfänger-Themen 0
I Watermark erstellen mit HTML in Bild? Java Basics - Anfänger-Themen 7
D Classpath Bild kann in .jar nicht geladen werden Java Basics - Anfänger-Themen 2
Anfänger2011 Bild programmieren?! Java Basics - Anfänger-Themen 3
8 Eigenes Bild in email einfügen Java Basics - Anfänger-Themen 1
K JTable Bild einfügen Java Basics - Anfänger-Themen 1
L BufferdImage schwarzes Bild nach zusammenfügen zweier Bilder Java Basics - Anfänger-Themen 8
S Bild in JOptionPane Java Basics - Anfänger-Themen 1
C Abfrage nach einem Bild im Array Java Basics - Anfänger-Themen 9
J Umgebungsvariable Programmfenster zeigt kein Bild an Java Basics - Anfänger-Themen 1
J Bild loopen Java Basics - Anfänger-Themen 6
M JFrame Bild einfügen Java Basics - Anfänger-Themen 3
S Bild bei Kontakt ändern Java Basics - Anfänger-Themen 2
C Erste Schritte Bild holen und speichern Java Basics - Anfänger-Themen 1
D Bild in Frame einfügen Java Basics - Anfänger-Themen 11
D Bild im Applet anzeigen Java Basics - Anfänger-Themen 3
F Bild in ein Runnable Jar File packen (eclipse) Java Basics - Anfänger-Themen 2
M Java-Applet: Bild einbinden (getImage) Java Basics - Anfänger-Themen 0
J Ganzes Bild Java Basics - Anfänger-Themen 4
T GUI anstatt Bild schwarzes Rechteck gespeichert Java Basics - Anfänger-Themen 0
A Bild verschwindet! Wieso?? Java Basics - Anfänger-Themen 2
I Bild aus Bereich laden Java Basics - Anfänger-Themen 3
P Bild in JFrame Titelleiste Java Basics - Anfänger-Themen 7
Y Nach Bild-Upload wird Bild nicht angezeigt Java Basics - Anfänger-Themen 1
M Button mit Bild und Text Java Basics - Anfänger-Themen 2
M JSP-Einfaches Bild anzeigen Java Basics - Anfänger-Themen 4
C Bild ins Frame laden und Objekte drüber legen Java Basics - Anfänger-Themen 1
Sogomn Bild will sich nicht skalieren lassen Java Basics - Anfänger-Themen 1
P Ein Bild für GUI (Java-Editor) Java Basics - Anfänger-Themen 4
D Bild für ein paar Sekunden einblenden und wieder ausblenden Java Basics - Anfänger-Themen 1
E Bild per Verzeichnis/JFileChooser auf JPanel laden Java Basics - Anfänger-Themen 13
S Bild auf eine Position rotieren?! Java Basics - Anfänger-Themen 4
P Bild bearbeiten Java Basics - Anfänger-Themen 9
Z Datenmatrix in Bild verwandeln Java Basics - Anfänger-Themen 4
C Bild verschwinden lassen Java Basics - Anfänger-Themen 7
S Bild Icon aus ID3Tag auslesen Java Basics - Anfänger-Themen 4
E Bild vom FileChooser aus via ImageIcon in DB schreiben Java Basics - Anfänger-Themen 16
D Bild zum Panel hinzufügen Java Basics - Anfänger-Themen 8
C Greenfoot: Bei Tastendruck und best. Wert Bild ändern Java Basics - Anfänger-Themen 2
O Auflösung einer Bild-Datei bekommen ohne sie herunterzuladen?? Java Basics - Anfänger-Themen 7
L Bild-Datein "zuschneiden" Java Basics - Anfänger-Themen 11
O DeviantArt-Bild Konverter: Fehler.. Java Basics - Anfänger-Themen 16
K Transparents Bild laden -> Fehlermeldung Java Basics - Anfänger-Themen 6
M Bild einbinden Java Basics - Anfänger-Themen 7
2 Bild auf JApplet zeichnen Java Basics - Anfänger-Themen 18
T Bild laden Java Basics - Anfänger-Themen 7
R Bild in GUI Java Basics - Anfänger-Themen 11
D Eclipse Juno zeigt Bild nicht bei Run Java Basics - Anfänger-Themen 3
Kenan89 Bild mit jar öffnen Java Basics - Anfänger-Themen 4
S Problem bei Bewegung von einem Bild! Java Basics - Anfänger-Themen 2
J Bild mit transparenter Farbe Java Basics - Anfänger-Themen 10
N Erste Schritte Applet zeichnet Bild nicht Java Basics - Anfänger-Themen 10
J Bild auf JLabel wird nicht angezeigt Java Basics - Anfänger-Themen 11
J Bild einfügen Java Basics - Anfänger-Themen 3
T ASCII Art von Bild erstellen. Java Basics - Anfänger-Themen 32
E Bild OS-unabhängig einbinden mit URL Java Basics - Anfänger-Themen 4

Ähnliche Java Themen


Oben