# Klassen verbinden?



## Gast (20. Nov 2007)

Hallo,
kann mir jemand weiterhelfen, wie kann ich zwei Klassen verbinden, damit ich die eine in der anderen verwenden kann, so wie hier:

Meine erste Klasse ist:

```
public class analyser extends javax.swing.JFrame
{
    public analyser() 
    {
        initComponents();
    }
    private void initComponents() 
   {
    //hier sind alle Komponente beschrieben, wie jlabel, jcombobox etc.
    }

    //dann kommen hier viele Methoden wie z.b.
    a(){}
    b(){}
    c(){}

    //so und das ist das Ende der einen Klasse

   private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                             
        System.exit(0);
    }                                            
    
    public static void main(String args[]) throws FileNotFoundException, IOException {
       
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new analyser().setVisible(true);
            }
        });
    }
```


Nun kommt die "andere" Klasse, die ich gerne in der "oberen" Klasse verwenden würde und in der "anderen" Klasse auch Methoden von der "oberen" Klasse verwenden kann?!


```
package org.jfree.chart.demo;

import java.awt.Color;
import java.awt.Font;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.IntervalMarker;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.IntervalXYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.Layer;
import org.jfree.ui.RectangleAnchor;
import org.jfree.ui.RefineryUtilities;
import org.jfree.ui.TextAnchor;

import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.table.DefaultTableModel; 




public class Main extends ApplicationFrame 
{
    public Main(String title) 
    {
        super(title);
        IntervalXYDataset dataset = createDataset();
        JFreeChart chart = createChart(dataset);
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        setContentPane(chartPanel);
    }
   
    private IntervalXYDataset createDataset() 
    {
        final XYSeries series = new XYSeries("Random Data");
        series.add(1.0, 500.2);
        series.add(5.0, 294.1);
        series.add(4.0, 100.0);
        series.add(12.5, 734.4);
        series.add(17.3, 453.2);
        series.add(21.2, 500.2);
        series.add(21.9, null);
        series.add(25.6, 734.4);
        series.add(30.0, 453.2);
        final XYSeriesCollection dataset = new XYSeriesCollection(series);
        return dataset;
    }

    private JFreeChart createChart(IntervalXYDataset dataset) 
    {
        final JFreeChart chart = ChartFactory.createXYBarChart(
            "XY Series Demo",
            "X", 
            false,
            "Y", 
            dataset,
            PlotOrientation.VERTICAL,
            true,
            true,
            false
        );
        XYPlot plot = (XYPlot) chart.getPlot();
        final IntervalMarker target = new IntervalMarker(400.0, 700.0);
        target.setLabel("Target Range");
        target.setLabelFont(new Font("SansSerif", Font.ITALIC, 11));
        target.setLabelAnchor(RectangleAnchor.LEFT);
        target.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
        target.setPaint(new Color(222, 222, 255, 128));
        plot.addRangeMarker(target, Layer.BACKGROUND);
        return chart;    
    }
    
    
       
    public static void main( String[] args) 
    {

        final Main demo = new Main("XY Series Demo 3");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);

    }
}
```


Danke im Voraus und Gruss


----------



## SlaterB (20. Nov 2007)

Klassen groß schreiben!

Exemplarvariablen definieren und im Konstruktor austauschen
z.B.


```
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        new A();
    }
}


class A
{
    private B b;

    A()
    {
        this.b = new B(this);
        this.b.b();
    }

    void a()
    {
        System.out.println("a");
    }
}


class B
{
    private A a;

    B(A a)
    {
        this.a = a;
        this.a.a();
    }

    void b()
    {
        System.out.println("b");
    }
}
```


----------



## foxy (20. Nov 2007)

also im regefall machst du nur ein neues Objekt wenn du es auch wirklich brauchst ...

also wenn du deine main in einer methode brauchst, dann machst du es auch nur dort

bsp: 

Main m = new Main("Mein Titel");

dann kannst du mit

m.methode();

die methoden aufrufen ... wenn du es im konstruktor machst, bleibt das objekt bestehen, bis die gesamte klasse die es im konstruktor aufruft, mit dem garbagekollektor weggeräumt wird und somit keine referenz mehr auf das new Objekt mehr besteht ...

machst du es in deiner methode .. räumt der kollektor das früher weg ... also hast du dadruch weniger speicherbelastung

bei kleinen Programmen egal .. bei grossen projekt sollte man auf sowas achten


