Grafik per JButton laden und austauschen lassen

Robin100804

Mitglied
Hallo zusammen. Ich bin derzeit an einem Projekt dran, an dem ich mir wünsche, dass der User durch Drücken des JButtons die Grafik in der Mitte des Fensters austauschen kann. Sprich: Die vorherige Grafik soll verschwinden und die gewünschte andere Grafik soll erscheinen. Im Prinzip klingt dies ja nicht schwer, jedoch bekomme ich es leider mit meinen anfängerischen Kentnissen nicht hin. Mein Lösungsansatz war folgender: Ich habe in einer ImageLoader-Klasse die Grafiken als BufferedImage laden lassen und diese auch in meiner Draw-Klasse zeichnen können. Dieses Zeichnen meiner Grafik wollte ich in eine Methode packen und diese Methode in den ActionListener meines JButtons einbringen. Naja, daraufhin wurde ich von Fehlermeldungen bombardiert. Der andere irrelevante Code sowie die Kommentare können ignoriert werden, diese sind aufgrund des Aspekts dass es ein Schulprojekt ist Pflicht.
Wäre sehr nett wenn mir jemand weiterhelfen könnte.

[CODE lang="java" title="Meine ImageLoader Klasse"]import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

public class ImageLoader {

BufferedImage logo;
BufferedImage TabelleGewicht;


public ImageLoader() {
try {
logo = ImageIO.read(getClass().getResourceAsStream("img/logo.png"));
} catch (IOException e) {
e.printStackTrace();
}
try {
TabelleGewicht = ImageIO.read(getClass().getResourceAsStream("img/TabelleGewicht.png"));
} catch (IOException e) {

}
}

}[/CODE]

[CODE lang="java" title="Meine Draw Klasse"]import java.awt.*;


import javax.swing.JLabel;


public class Draw extends JLabel{

/**
*
*/
private static final long serialVersionUID = 1L;

static ImageLoader il = new ImageLoader();

public void paintComponent(Graphics g) {



super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g.setColor(Color.WHITE);
g.fillRect(0, 70, Var.fensterbreite, 3); // obere weiße Linie

g.fillRect(0, 520, 695, 3); // untere weiße LInie

g.fillRect(168, 0, 3, 70);
g.fillRect(328, 0, 3, 70);
g.fillRect(488, 0, 3, 70);
g.fillRect(648, 0, 3, 70);
g.fillRect(168, 520, 3, 70);
g.fillRect(328, 520, 3, 70);



g.drawImage(il.logo, Var.logox, Var.logoy, Var.logobr, Var.logoho, this);
g.drawImage(il.TabelleGewicht, Var.tabellex, Var.tabelley, 600, 105, this);


/*
* Logo selbst im Internet erstellt: https://de.freelogodesign.org/
*/



repaint();

/*
* g2d-Graphics Teile aus vorherigem Projekt kopiert.
*
*/


}




}[/CODE]

[CODE lang="java" title="Meine Button Klasse"]import java.awt.Color;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class ButtonLeiste extends JFrame implements ActionListener {

/**
*
*/
private static final long serialVersionUID = 1L;

// Erstellen der Button und Beschriftung
static JButton jbut1 = new JButton("Umrechnen");
static JButton jbut2 = new JButton("Zurücksetzen");
static JButton jbut3 = new JButton("Gewicht");
static JButton jbut4 = new JButton("Länge");
static JButton jbut5 = new JButton("Zeit");
static JButton jbut6 = new JButton("Geschwindigkeit");
static JButton jbut7 = new JButton("Währung");

public ButtonLeiste() {

// Setzen der Größe und der Lokation der Buttons
jbut1.setBounds(20, 535, Var.jbuttonbreite, Var.jbuttonhoehe);
jbut2.setBounds(180, 535, Var.jbuttonbreite, Var.jbuttonhoehe);
jbut3.setBounds(20, 20, Var.jbuttonbreite, Var.jbuttonhoehe);
jbut4.setBounds(180, 20, Var.jbuttonbreite, Var.jbuttonhoehe);
jbut5.setBounds(340, 20, Var.jbuttonbreite, Var.jbuttonhoehe);
jbut6.setBounds(500, 20, Var.jbuttonbreite, Var.jbuttonhoehe);
jbut7.setBounds(660, 20, Var.jbuttonbreite, Var.jbuttonhoehe);

/*
* Idee für die setBounds-Methode aus dem Internet
*
* Anleitung für die addActionListener-Methode aus dem Internet
*/

// Button bekommt seine Funktion / Methode wird dem Button zugeordnet mit einem
// ActionListener
jbut1.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
InputTextfields.rechnen1();
Textfields.jtf2.setForeground(Color.BLACK); // Fixen eines Fehlers, dass die Textfarbe des 2. Feldes
// nicht aktualisiert wird

}
});

