# über Button andere Java Klasse aufrufen



## kakulala (10. Aug 2017)

Hey Leute,
ich habe eine Oberfläche (Container mit 2  Buttons). Der erste Buttonaufruf funktioniert, jetzt habe ich jedoch ein Programm geschrieben, dass einen XY-Graphen wiedergeben soll. Dieses soll aufgerufen werden, wenn man auf den zweiten Button klickt. Leider funktioniert es nicht. Ich habe im ActionListener (in meiner Klasse leftPanel) bereits ein neues Objekt das auf die Graphen-Klasse zeigt angelegt. (die Klassen befinden sich auch alle im gleichen Ordner ;-) )
vielleicht findet ja jmd meinen Fehler...
meine main:

```
public class main {
    public static void main(String[]args){
        new mainGui();
    }

}
```


meine mainGui

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

    final protected String WELCOME = "Grüße";
    final protected String SCHRITT1 = "Test1";
    final protected String SCHRITT2 = "Graph";
  
  
    protected leftPanel jpLeft = new leftPanel(this);
    protected mainPanel jpMain = new mainPanel(this);
    public mainGui() {
     
      
        GridBagLayout gbl = new GridBagLayout();
        Container container = this.getContentPane();
        gridBagLayoutHelper.addComponent(container, gbl, jpLeft, 0, 0, 1, 1, 0.2, 1);
        gridBagLayoutHelper.addComponent(container, gbl, jpMain, 1, 0, 1, 1, 0.8, 1);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(gbl);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        d = new Dimension(d.width/2,d.height/2);
        this.setSize(d);
        this.setLocationRelativeTo(null);
        this.setTitle("Test des Programms");
        this.setVisible(true);
    }
 
}
```

mein leftPanel (mit Klasse ActionListener)

```
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 JButton Schritt1;
    private JButton Schritt2;
    private mainGui parent;
    public leftPanel(mainGui parent) {
        this.parent = parent;
        GridBagLayout gbl = new GridBagLayout();
        Container container = this;
        Schritt1 = new JButton("Schritt 1");
        Schritt2 = new JButton("Schritt 2");
        Schritt1.setActionCommand("Schritt_1");
        Schritt1.addActionListener(this);
      
        Schritt2.setActionCommand("Schritt_2");
        Schritt2.addActionListener(this);
        gridBagLayoutHelper.addComponentPadding(container, gbl, Schritt1, 0, 0, 1, 1, 1, 1);
        gridBagLayoutHelper.addComponentPadding(container, gbl, Schritt2, 0, 1, 1, 1, 1, 1);
     
        this.setLayout(gbl);
    }
  
    @Override
    public void actionPerformed(ActionEvent event) {
        if (event.getActionCommand().equals("Schritt_1")) {
            CardLayout cl = (CardLayout) (parent.jpMain.getLayout());
            cl.show(parent.jpMain, parent.SCHRITT1);
           //funktionierender Button bzw Progammaufruf
            test t = new test(parent);
        } else if (event.getActionCommand().equals("Schritt_2")) {
            CardLayout cl = (CardLayout) (parent.jpMain.getLayout());
            cl.show(parent.jpMain, parent.SCHRITT2);
            graph c = new graph(parent);
        }
      
      
    }
}
```

Mein mainPanel:

```
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());
      
       
        JPanel card1 = new JPanel();
        card1.add(new JLabel("Hallo Nutzer, willkommen"));
        JPanel card2 = new JPanel();
        card2.add(new JLabel("Schritt 1 ausgeführt"));
        JPanel card3 = new JPanel();
        card3.add(new JLabel("Schritt 2 ausgeführt"));
      
      
        //Hinzufügen der 'cards' zum Mainpanel
        //über den Hinteren String können sie nach vorne geholt werden
        this.add(card1, parent.WELCOME);
        this.add(card2, parent.SCHRITT1); 
        this.add(card3, parent.SCHRITT2); 
     
       
       
    }
}
```


mein gridBagLayout

```
import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
public class gridBagLayoutHelper {
  
    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);
    }
    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);
    }

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

