# Button ruft eine andere Class



## anyname (5. Juni 2013)

ich versuche ein Button mit einer anderen Class in Java zu verknüpfen

so die App besteht aus 2 Classen,, die erste Class soll ein Button haben, dieses Button soll bei Actionlistener Methode eine andere Class rufen.

*Die beiden CLASSEN sollen in zwei verschiedenen Dateien sein,, das ist sehr wichtig*

so die erste Class ist : Mainclass
die zweite Class ist : TargetClass (soll aufgeruft werden wenn ein Benutzer auf dem Button klickt)

*Code zu  Class 1:*


```
import java.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MainClass {
public static void main (String[] args) {
JFrame frame1 = new JFrame("MyApp");
JPanel panel1 = new JPanel();
frame1.add(panel1);
JButton button1 = new JButton("Click me");
panel1.add(button1);
button1.addActionlistener (new TargetClass());
}
}
```




*Code zu Class 2:*


```
import java.swing.*;
import java.awt.*;
import java.awt.event.*;
static class TragetClass implements Actionlistener{

JFrame frame2 = new JFrame();
JPanel panel2 = new JPanel();
frame2.add(panel2);
JLabel label = new JLabel("Bingo"!);
frame2.add(label);
}
```

also genügt es diese Zeile (
	
	
	



```
button1.addActionlistener (new TargetClass());
```
) um die externe TargetClass zu rufen?

Danke


----------



## Writtscher (5. Juni 2013)

Jup so sollte es funktionieren, da deine TargetClass ein ActionListener ist. Was ist denn das Problem? Wenn du gedenkst ein JFrame zu öffnen fehlt dir die Zeile frame2.show() (glaube das heißt so habe schon ewig kein Swing gemacht). Wenn das eine Art "Modal"/Pop up werden soll, ist glaube ich ein JDialog besser oder?

Aber wie schon gesagt meine Swing Kenntnisse sind eingerostet.


----------



## youza (5. Juni 2013)

addActionListener <> addActionlistener

Das Ausrufezeichen von Bingo ist auserhalb des Strings => ("Bingo"!)
Writtscher hat anscheinend echt schon lang nix mehr mit Swing gemacht ^^ 
.show ist depricated -> .setVisible(true);

Dein Code sollte ungefähr so aussehen:

Class1:

```
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Class1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JFrame frame1 = new JFrame("MyApp");
		JPanel panel1 = new JPanel();
		frame1.add(panel1);
		JButton button1 = new JButton("Click me");
		panel1.add(button1);
		button1.addActionListener (new Class2());
		frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame1.pack();
		frame1.setVisible(true);

	}

}
```

Class2

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

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Class2 extends JFrame implements ActionListener{

	/**
	 * 
	 */
	private static final long serialVersionUID = -919005183226437123L;

	@Override
	public void actionPerformed(ActionEvent arg0) {
		
		JPanel panel2 = new JPanel();
		this.add(panel2);
		JLabel label = new JLabel("Bingo");
		this.add(label);
		this.pack();
		this.setVisible(true);
	}

	

}
```

noch ein paar Links:

IDE:
http://www.eclipse.org/downloads/  -> Eclipse Classic damit gehts deutlich leichter

das am besten zu verstehende Buch für Einsteiger:
http://openbook.galileodesign.de/javainsel5/javainsel00_000.htm#Xxx999269

Grüße
Youza


----------



## anyname (5. Juni 2013)

die oben stehenden Classe sind nur zum Leiten, ich wollte nur wissen wie man eine externe Classe bei einer andren rufen kann.... aber gibt es noch etwas.

hier ist was ich genau machen will :

ich möchte eine App Fenster so gestallten: linker Bereich für die Buttons und MainFrame im zentrum des Fensters als Container für Erreignisse (siehe Foto), wenn ein benutzer auf einem Button klickt, kommt der Inhalt im Target Bereich, also jedes Button ruft eine externe Classe und setzt den Inhalt im Target Bereich. genau wie bei HTML mit den Konzepten Left Frame, Main Frame, Top Frame usw.
 z.B erste Button soll Google Maps aufrufen natürlich Google maps soll im zentrum des Fensters (Target) angezeigt werden
wie soll ich jetzt verfahren?


----------



## youza (6. Juni 2013)

Ich hab da mal was kleines gebastelt (ich hoffe du verwendest Eclipse oder sowas)

Also Package Nr. 1:
com.youza.logic

Klasse: Main

```
package com.youza.logic;