jbut2.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
Textfields.clearTextfields();
}
});

}

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub

}

}[/CODE]
 
G

Gelöschtes Mitglied 65838

Gast
Du hast immer eine Feste Lokation angegeben was ansich "nicht gut ist" benutze "Layouts" und dann tuascht du beim Layout den Node aus


wenn du alles mit festen Lokationen machst ist es schwer + aufwändig
 

Robin100804

Mitglied
Du hast immer eine Feste Lokation angegeben was ansich "nicht gut ist" benutze "Layouts" und dann tuascht du beim Layout den Node aus


wenn du alles mit festen Lokationen machst ist es schwer + aufwändig
Danke für deine Antwort. Ich bin noch recht neu in Java. Könntest du mir erklären wie ich dies genau umsetzen kann und wie das schlussendlich mein Problem löst.
 
G

Gelöschtes Mitglied 65838

Gast
tut mir leid ich bneutze nur javafx und kein AWT die "Groben Grundprinzipien" sind bei beiden ja die gleichen dass es layouts gibt und GUI elemente aber wie man das umsetzt kann ich dir nicht sagen
 

mihe7

Top Contributor
Kann das sein, dass das Auswüchse aus einem Youtube-Tutorial sind?

Regel #0: keine Klasse Var.
Regel #1: kein static außer für a) main-Methode und b) Konstanten (static final).

Es ist auch keine besonders gute Idee, repaint in paint/paintComponent aufzurufen.

Zum Layout: in AWT/Swing gibt es Layout-Manager, die Lage und Größe der Komponenten festlegen. Wenn Du mehrere Buttons in gleicher Größe nebeneinander haben möchtest, bietet sich ein GridLayout an. Lies Dir mal das Java Tutorial durch (https://docs.oracle.com/javase/tutorial/uiswing/layout/index.html), insbesondere die Abschnitte Using Layout Managers und How Layout Management Works.

Bei Fragen einfach fragen.
 

Robin100804

Mitglied
Kann das sein, dass das Auswüchse aus einem Youtube-Tutorial sind?

Regel #0: keine Klasse Var.
Regel #1: kein static außer für a) main-Methode und b) Konstanten (static final).

Es ist auch keine besonders gute Idee, repaint in paint/paintComponent aufzurufen.

Zum Layout: in AWT/Swing gibt es Layout-Manager, die Lage und Größe der Komponenten festlegen. Wenn Du mehrere Buttons in gleicher Größe nebeneinander haben möchtest, bietet sich ein GridLayout an. Lies Dir mal das Java Tutorial durch (https://docs.oracle.com/javase/tutorial/uiswing/layout/index.html), insbesondere die Abschnitte Using Layout Managers und How Layout Management Works.

Bei Fragen einfach fragen.
Danke für deine Antwort. Werd ich beim nächsten mal berücksichtigen.

Wüsstest du dennoch eine Lösung um die Grafiken mit den JButtons laden zu lassen?
 

mihe7

Top Contributor
Beispiel:
[code lang="Java" title="ImagePanel.java"]
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Graphics;
import javax.swing.JPanel;

public class ImagePanel extends JPanel {
private Image image;

public void setBackground(Image image) {
this.image = image;
repaint();
}

public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}

Insets insets = getInsets();
int w = insets.left + insets.right + (image != null ? image.getWidth(null) : 0);
int h = insets.top + insets.bottom + (image != null ? image.getHeight(null) : 0);
return new Dimension(w, h);
}

@Override
protected void paintComponent(Graphics g) {
if (image != null) {
g.drawImage(image, 0, 0, null);
}
}
}
[/code]

