Swing Beziehungen zwischen 3 Klassen

Pacman92

Mitglied
Hallo,

ich habe 3 Klassen:

Die Klasse 1 ist meine Start-Klasse
Java:
Klasse1 {

static void main()
{
Klasse2 menue = new Klasse2()
menue.anzeigen
Thread t1 = new Thread(new Klass3());
t1.start();	
}
}

Klasse2 macht das Menü:

Klasse2 {
void anzeigen() {
..zeichnen der einzelnen Komponenten unter anderen eine Liste
}

Klasse3{
void run() {
hier will ich einen Eintrag in die Liste machen ...
}
} }

Ich bekomm also in dem separten Thread Daten die ich in das Menü eintragen will. Habe ich da einen Denkfehler drinne oder geht das gar nicht? Bzw. wenn es geht, wie mache ich es dann am besten.

Schonmal danke für eure Hilfe
 
Die erste Klasse brauchst Du schon mal gar nicht, wenn die nur die main-Methode enthält.

Was das Bekanntmachen der beiden anderen Klassen zueinander betrifft, geht das schon. Am einfachsten als Referenz, d. h. daß z. B. Klasse3 eine Instanzvariable in Klasse2 ist. Da Du alles nur sehr rudimentär hingeschrieben hast, will ich da keine pauschale Empfehlung abgeben.

Grob skizziert könnte das so aussehen:

Java:
public class Klasse2 implements Runnable{

  Klasse3 ref;

  public static void main(...){
    new Klasse2();
  }

  public Klasse2(){
    ref = new Klasse3();
   Thread th = new Thread(this);
    th.start();
    ....
  }

  public void machWasMitKlasse3(){
     ref.hierPassiertWas();

  }
}
 
Hallo,

danke für deine Antwort, ich hänge dir mal meine 3 Klasse an, ich hoffe dadruch wird logischer was ich mir gedacht habe:

Java:
public class Hauptmenue {
	public static void main(String[] args) {
		//Zeichnen des Hauptmenues		
		ZeichneHauptmenue hauptmenue = new ZeichneHauptmenue();
		hauptmenue.zeichnen();
		hauptmenue.anzeigen(true);
		//Definieren des SystemTray Icons
		hauptmenue.tray();
		Thread t1 = new Thread(new ClientConnect());
		t1.start();		
	}
}

Java:
public class ZeichneHauptmenue {
//Definieren der Elemente
private JButton schliesen, nachricht;
private JWindow window;
private DefaultListModel nutzer;
private JList liste;

	public void zeichnen()
	{
		//Definieren der Variablen
		final Icon icon1 = new ImageIcon(ZeichneHauptmenue.class.getResource("images/delete.gif"));
		// Window erstellen
		window = new JWindow();
		window.setLayout(new FlowLayout());
		//frame.setBounds(java.awt.Toolkit.getDefaultToolkit().getScreenSize().width - 150, java.awt.Toolkit.getDefaultToolkit().getScreenSize().height -30, 150, java.awt.Toolkit.getDefaultToolkit().getScreenSize().height - 30);
		window.setBounds(java.awt.Toolkit.getDefaultToolkit().getScreenSize().width - 150, 40, 150, GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().height - 40);
		window.setAlwaysOnTop(true);
		//Tabellenlayout erzeugen
	    double border = 5;
	    double size[][] =
	        {{border, TableLayout.FILL, 20, border},  // Spalten
	         {border, 20, TableLayout.FILL, 20, border}}; // Reihen
		Container container = window.getContentPane();
		container.setLayout(new TableLayout(size));

		//Einfügen der Elemente
		schliesen = new JButton();
		schliesen.setIcon(icon1);
		schliesen.addActionListener(new schliesen_klick());
		container.add(schliesen, "2,1");
		
		nachricht = new JButton("Text");
		nachricht.setVisible(false);
		container.add(nachricht, "1,3,2,3");
		
		nutzer = new DefaultListModel();
		liste = new JList(nutzer);
		liste.setBorder(BorderFactory.createLineBorder(Color.black));
		container.add(liste, "1,2,2,2");
			
	}

	public void anzeigen(Boolean status) {
		window.setVisible(status);	
	}
	

	public void tray() {
		Image image = Toolkit.getDefaultToolkit().getImage(ZeichneHauptmenue.class.getResource( "images/raupe.gif") );
		PopupMenu popup = new PopupMenu();
		MenuItem beenden = new MenuItem( "Ende" );
		
		beenden.addActionListener( new ActionListener()
		{public void actionPerformed( ActionEvent e )
		{System.exit( 0 );} } );
		popup.add(beenden);
		
		
		TrayIcon trayIcon = new TrayIcon( image, "BBNotify", popup );
		trayIcon.setImageAutoSize( true );
		SystemTray tray = SystemTray.getSystemTray();
		try {
			tray.add( trayIcon );
		} catch (AWTException e1) {}
	}
	
	public void insert_daten(String daten)
	{
		nutzer.addElement(daten);
	}	

	private class schliesen_klick implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			window.setVisible(false);
		}		
	}
	
	
	
}

Java:
public class ClientConnect implements Runnable {

	/**
	 * Ausführende Methode
	 */
	@Override
	public void run() {
		try {
		Socket server = new Socket( "localhost", 3141 );
		 Scanner in  = new Scanner( server.getInputStream() );
		 PrintWriter out = new PrintWriter( server.getOutputStream(), true );
		 out.println( "Hallo" );

		 
		} catch(Exception e) {
			System.out.println("error");
		}
		
		
	}
	
	
	

}

In der 3. Klasse will ich jetzt einen Eintrag in die Liste machen.

Habe ich das ganze Konzept falsch verstanden?
 
Dann müsste ClientConnect - z.B. im Konstruktor - eine Referenz auf die Liste oder auf die Instanz von ZeichneHauptmenue (wo dann noch ein Getter für die Liste hinzukommen müsste) bekommen.

Schöne wäre aber wohl, das weniger eng zu verkoppeln und ein neues Interface einzuführen:
Java:
interface ItemList {
  public void addItem( String whatever);
}

Jetzt müsste ClientConnect nur dieses Interface kennen und z.B. im Konstruktor ein Objekt übergeben bekommen, welches dieses Inetrface implementiert.

ZeichneHauptmenue müsste dann lediglich dieses Interface implementieren.


<OT>Die Benamung deiner Klassen solltest du noch mal überdenken</OT>
 

Zurück
Oben