import com.youza.gui.MainGui;

public class Main {
	public static void main(String[]args){
		new MainGui();
	}

}
```

enthält im Moment nur die Main 

Package Nr 2:
com.youza.logic:

Klasse MainGui:

```
package com.youza.gui;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.Toolkit;

import javax.swing.JFrame;

public class MainGui extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 5257812626494937069L;
	
	//Konstanten für die Cards da diese protected sind und die MainGui an LeftPanel und an MainPanel übergeben werden
	//und sich diese in dem gleichen Package befinden sind diese für beide Sichtbar
	final protected String GREETZ = "Begrüßung";
	final protected String GOOGLE = "Card mit Google";
	final protected String WASANDERES = "Card mit Was Anderem";
	
	//initialisierung der beiden Panels
	protected LeftPanel jpLeft = new LeftPanel(this);
	protected MainPanel jpMain = new MainPanel(this);
	public MainGui() {
		
		//Hier verwende ich das GridBagLayout da ich hier genau festlegen kann wie viel
		//Anteil Left und Main haben sollen
		GridBagLayout gbl = new GridBagLayout();
		
		//Dem Container wird das ContentPane vom JFrame übergeben (extends JFrame)
		Container container = this.getContentPane();
		
		
		//Die Panels werden hier dem container via der GridbagLayoutHelper Klasse  hinzugefügt
		GridBagLayoutHelper.addComponent(container, gbl, jpLeft, 0, 0, 1, 1, 0.2, 1);
		GridBagLayoutHelper.addComponent(container, gbl, jpMain, 1, 0, 1, 1, 0.8, 1);
		
		
		//Das Programm soll beim Schließen beendet werden
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//Dem JFrame wird das GridBagLayout übergeben
		this.setLayout(gbl);
		
		//Auslesen Der Bildschirmgröße
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		
		//Die Bildschirmgröße soll zur hälfte ausgenutzt werden
		d = new Dimension(d.width/2,d.height/2);
		this.setSize(d);
		
		//Das Fenster soll in der Mitte erscheinen
		this.setLocationRelativeTo(null);
		
		//Title des Frames
		this.setTitle("Coole Anwendung");
		
		//Das JFrame soll angezeigt werden
		this.setVisible(true);
	}
	
}
```
Klasse GridBagLayoutHelper

```
package com.youza.gui;

import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

public class GridBagLayoutHelper {
	// Hilfsfunktion zum hinzufügen der Componenten zum GridbagLayout (ohne
	// Padding)
	public static void addComponent(Container cont, GridBagLayout gbl,
			Component c, int x, int y, int width, int height, double weightx,
			double weighty) {
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.WEST;
		gbc.gridx = x;
		gbc.gridy = y;
		gbc.gridwidth = width;
		gbc.gridheight = height;
		gbc.weightx = weightx;
		gbc.weighty = weighty;
		gbl.setConstraints(c, gbc);
		cont.add(c);
	}

	// Hilfsfunktion zum hinzufügen der Componenten zum GridbagLayout ohne
	// Padding
	// in Beide füllt allerdings in Beide Richtungen aus
	public static void addComponentFill(Container cont, GridBagLayout gbl,
			Component c, int x, int y, int width, int height, double weightx,
			double weighty) {
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.BOTH;
		gbc.gridx = x;
		gbc.gridy = y;
		gbc.gridwidth = width;
		gbc.gridheight = height;
		gbc.weightx = weightx;
		gbc.weighty = weighty;
		gbl.setConstraints(c, gbc);
		cont.add(c);
	}

