JLabel durch Klick auf JButton einblenden

stylegangsta

Bekanntes Mitglied
Hi,

ich habe einen JFrame, dieser enthält einen Button, der bereits MouseEvents (geklickt, nicht geklickt usw.) hat. Und ich habe ein JLabel, dass ein animiertes gif enthält.

Java:
    private JLabel lblAnimation;
    private Icon iconAnimation;
.
.
.
getContentPane().add(lblAnimation);
.
.
.
// Animation
        iconAnimation = new ImageIcon(getClass().getResource("/img/DB-Einlesen.gif"));
        lblAnimation = new JLabel(iconAnimation);
        lblAnimation.setBounds(460, 229, 350, 80);

So erscheint das JLabel die ganze Zeit, aber ich möchte, dass es erst nach Klick auf den Button erscheint. Was muss ich machen?
 
Moin,

na sicher, da fügst es ja auch immer zum ContentPane hinzu!


Erstell einen Button mit zugehörigem ActionListener, in dem Du dann erst das Label einblendest !

Gruß Klaus

Hi Klaus,

danke für die Antwort. Das habe ich schon versucht. Ich habe für das JLabel eine eigene Klasse erstellt, die den Actionlistener implementiert. Diesen habe ich dann in den Frame eingebaut mit der Variable vom Button. Hat aber nicht geklappt. Danach habe ich es wieder gelöscht. Also kein Code zur Verfügung leider.

Ich weiß aber noch, dass ich die Klasse so erstellt hatte.

public class Animation extends JLabel implements ActionListener {
 
Da verstehe ich die Logik nicht. Ein ActionListener soll auf eine Aktion reagieren. Du willst darauf reagieren wenn der Button geklickt wird. Aber fügst den ActionListener an dein Label?
Probier das ganze vielleicht mal umgekehrt (aber bitte nicht unbedingt eine eigene Klasse deswegen)
 
Da verstehe ich die Logik nicht. Ein ActionListener soll auf eine Aktion reagieren. Du willst darauf reagieren wenn der Button geklickt wird. Aber fügst den ActionListener an dein Label?
Probier das ganze vielleicht mal umgekehrt (aber bitte nicht unbedingt eine eigene Klasse deswegen)

Weil die Buttons keine eigene Klasse haben. Siehe Problem anderer Thread von mir indem du mir versuchst zu helfen, ich aber leider nichts blicke
 
Stichwort anonyme (innere) Klassen
Java:
JButton button = new JButton("");
button.addActionListener(newActionListener() {
    publicvoid actionPerformed(ActionEvent arg0) {
        // Dein Code um auf ein Event wie einen Button Klick zu reagieren
    }
});

Wie jetzt schon in anderem Thread erwähnt: Da fehlen einfach die Grundlagen für OOP, welche für GUI-Programmierung unerlässlich sind.
 
Moin,

wie jetzt ?? 😕
Was genau ist denn "JButton" für Dich ????

Gruß Klaus

EDIT: war wohl zu langsam 🙄

Das hier: (notwendiges Zubehör oberhalb im Code, steht hier jetzt nicht)
EDIT: Ist im JFrame rein geschrieben
Java:
btnTh = new JButton();
        btnTh.addMouseListener(new MouseEventTh(btnTh));
        btnTh.setContentAreaFilled(false);
        btnTh.setIcon(new ImageIcon(Th_Wappen));
        btnTh.setFocusPainted(false);
        lblTh = new JLabel("Th\u00FCringen");
        lblTh.setFont(lblTh.getFont().deriveFont(Font.BOLD, 15));
        lblTh.setForeground(Color.BLACK);
        lblTh.setHorizontalAlignment(SwingConstants.CENTER);
        lblTh.setVerticalAlignment(SwingConstants.CENTER);
        lblTh.setBounds(1060, 386, 110, 140);
        btnTh.setBounds(1060, 306, 110, 140);

Und das die dazugehörigen Events der Mouse
Java:
package MouseEvents;

import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.UIManager;

public class MouseEventTh extends MouseAdapter {

    private final AbstractButton btnTh;

    public MouseEventTh(AbstractButton btnTh) {
        this.btnTh = btnTh;
    }

