# JLabel durch Klick auf JButton einblenden



## stylegangsta (29. Sep 2015)

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.


```
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?


----------



## VfL_Freak (30. Sep 2015)

Moin,


stylegangsta hat gesagt.:


> So erscheint das JLabel die ganze Zeit ...


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



stylegangsta hat gesagt.:


> ... aber ich möchte, dass es erst nach Klick auf den Button erscheint. Was muss ich machen?


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

Gruß Klaus


----------



## stylegangsta (30. Sep 2015)

VfL_Freak hat gesagt.:


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



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 {


----------



## Joose (30. Sep 2015)

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)


----------



## stylegangsta (30. Sep 2015)

Joose hat gesagt.:


> 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


----------



## Joose (30. Sep 2015)

Stichwort anonyme (innere) Klassen

```
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.


----------



## VfL_Freak (30. Sep 2015)

Moin,

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

Gruß Klaus

EDIT: war wohl zu langsam


----------



## stylegangsta (30. Sep 2015)

VfL_Freak hat gesagt.:


> Moin,
> 
> wie jetzt ??
> Was genau ist denn "JButton" für Dich ????
> ...



Das hier: (notwendiges Zubehör oberhalb im Code, steht hier jetzt nicht)
EDIT: Ist im JFrame rein geschrieben

```
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

```
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"));
    }
}
```


----------



## VfL_Freak (30. Sep 2015)

schön ... und was soll uns das jetzt sagen ??
Bitte nicht einfach nur Code hinklatschen !!

Hast Du den Beitrag von Joose überhaupt gelesen ??


----------



## stylegangsta (30. Sep 2015)

VfL_Freak hat gesagt.:


> schön ... und was soll uns das jetzt sagen ??


Das, was für mich ein JButton ist oder wie ich diesen erstelle.
Außer du wolltest es als Satz.
Ein JButton ist für mich eine Schaltfläche, bei der man durch Mouseclicks und oder Bewegungen Aktionen auslöst.
Oder du drückst deine Frage konkreter aus.



VfL_Freak hat gesagt.:


> Hast Du den Beitrag von Joose überhaupt gelesen ??


Natürlich habe ich den gelesen.


----------



## VfL_Freak (30. Sep 2015)

Moin,


stylegangsta hat gesagt.:


> 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


----------



## stylegangsta (30. Sep 2015)

VfL_Freak hat gesagt.:


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


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.


----------



## VfL_Freak (30. Sep 2015)

Moin,



stylegangsta hat gesagt.:


> 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


----------



## stylegangsta (30. Sep 2015)

VfL_Freak hat gesagt.:


> 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.


----------



## Joose (30. Sep 2015)

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.


```
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

```
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:


```
panel.add(getBundeslandButton("Bayern", .....));
panel.add(getBundeslandLabel("Bayern", .....));
```


----------



## stylegangsta (30. Sep 2015)

Joose hat gesagt.:


> 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?


----------



## Joose (30. Sep 2015)

Dazu solltest du wenn einen eigenen Thread aufmachen, aber im mit den Information kann man nur sagen: Debugger, Logausgaben


----------

