über Button andere Java Klasse aufrufen

kakulala

Mitglied
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:
Java:
public class main {
    public static void main(String[]args){
        new mainGui();
    }

}


meine mainGui
Java:
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)
Java:
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:
Java:
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
Java:
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)

Java:
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;
    }

    //......

}
 
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?
 
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?
 
Moin,
nochmal:
Java:
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
 
Außerdem machst Du auch nichts weiter mit "test" ....
in der darauffolgenden Try-Catch brauche ich ihn halt... für den Chart


Java:
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();
            }
// ...
    });
}
 

Zurück
Oben