    // Mauszeiger innerhalb der Schaltfläche
    public void mouseEntered(MouseEvent evtTh) {
        btnTh.setBorderPainted(true);
        btnTh.setBorder(BorderFactory.createEtchedBorder(Color.decode("38091"), Color.decode("38091")));
        btnTh.setOpaque(true);
        btnTh.setContentAreaFilled(false);
        btnTh.setBackground(Color.WHITE);
    }

    // Mauszeiger klickt auf Schaltfläche
    public void mousePressed(MouseEvent evtTh) {
        btnTh.setBorderPainted(false);
        btnTh.setBorder(BorderFactory.createEtchedBorder(Color.decode("38091"), Color.decode("38091")));
        btnTh.setOpaque(true);
        btnTh.setContentAreaFilled(false);
        btnTh.setFocusPainted(false);
        btnTh.setBackground(Color.WHITE);
    }

    // Mauszeiger klickt nicht mehr auf Schaltfläche
    public void mouseReleased(MouseEvent evtTh) {
        btnTh.setBorderPainted(true);
        btnTh.setBorder(BorderFactory.createEtchedBorder(Color.decode("38091"), Color.decode("38091")));
        btnTh.setOpaque(true);
        btnTh.setContentAreaFilled(false);
        btnTh.setBackground(Color.WHITE);
    }

    // Mauszeiger außerhalb der Schaltfläche
    public void mouseExited(MouseEvent evtTh) {
        btnTh.setBorderPainted(false);
        btnTh.setOpaque(false);
        btnTh.setContentAreaFilled(false);
        btnTh.setFocusPainted(false);
        btnTh.setBackground(UIManager.getColor("control"));
    }
}
 
Moin,
Das, was für mich ein JButton ist oder wie ich diesen erstelle.
Was ich andeuten wollte war, dass 'JButton' eine Java-Standardklasse ist!!

Also musst Du nur ein entsprechendes Objekt erstellen und nicht wild neue Klassen erfinden (es sei denn, dass Du die Standardfunktionalität eines Button wirklich erweitern willst)!

Vlt. hilft Dir dies ja weiter:
http://docs.oracle.com/javase/7/docs/api/javax/swing/JButton.html
https://docs.oracle.com/javase/tutorial/uiswing/components/button.html

Gruß Klaus
 
Moin,

Was ich andeuten wollte war, dass 'JButton' eine Java-Standardklasse ist!!

Also musst Du nur ein entsprechendes Objekt erstellen und nicht wild neue Klassen erfinden (es sei denn, dass Du die Standardfunktionalität eines Button wirklich erweitern willst)!

Vlt. hilft Dir dies ja weiter:
http://docs.oracle.com/javase/7/docs/api/javax/swing/JButton.html
https://docs.oracle.com/javase/tutorial/uiswing/components/button.html

Gruß Klaus
Bitte nicht persönlich nehmen, war wohl eher ein Zufall mit deiner Frage im Eifer des Gefechts. Wolltest dich wahrscheinlich einfach nur kurz fassen.
Aber genau das ist Problem, was wir als Gruppe seit 1 Jahr mit unserem dämlichen Dozenten haben. Nicht nur bei JAVA war es so, überall. Datenbanken, Projekte etc. Die Erklärungen waren genauso wie die Fragestellungen.
 
Moin,

Bitte nicht persönlich nehmen ... Aber genau das ist Problem, was wir als Gruppe seit 1 Jahr mit unserem dämlichen Dozenten haben. Nicht nur bei JAVA war es so, überall. Datenbanken, Projekte etc. Die Erklärungen waren genauso wie die Fragestellungen.
Nein, persönlich nehme ich das natürlich nicht ...
Aber ihr wisst nach einem Jahr noch nicht, was die Klasse 'JButton' ist und wie man sie richtig verwendet ?? 😱
Selbst wenn euer Dozent nicht der Beste ist, gibt es genügend Lehrbücher, Seiten im Web, Tutorials etc., mit denen man sich die Grundlagen aneignen kann!!

Also schau Dir noch mal den Code im Beitrag von Joose an, da steht alles drin !!
Gruß Klaus
 
Moin,

Aber ihr wisst nach einem Jahr noch nicht, was die Klasse 'JButton' ist und wie man sie richtig verwendet ?? 😱
Gruß Klaus
Hab mich da jetzt wohl selber etwas zu kurz gefasst. Wir hatten 6 Monate JAVA Grundlagen, wo Übungsaufgaben aus Herdt Büchern bekommen haben und GUI haben wir gar nicht gemacht. Werden wir auch nicht. Ich meinte nur über das Jahr verteilt alle Themen. SQL, Projektmanagement, Sortieralgorithmen usw.
 
Bei den Buttons haben wir ja schon geklärt hier brauchst du einfach eine Methode und nicht für jedes Bundesland eine eigene Klasse welche von JButton ableitet.
Ähnlich verhält es sich nun bei den MouseEvents. Ich nehme stark an das jede dieser MouseEventKlasse in den 4 Methoden 1:1 das gleiche macht.
-> Sprich anstatt hier wieder für jede Bundesland eine eigene Klasse machen reicht eine vollkommen aus.

Java:
public class BundeslandButtonMouseEvent extends MouseAdapter {