[code lang="Java" title="ImageCycler.java"]
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ImageCycler {
private static final int TILE_WIDTH = 28;
private static final int TILE_HEIGHT = 36;
private static final int TILES_PER_ROW = 8;
private static final int TILES = 80;

private BufferedImage tileset;
private int tileIx = 0;

private void loadTileset() {
try {
URL url = new URL("https://upload.wikimedia.org/wikipedia/commons/6/68/BOE_tile_set.png");
tileset = ImageIO.read(url);
} catch (IOException ex) {
ex.printStackTrace();
System.exit(1);
}
}

public BufferedImage getNextTile() {
int col = tileIx % TILES_PER_ROW;
int row = tileIx / TILES_PER_ROW;
tileIx = (tileIx + 1) % TILES;

BufferedImage image = tileset.getSubimage(col * TILE_WIDTH, row * TILE_HEIGHT,
TILE_WIDTH, TILE_HEIGHT);
return image;
}


public void run() {
loadTileset();

ImagePanel drawing = new ImagePanel();
drawing.setBackground(getNextTile());

JButton nextImage = new JButton("Next image");
nextImage.addActionListener(e -> drawing.setBackground(getNextTile()));

JPanel buttons = new JPanel(new FlowLayout(FlowLayout.CENTER));
buttons.add(nextImage);

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(drawing);
frame.add(buttons, BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new ImageCycler().run());
}
}[/code]
 

mihe7

Top Contributor
Mach das. Das mit den Tiles braucht Dich nicht weiter zu interessieren, das dient nur dem Zweck, dass ich nicht zig URLs lesen wollte. Die Methode getNextTile() liefert einfach immer ein anderes Bild.
 

mihe7

Top Contributor
Natürlich kannst Du beliebige Bilder von unterschiedlichen Quellen laden. Machst Du doch in Deinem Code auch schon. Die URL habe ich nur verwendet, damit ich nicht extra noch Bilder hier im Forum verschicken muss. Und wie gesagt, das mit den Tiles, damit ich nur ein Bild laden muss. Du kannst den Code ausführen und dann sollte das bei Dir laufen, vorausgesetzt, Deine Internetverbindung passt :) Hat es denn nicht funktioniert?
 

Robin100804

Mitglied
Ich werde es später versuchen. Was ich meine, mein Bild stammt nicht aus dem Internet sondern habe ich lokal gespeichert. Bisher habe ich diese immer im Projekt in ein Folder getan und dann aufgerufen. Welche Methode brauche ich da dann? Dies ist ja dann keine URL mehr.
 

mihe7