	// Hilfsfunktion zum hinzufügen der Componenten zum GridbagLayout mit
	// Padding
	public static void addComponentPadding(Container cont, GridBagLayout gbl,
			Component c, int x, int y, int width, int height, double weightx,
			double weighty) {
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.WEST;
		gbc.gridx = x;
		gbc.gridy = y;
		gbc.gridwidth = width;
		gbc.gridheight = height;
		gbc.weightx = weightx;
		gbc.weighty = weighty;
		// Padding von 10 in alle Richtungen
		gbc.insets = new Insets(10, 10, 10, 10);
		gbl.setConstraints(c, gbc);
		cont.add(c);
	}

}
```

Klasse LeftPanel:


```
package com.youza.gui;

import java.awt.CardLayout;
import java.awt.Container;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;

public class LeftPanel extends JPanel implements ActionListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = 4028727581415661088L;
	private JButton GoogleMaps;
	private JButton WasAnderes;
	private MainGui parent;

	public LeftPanel(MainGui parent) {
		this.parent = parent;

		GridBagLayout gbl = new GridBagLayout();
		Container container = this;

		// Buttons über welche du das MainPanel steuern kannst
		GoogleMaps = new JButton("Google Maps");
		WasAnderes = new JButton("Was Anderes");

		// über den AcionCommand wird diffenziert welcher Button gedrückt wurde
		GoogleMaps.setActionCommand("GOOGLE");
		// Dem Button wird dieser ActionListener zugewiesen (da implements
		// ActionListener)
		GoogleMaps.addActionListener(this);

		WasAnderes.setActionCommand("WAS_ANDERES");
		WasAnderes.addActionListener(this);

		
		//Die Buttons werden hier dem container via der GridbagLayoutHelper Klasse  hinzugefügt
		GridBagLayoutHelper.addComponentPadding(container, gbl, GoogleMaps, 0, 0, 1, 1, 1, 1);
		GridBagLayoutHelper.addComponentPadding(container, gbl, WasAnderes, 0, 1, 1, 1, 1, 1);
		
		this.setLayout(gbl);
	}

	// Die Klass implements Actionlistener um eine Aktion auszuführen beim
	// betätigen der Schaltflächen
	@Override
	public void actionPerformed(ActionEvent event) {
		if (event.getActionCommand().equals("GOOGLE")) {
			CardLayout cl = (CardLayout) (parent.jpMain.getLayout());
			cl.show(parent.jpMain, parent.GOOGLE);
		} else if (event.getActionCommand().equals("WAS_ANDERES")) {
			CardLayout cl = (CardLayout) (parent.jpMain.getLayout());
			cl.show(parent.jpMain, parent.WASANDERES);
		}
	}

}
```

Klasse MainPanel:

```
package com.youza.gui;

import java.awt.CardLayout;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MainPanel extends JPanel{
	/**
	 * 
	 */
	private static final long serialVersionUID = 3250453526650826616L;
	private MainGui parent;
	public MainPanel(MainGui parent){
		this.parent = parent;
		this.setLayout(new CardLayout());
		
		//Begrüßungs Bildschirm
        JPanel card1 = new JPanel();
        card1.add(new JLabel("Hallo Nutzer"));
         
		
		//JPanel für Google Maps kannst des JPanel natürlich auch wieder auslagern
        JPanel card2 = new JPanel();
        card2.add(new JLabel("Du erwartest hoffentlich nicht das ich dir da jetzt ne Google Karte reinmache :-)"));
         
        //JPanel für was Anderes
        JPanel card3 = new JPanel();
        card3.add(new JLabel("Hier kannst du was anderes Anzeigen"));
        
        //Hier werden die Karten zum Mainpanel hinzugefügt und über den Hinteren String können sie nach vorne geholt werden
        this.add(card1, parent.GREETZ);
        this.add(card2, parent.GOOGLE);   
        this.add(card3, parent.WASANDERES);   
	}

}
```

Ich denke das ist dann schon mehr als ein Ansatz 

Viele Grüße
Youza


----------



## anyname (18. Juni 2013)

du bist einfach der beste******  danke


----------



## wildwolfsblut (1. Oktober 2019)

Auch von mir nochmal vielen Dank


----------