und mein Graph (welches bei Schritt 2 ausgelöst werden sollte, aber nicht funktioniert)


```
import java.awt.*;
import java.io.*;
import java.text.*;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.regex.*;
import org.jfree.chart.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.plot.*;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.*;
import org.jfree.ui.*;

public class Graph {

  
    public Graph(mainGui parent) {
  
        EventQueue.invokeLater(() -> {
            ApplicationFrame frame = new ApplicationFrame("Anzeige der Testwerte");
            Graph test = new Graph(parent);
            try {
                frame.add(test.createChart("Test"));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
  
    /*
  
    //Main-Methode, damit das Programm einzeln laufen kann
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            ApplicationFrame frame = new ApplicationFrame("Anzeige der Testwerte");
            Graph test = new Graph();
            try {
                frame.add(test.createChart("Test"));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }

    */
  
    private ChartPanel createChart(String chartTitle) throws IOException {
        //title, x-axis label, y-axis label, data, create legend?, generate tooltips?, generate URLs?
        JFreeChart chart = ChartFactory.createTimeSeriesChart(chartTitle,
                "Zeit", "Testwerte", createDataset(), true, true, false);
        ChartPanel chartPanel = new ChartPanel(chart);
        XYPlot plot = chart.getXYPlot();
        DateAxis axis = (DateAxis) plot.getDomainAxis();
        SimpleDateFormat df = new SimpleDateFormat("HH:mm:ssX");
        df.setTimeZone(TimeZone.getTimeZone("UTC"));
        axis.setDateFormatOverride(SimpleDateFormat.getTimeInstance());
        plot.setBackgroundPaint(Color.WHITE);
        return chartPanel;
    }

    private TimeSeriesCollection createDataset() throws IOException {
        //Klassifizierung der Textdatei + Inhalt
        File test = new File("test.txt");
        String line1;
        String line2;
        try ( // Einlesen der Textdatei
                BufferedReader br = new BufferedReader(new FileReader(test))) {
            //Inhalt wird zeilenweise gelesen
            line1 = br.readLine();
            line2 = br.readLine();
        }
      
      

        //TimeSeries wird kreiert
        TimeSeries series = new TimeSeries("Testwerte");
        TimeSeriesCollection dataset = new TimeSeriesCollection(series);

        //......
  
      
        return (TimeSeriesCollection) dataset;
    }

    //......

}
```


----------



## kakulala (10. Aug 2017)

Ich hab mein Programm jetzt ausgebessert, also es funktioniert 
Hat vielleicht noch jemand ne Idee, wie ich die Anzeige also die Klasse "Graph" wieder beende?? wenn ich den Button aufrufe, erscheint nun der Graph aber in einer Endlosschleife....wie stopp ich das?


----------



## Harry Kane (10. Aug 2017)

kakulala hat gesagt.:


> wie stopp ich das


Wie sollen wir das ohne den "ausgebesserten" Code wissen?
Wenn du ihn nicht ausgebessert hättest, würe ich vermuten, dass es irgendwie an der Endlosschleife liegt, die dadurch entsteht, weil im Konstruktor von Graph der Konstruktor von Graph aufgerufen wird.


----------



## kakulala (11. Aug 2017)

Harry Kane hat gesagt.:


> Wie sollen wir das ohne den "ausgebesserten" Code wissen?
> Wenn du ihn nicht ausgebessert hättest, würe ich vermuten, dass es irgendwie an der Endlosschleife liegt, die dadurch entsteht, weil im Konstruktor von Graph der Konstruktor von Graph aufgerufen wird.


Der Code ist schon ausgebessert, hab im Actionlistener das Objekt falsch benannt....aber die Endlosschleife hab ich ned bemerkt...
wie beende ich die denn am besten?


----------



## VfL_Freak (11. Aug 2017)

Moin,


kakulala hat gesagt.:


> Der Code ist schon ausgebessert,


Nur sehen wir ihn immer noch nicht ..... 

Aber beachte doch einfach mal den Hinweis im Beitrag von  @Harry Kane !!

VG Klaus


----------



## kakulala (11. Aug 2017)

VfL_Freak hat gesagt.:


> Moin,
> 
> Nur sehen wir ihn immer noch nicht .....
> 
> ...


Eigentlich schon ;-) Der ausgebesserte Code steht schon oben, ich war nur nicht schlau genug den auch richtig auszuprobieren ..... 

Ich seh jetzt nicht wirklich wo der Konstruktor nochmal aufgerufen wird...


----------



## VfL_Freak (11. Aug 2017)

Moin,



kakulala hat gesagt.:


> Der ausgebesserte Code steht schon oben


aha, und woher sollen wir das wissen rsp. sehen, WAS du geändert hast ?? 

Wie wäre hiermit ?? 


kakulala hat gesagt.:


> public Graph(mainGui parent)
> {
> EventQueue.invokeLater(() -> {
> ApplicationFrame frame = new ApplicationFrame("Anzeige der Testwerte");
> ...



VG Klaus


----------



## kakulala (11. Aug 2017)

VfL_Freak hat gesagt.:


> Wie wäre hiermit ??


Danke, aber auch wenn ich mein 
	
	
	
	





```
parent
```
 rausmache hier, oder gar die ganze Zeile, brauche ich doch schon in der nächsten  
	
	
	
	





```
test
```
 für meinen Graphen...


----------



## VfL_Freak (11. Aug 2017)

Moin,

'parent' ist auch kein Konstruktor .... 
'new Graph(...)' ist ein Konstruktor !!!

VG Klaus


----------



## kakulala (11. Aug 2017)

VfL_Freak hat gesagt.:


> 'new Graph(...)' ist ein Konstruktor !!!


jap, das ist mir schon bewusst....aber ich wüsste nicht wie ich ohne ihn, meinen Graphen erzeugen könnte - auch wenn sich das jetzt blöd anhört


----------



## VfL_Freak (11. Aug 2017)

Moin,
nochmal:

```
public Graph(mainGui parent)  // DIES IST DEIN KONSTRUKTOR !!
{
    EventQueue.invokeLater(() ->
    {
         ApplicationFrame frame = new ApplicationFrame("Anzeige der Testwerte");
         Graph test = new Graph(parent);  // HIER RUFST DU IHN IMMER WIEDER NEU AUF --> endlose verschachtelung !!!!
// ...
    });
}  // END OF KONSTRUKTOR !!
```
Außerdem machst Du auch nichts weiter mit "_*test*_" ....
Aber so wirklich durchblicke ich die Intension Deines Codes auch nicht wirklich 

VG Klaus


----------



## kakulala (11. Aug 2017)

VfL_Freak hat gesagt.:


> Außerdem machst Du auch nichts weiter mit "_*test*_" ....


in der darauffolgenden Try-Catch brauche ich ihn halt... für den Chart



```
public Graph()
{
    EventQueue.invokeLater(() ->
    {
         ApplicationFrame frame = new ApplicationFrame("Anzeige der Testwerte");
         Graph test = new Graph();
try {
                frame.add(test.createChart("Test")); <- Hier verwende ich test nochmal
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
// ...
    });
}
```


----------



## VfL_Freak (11. Aug 2017)

stimmt, habe ich übersehen - sorry


----------



## kakulala (11. Aug 2017)

VfL_Freak hat gesagt.:


> stimmt, habe ich übersehen - sorry


Irgendwelche Ideen wie ich die Endlosschleife trotzdem unterbrechen kann?


----------



## mrBrown (11. Aug 2017)

ja - statt `test` `this` benutzen


----------



## kakulala (16. Aug 2017)

mrBrown hat gesagt.:


> ja - statt `test` `this` benutzen


Jap, super Danke. Es funktioniert.


----------