Top Contributor
Wenn es eine Ressource Deiner Anwendung ist, dann getClass().getResource() oder getClass().getResourceAsStream(), wie in Deinem ImageLoader oben, Zeilen 14 und 19.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
M Umwandlung in den HSV-Farbraum lässt die Grafik pixelig werden AWT, Swing, JavaFX & SWT 8
S 2D-Grafik Winkelberechnungen auf 2D Grafik AWT, Swing, JavaFX & SWT 2
E Grafik karte erkennen AWT, Swing, JavaFX & SWT 3
S JavaFX Java Custom Node Grafik zurückgeben AWT, Swing, JavaFX & SWT 2
D Swing JCombobox Aktion löscht Grafik AWT, Swing, JavaFX & SWT 1
K Grafik in JFrame einpassen AWT, Swing, JavaFX & SWT 3
C Nach Aufruf von anderer Klasse streikt Grafik AWT, Swing, JavaFX & SWT 1
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
Sanni94 JavaFX Kann man eine Grafik in einen Text einbinden? AWT, Swing, JavaFX & SWT 2
S Höhendaten in einer Grafik ausgeben AWT, Swing, JavaFX & SWT 2
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
S Grafik in einer Klassen einfügen/hinzufügen AWT, Swing, JavaFX & SWT 1
C 2D Grafik ein Bild soll permanent durchlaufen AWT, Swing, JavaFX & SWT 2
S 3D-Grafik 3d Grafik auf einem JPanel oder im JScrollPane AWT, Swing, JavaFX & SWT 1
F AWT Grafik wird nicht richtig aktualisiert AWT, Swing, JavaFX & SWT 2
J JTabbedPane Grafik unterhalb der Tabs AWT, Swing, JavaFX & SWT 3
F Grafik hängt sich auf AWT, Swing, JavaFX & SWT 20
S LookAndFeel GUI-Grafik AWT, Swing, JavaFX & SWT 5
J Verschwommene Grafik AWT, Swing, JavaFX & SWT 4
C LayoutManager Grafik soll nicht im GridLayout Skalieren AWT, Swing, JavaFX & SWT 3
F Grafik mit Buttons versehen AWT, Swing, JavaFX & SWT 8
C Grafik Taschenrechner AWT, Swing, JavaFX & SWT 5
J Grafik (Kreis) schneller bewegen? AWT, Swing, JavaFX & SWT 6
Kenan89 Grafik und Text in JPanel anzeigen AWT, Swing, JavaFX & SWT 8
D Fenster mit Grafik überlappen AWT, Swing, JavaFX & SWT 3
Maxim6394 Rotation einer Grafik in swing AWT, Swing, JavaFX & SWT 13
D Swing Grafik in JPanel anzeigen. AWT, Swing, JavaFX & SWT 3
W Grafik von JFrame korrekt speichern AWT, Swing, JavaFX & SWT 7
S Grafik Fehler AWT, Swing, JavaFX & SWT 15
M Swing JLabel (mit einer Grafik) aktualisieren AWT, Swing, JavaFX & SWT 2
D 2D-Grafik Problem beim Drucken eines Grafik-Objekts AWT, Swing, JavaFX & SWT 2
Daniel_L Grafik erstellen, drin zeichnen und dann speichern AWT, Swing, JavaFX & SWT 2
D Grafik über JPanels hinweg verschieben AWT, Swing, JavaFX & SWT 2
C Grafik von main aus aufrufen AWT, Swing, JavaFX & SWT 13
O Swing Label(bzw. Grafik) verdekt von anderm Label AWT, Swing, JavaFX & SWT 2
T rekursive Grafik AWT, Swing, JavaFX & SWT 5
I 2D-Grafik Problem mit schreiben von Text auf eine Grafik AWT, Swing, JavaFX & SWT 7
F Swing Framework gesucht (Swing, Chart, "Scheduling" Grafik) AWT, Swing, JavaFX & SWT 2
S Pacman-Grafik AWT, Swing, JavaFX & SWT 23
N Eigener Grafik Editor mit fehlerhafter Anzeige AWT, Swing, JavaFX & SWT 4
lordcarlos Dynamische und interaktive grafik AWT, Swing, JavaFX & SWT 5
D Systemmodale Grafik AWT, Swing, JavaFX & SWT 10
J Geladene Grafik in ImageIcon auf Panel fest positionern. AWT, Swing, JavaFX & SWT 8
W Grafik aktualisieren AWT, Swing, JavaFX & SWT 5
S Swing Zugriff auf Polyline in Grafik AWT, Swing, JavaFX & SWT 4
A Swing Bei größe verändern des Fensters Grafik weg AWT, Swing, JavaFX & SWT 3
C gute Grafik-Bibliotheken gesucht AWT, Swing, JavaFX & SWT 6
D JFormattedTextfield um Grafik erweitern AWT, Swing, JavaFX & SWT 15
O Grafik wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
P JPanel mit Grafik von HDD über JTree AWT, Swing, JavaFX & SWT 10
S 2D-Grafik beeinflussen durch Scrollbalken AWT, Swing, JavaFX & SWT 2
A Grafik aus MIME-kodiertem Inhalt erzeugen AWT, Swing, JavaFX & SWT 2
T (WACOM) Grafik Tablet abfragen AWT, Swing, JavaFX & SWT 3
S Button mit Grafik versehen AWT, Swing, JavaFX & SWT 5
D Grafik bearbeiten AWT, Swing, JavaFX & SWT 11
M Ich habe Werte und Brauche Grafik! AWT, Swing, JavaFX & SWT 3
M Grafik flexibel an berechneten Koordinaten positionieren AWT, Swing, JavaFX & SWT 4
M dynamische Grafik in JFrame einbetten AWT, Swing, JavaFX & SWT 2
G Transparente Grafik über JMF Video zeichnen AWT, Swing, JavaFX & SWT 2
I Grafik in Text umwandeln AWT, Swing, JavaFX & SWT 11
G Grafik auf mehrere Methoden/Klassen zerlegen AWT, Swing, JavaFX & SWT 2
G Grafik in Button einbinden AWT, Swing, JavaFX & SWT 3
M Grafik in JFrame in Kombination mit Steuerelementen AWT, Swing, JavaFX & SWT 2
T grafik in jpanel wird nicht neugezeichnet AWT, Swing, JavaFX & SWT 7
F Zellen über eine Grafik legen AWT, Swing, JavaFX & SWT 7
S Grafik Farbwert verändern? AWT, Swing, JavaFX & SWT 8
D Farbe einer Grafik über den Cursor abfragen AWT, Swing, JavaFX & SWT 6
G Keine Anzeige von Grafik bei externem paintComponent-Aufruf AWT, Swing, JavaFX & SWT 2
S Popup auf Grafik AWT, Swing, JavaFX & SWT 18
J Grafik "sichtbar" verschieben AWT, Swing, JavaFX & SWT 2
G Grafik auf JComponent ohne Überschreiben von Paint-Methoden AWT, Swing, JavaFX & SWT 4
G Grafik erzeugen: eine Art Zustandsgraph eines Automaten AWT, Swing, JavaFX & SWT 7
P grafik in JScrollPanel AWT, Swing, JavaFX & SWT 5
D AppletCode als JAR aus JSP benutzen und als Grafik speichern AWT, Swing, JavaFX & SWT 2
S Update von Grafik auf JPanel AWT, Swing, JavaFX & SWT 2
S Auf einem JTabbedPane eine Grafik zeichnen AWT, Swing, JavaFX & SWT 11
W Grafik in JLabel aktualisieren AWT, Swing, JavaFX & SWT 4
S Tooltip mit Grafik AWT, Swing, JavaFX & SWT 2
D Visualisierung einer Selektion in einer Grafik. AWT, Swing, JavaFX & SWT 7
P Vektor-Grafik im XML-Format speichern AWT, Swing, JavaFX & SWT 39
P Grafik auf Button AWT, Swing, JavaFX & SWT 3
E Einträge der JComboBox werden durch Grafik verdeckt AWT, Swing, JavaFX & SWT 11
L Komponente und Grafik gleichzeitig auf JPanel zeichnen AWT, Swing, JavaFX & SWT 11
T swing - grafik schrittweise ausgeben ohne repaint() AWT, Swing, JavaFX & SWT 2
G JButton mit importFiles-Funktion auf JDrawPane AWT, Swing, JavaFX & SWT 5
B JButton Search AWT, Swing, JavaFX & SWT 8
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
L JButton durch Mausklick auslösen und Enter-Taste AWT, Swing, JavaFX & SWT 2
N Erlennen ob JButton gedrückt ist AWT, Swing, JavaFX & SWT 6
D JButton Form verändern AWT, Swing, JavaFX & SWT 4
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
Z Swing Kann man auf JButton zeichenen AWT, Swing, JavaFX & SWT 3
J JButton Icon hinzufügen AWT, Swing, JavaFX & SWT 5
U Swing JButton mit Icon AWT, Swing, JavaFX & SWT 7
ms_cikar Jbutton erzeugt neue Buttons AWT, Swing, JavaFX & SWT 2
Drachenbauer Swing Wie ändere ich die Farbe der Konturen von jButton und jCombobox? AWT, Swing, JavaFX & SWT 18

Ähnliche Java Themen

Neue Themen


Oben