----------



## Guest (20. Nov 2007)

Hi,
es klappt irgendwie nicht, wenn ich es so mache:


```
public class analyser extends javax.swing.JFrame
{
    public analyser()
    {
        initComponents();
    }
    private void initComponents()
   {
    //hier sind alle Komponente beschrieben, wie jlabel, jcombobox etc.
    }

    //dann kommen hier viele Methoden wie z.b.
    a(){}
    b(){}
    c(){}

    //so und das ist das Ende der einen Klasse

   private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                             
        System.exit(0);
    }                                           
   
    public static void main(String args[]) throws FileNotFoundException, IOException {

       [b]new A;[/b]
       
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new analyser().setVisible(true);
            }
        });
    } 




class A extends ApplicationFrame 
{
    A(String title) 
    {
        super(title);
        IntervalXYDataset dataset = createDataset();
        JFreeChart chart = createChart(dataset);
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        setContentPane(chartPanel);
    }
   
    private IntervalXYDataset createDataset() 
    {
        final XYSeries series = new XYSeries("Random Data");
        series.add(1.0, 500.2);
        series.add(5.0, 294.1);
        series.add(4.0, 100.0);
        series.add(12.5, 734.4);
        series.add(17.3, 453.2);
        series.add(21.2, 500.2);
        series.add(21.9, null);
        series.add(25.6, 734.4);
        series.add(30.0, 453.2);
        final XYSeriesCollection dataset = new XYSeriesCollection(series);
        return dataset;
    }

    private JFreeChart createChart(IntervalXYDataset dataset) 
    {
        final JFreeChart chart = ChartFactory.createXYBarChart(
            "XY Series Demo",
            "X", 
            false,
            "Y", 
            dataset,
            PlotOrientation.VERTICAL,
            true,
            true,
            false
        );
        XYPlot plot = (XYPlot) chart.getPlot();
        final IntervalMarker target = new IntervalMarker(400.0, 700.0);
        target.setLabel("Target Range");
        target.setLabelFont(new Font("SansSerif", Font.ITALIC, 11));
        target.setLabelAnchor(RectangleAnchor.LEFT);
        target.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
        target.setPaint(new Color(222, 222, 255, 128));
        plot.addRangeMarker(target, Layer.BACKGROUND);
        return chart;    
    }
    
    
       
    public static void main( String[] args) 
    {
        final A demo = new A("XY Series Demo 3");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}
```

Da kommt die folgende Fehlermeldung:
symbol  : constructor A()
location: class org.jfree.chart.demo.A
        new A();


----------



## foxy (20. Nov 2007)

du musst für new A("einen string mitgeben")

da dieser im konstruktor von A steht und diesen benötigt


ausserdem macht man die main klasse, nicht als innerclass ... 

deswegen heisst es mainklasse ... das kommt alleine in eine eigene klasse und nicht in eine innerclass


----------



## Guest (20. Nov 2007)

Ja jetzt kommen auch keine Fehlermeldungen, ich kriege auch mein Projekt gestartet, aber, wie kriege ich diese Klasse A gestartet aus diesem Projekt?


----------



## SlaterB (20. Nov 2007)

erstmal entscheidest du dich für eine main, ein Programm hat immer noch genau eine main,
um welche geht es denn gerade?

und was ist nun konkret dein Problem..


----------



## Guest (20. Nov 2007)

Ja, jetzt habe ich auch nur eine Main und zwar hier:


```
public class analyser extends javax.swing.JFrame
{
    public analyser()
    {
        initComponents();
    }
    private void initComponents()
   {
    //hier sind alle Komponente beschrieben, wie jlabel, jcombobox etc.
    }

    //dann kommen hier viele Methoden wie z.b.
    a(){}
    b(){}
    c(){}

    //so und das ist das Ende der einen Klasse

   private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                             
        System.exit(0);
    }                                           
   
    public static void main(String args[]) throws FileNotFoundException, IOException {
       
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new A("JA AHUJEJU").setVisible(true);
            }
        });

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new analyser().setVisible(true);
            }
        });
    }
```

Jetzt wollte ich die Klasse analyser, also die oben starten und diese soll auch die KLasse A auslösen!

Die Klasse A sieht jetzt so aus:

```
class A extends ApplicationFrame 
{
    A(String title) 
    {
        super(title);
        //IntervalXYDataset dataset = createDataset();
        final XYSeries series = new XYSeries("Random Data");
        series.add(1.0, 500.2);
        series.add(5.0, 294.1);
        series.add(4.0, 100.0);
        series.add(12.5, 734.4);
        series.add(17.3, 453.2);
        series.add(21.2, 500.2);
        series.add(21.9, null);
        series.add(25.6, 734.4);
        series.add(30.0, 453.2);
        final XYSeriesCollection dataset = new XYSeriesCollection(series);
        
       //JFreeChart chart = createChart(dataset);
        final JFreeChart chart = ChartFactory.createXYBarChart(
            "XY Series Demo",
            "X", 
            false,
            "Y", 
            dataset,
            PlotOrientation.VERTICAL,
            true,
            true,
            false
        );
        XYPlot plot = (XYPlot) chart.getPlot();
        final IntervalMarker target = new IntervalMarker(400.0, 700.0);
        target.setLabel("Target Range");
        target.setLabelFont(new Font("SansSerif", Font.ITALIC, 11));
        target.setLabelAnchor(RectangleAnchor.LEFT);
        target.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
        target.setPaint(new Color(222, 222, 255, 128));
        plot.addRangeMarker(target, Layer.BACKGROUND);
        
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        setContentPane(chartPanel);
               
        final A demo = new A("XY Series Demo 3");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}
```


----------



## foxy (20. Nov 2007)

```
public static void main(String args[]) throws FileNotFoundException, IOException {

       
       
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new analyser().setVisible(true);
            }
        });
    }
```
deine erste klasse ...


```
import javax.swing.*;

public class Analyser extends JFrame
{
    private A klasseA;
     public analyser()
    {
        klasseA = new A("Test");
        initComponents();
    }
    private void initComponents()
   {
    //hier sind alle Komponente beschrieben, wie jlabel, jcombobox etc.
    }

    //dann kommen hier viele Methoden wie z.b.
    a(){}
    b(){}
    c(){}

    //so und das ist das Ende der einen Klasse

   private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                             
        System.exit(0);
    }
```

dann hast du deine klasse A in deine klasse analyser eingebunden
und kannst da alle methoden mit 

klasseA.methode() aufrufen


----------



## SlaterB (20. Nov 2007)

>  diese soll auch die KLasse A auslösen!

klingt nicht nach der Programmiersprache Java, worum gehts konkret?

wenn du im Konstrktur von analyser ein Fenster A erstellen und anzeigen möchtest, dann tue es oder benenne deine Problem dabei,
dann aber das new A() aus der main weg, sonst hast du zwei A-Fenster

wenn du, wie ursprünglich mal das Thema, analyzer eine Referenz auf A geben willst, dann tue dies doch

java.awt.EventQueue.invokeLater(new Runnable() { 
            public void run() { 
                A a = new A("JA AHUJEJU").setVisible(true); 
                new analyser(a).setVisible(true); 
            } 
        }); 

der Konstruktor von analyzer muss natürlich den Parameter korrekt verarbeiten

Klassen groß schreiben!!
und andere Namen als A wählen,
für mein Beispiel mit 10 Zeilen-Klassen geht das ja noch halbwegs, bei dir sieht das schlimm aus,
Main war auch nicht toll, aber etwas besser


----------



## Leroy42 (20. Nov 2007)

Anonymous hat gesagt.:
			
		

> und diese soll auch die KLasse A _auslösen_!


  :shock:  ???:L 

Wo hast du denn OOP (OOD) gelernt?

In der Baumschule?

(Sorry, aber deine Ausdrucksweise läßt auf sowas schließen)


----------



## foxy (20. Nov 2007)

ich glaube eher in C *fg*

*ironieOFF*


----------



## DaDonDerDritte (28. Aug 2009)

Habe diesbezüglich auch noch ne Frage. Und zwar habe ich mehrere Klassen, und will diese einfach nur miteinander verbinden. Ein Beispiel habe ich schon gesehen "private User user;"
das erste User ist die andere Klasse, aber was soll das zweite user, was stellt dieses dar?


----------



## ARadauer (28. Aug 2009)

den Namen der Variable... 

bitte eigene Threads aufmachen


----------



## DaDonDerDritte (28. Aug 2009)

Und was ist wenn ich jetzt die Klasse Gruppe mit der Klasse Rolle verbinden will?
private Rolle ???;
Ja ok werde für meine nächste Frage nen eigenen Thread eröffnen


----------