  private final AbstractButton button;

  public BundeslandButtonMouseEvent(AbstractButton button) {
  this.button = button;
  }

  // Mauszeiger innerhalb der Schaltfläche
  public void mouseEntered(MouseEvent evtTh) {
  button.setBorderPainted(true);
  button.setBorder(BorderFactory.createEtchedBorder(Color.decode("38091"), Color.decode("38091")));
  button.setOpaque(true);
  button.setContentAreaFilled(false);
  button.setBackground(Color.WHITE);
  }

...........
}

In deinem JFrame wo du die Button erzeugst hättest du dann folgenden Code
Java:
public JButton getBundeslandButton(String bundeslandName, .....) {
  try {
  Wappen = ImageIO.read(getClass().getResource("/img/" + bundeslandName + ".png"));
  } catch (IOException ex) {
  System.out.println("Ausnahmefehler beim Laden einer Grafik!\nEine Grafik konnte nicht gelesen werden!");
  ex.printStackTrace();
  } catch (IllegalArgumentException ex) {
  System.out.println("Ausnahmefehler beim Laden einer Grafik!\nEine Grafik wurde nicht gefunden!");
  ex.printStackTrace();
  }
  JButton bundesland = new JButton();
  bundesland.addMouseListener(new BundeslandButtonMouseEvent(bundesland)); // aus der Methode rausziehen? Per reflection laden > "MouseEvent"  + bundeslandName?
  bundesland.setContentAreaFilled(false);
  bundesland.setIcon(new ImageIcon(Wappen));
  bundesland.setFocusPainted(false);
  bundesland.setBounds(.......);
  return bundesland;
}

public JLabel getBundeslandLabel(String bundeslandName, ....) {
  JLabel bundesland = new JLabel(bundeslandName);
  bundesland.setFont(bundesland.getFont().deriveFont(Font.BOLD, 15));
  bundesland.setForeground(Color.BLACK);
  bundesland.setHorizontalAlignment(SwingConstants.CENTER);
  bundesland.setVerticalAlignment(SwingConstants.CENTER);
  bundesland.setBounds(........);
}

Und an der Codestelle wo du dein Fenster aufbaust und Button und Labels zum Frame oder Panel hinzufügen willst reichen folgende Aufrufe:

Java:
panel.add(getBundeslandButton("Bayern", .....));
panel.add(getBundeslandLabel("Bayern", .....));
 
Ich nehme stark an das jede dieser MouseEventKlasse in den 4 Methoden 1:1 das gleiche macht.
-> Sprich anstatt hier wieder für jede Bundesland eine eigene Klasse machen reicht eine vollkommen aus.
Volltreffer, versenkt.

EDIT: Vom Prinzip ja, habe aber vergessen zu schreiben, dass jeder Button eine andere Hintergrundfarbe und anderen Rahmen bekommt, also angepasst an die Farben des Wappen vom jeweiligen Bundesland.

-------------------------------------------------------------------

Habe aber ein größeres Problem. Das Ganze hat einen SplashScreen beim Start. Funktioniert auf meinen Rechnern hier zu Hause wunderbar ohne was einzustellen. Aber auf keinem Rechner in der Schule, besser gesagt nur beim ersten Mal, unabhängig ob self executable jar oder konsole in eclipse.

Das heißt: Ich deinstalliere jdk und jre. Installiere es neu. Dann erscheint der SplashScreen, sowohl in der jar, als auch Konsole. Beim zweiten Starten nicht mehr. Irgendeine Idee?
 
Zuletzt bearbeitet:

Zurück
Oben