Frame erfragen

Status
Nicht offen für weitere Antworten.

Feld

Mitglied
Hallo

weiß einer vielleicht wie ich den Frame bekomme in dem mein programm läuft?

ich hab also eine Klasse
Java:
public Class ClassInPanel extends JPanel 
{
...
public static void createAndShow ( )
	{
		JFrame frame = new JFrame ( );
		...
		frame.getContentPane ( ).add ( new ClassInPanel ( ) );
	}
}

Davor habe ich immer direkt von JFrame abgeleitet, aber dann hatte ich auf SUN Seite in Beispielen so ( von JPanel abgeleitet ) gesehen. Da dachte ich - die wissen schon was die machen, und habs auch übernomen - nur jetzt weiß ich nicht wie in der Klasse drinen die JFrame bekomme.
Weiß es einer?

In meinem Programm ist das unterste Element optional - d.h. man kann den ein oder ausschalten - dafür sage ich setVisible ( .. ) und es funktioniert, aber ich hätte noch gern das das fenster sich auch der Größe anpasst. Wenn ich jetzt den Frame als solches hätte, könnte ich einfach die Größe neu setzten - oder geht es irgendwie besser?

Danke wenn jemand sich die Zeit nimmt für Antwort
 
Davor habe ich immer direkt von JFrame abgeleitet, aber dann hatte ich auf SUN Seite in Beispielen so ( von JPanel abgeleitet ) gesehen. Da dachte ich - die wissen schon was die machen, und habs auch übernomen - nur jetzt weiß ich nicht wie in der Klasse drinen die JFrame bekomme.
Weiß es einer?

In meinem Programm ist das unterste Element optional - d.h. man kann den ein oder ausschalten - dafür sage ich setVisible ( .. ) und es funktioniert, aber ich hätte noch gern das das fenster sich auch der Größe anpasst. Wenn ich jetzt den Frame als solches hätte, könnte ich einfach die Größe neu setzten - oder geht es irgendwie besser?
??????????????????????????????????
ohne obiges wirklich zu verstehen, würde ich sagen an Deinem Konzept stimmt was nicht.
 
??????????????????????????????????
ohne obiges wirklich zu verstehen, würde ich sagen an Deinem Konzept stimmt was nicht.

Mir ist leider unklar was daran unklar sein soll, aber das ist nicht mein eigener Konzept, sondern der Konzept von SUN und deren Entwicklern - denselbigen die Java entwickelt haben - würde mal tippen das der Konzept stimmt
 
Java:
public static void createAndShow ( )
In der objektorientierten Programmierung sollte man nach Möglichkeit statische Methoden vermeiden.
nur jetzt weiß ich nicht wie in der Klasse drinen die JFrame bekomme
Willst Du in Deiner Klasse ClassInPanel auf den Frame zugreifen, der das Panel beinhaltet? Dann kannst Du den Frame als Klassenvariable deklarieren (ist allerdings eher schlechter Stil) oder das Konzept ändern.
In meinem Programm ist das unterste Element optional - d.h. man kann den ein oder ausschalten - dafür sage ich setVisible ( .. ) und es funktioniert, aber ich hätte noch gern das das fenster sich auch der Größe anpasst.
Was ist das unterste Element????
 
Also ich interpretiere es so 😉 ...

Anstatt von einem JFrame abzuleiten und die eigene GUI darin zu implementieren, erbt Feld von einem JPanel, welches seine GUI besitzt. Nun möchte er aber irgendwo in seinem Code z.B. einen "Schließen"-Button realisieren und sucht nun in der entsprechenden Ereignismethode (actionPerformed() zB) eine Zugriffsmöglichkeit auf das tatsächliche Fenster-Objekt. Dies ist in der ersten Variante (erbend von JFrame) einfach
Code:
this
, in der zweiten aber nicht.

Dafür gibts viele Möglichkeiten:
1. Dem eigenen Panel eine Referenz mitzugeben
2. über die
Code:
getParent()
-Methode den Frame suchen
3. über
Code:
Window.getWindows()
den Frame suchen
4. statische (globale) Referenz auf den Frame
5. (...)

Spontan tendiere ich zu 1. 🙂
 
MVC fällt unter (...) 😉
Jenachdem wie Feld sich seine Anwendung vorstellt bzw. umsetzen will, kann er natürlich z.B. über Listener arbeiten.
 
Es ist genau so KrokoDiehl schreibt.

Letzer Element ist ein JPanel mit JScrollpane mit JTextArea drin, dazu sind noch 2 JRadioButtons in einer ButtonGroup und ein JCheckBox - das alles zusammen ist der letzte Element ( bezogen auf das JPanel die alle übrigen teile beinhaltet ), kurzgesagt es sind Components ( wie unerwartet 😱 ) - habe eifach nicht gedacht das es etwas ändert, deswegen auch verkürzt

Leider kann ich den Zusammenhang zwischen meinem Problem ( das ich nicht weiß wie ich den Frame bekomme ) und MVC nicht nachvollziehen.
MVC ist implementiert, aber dient ausschließlich zum Verbinden von mehreren Teilen des Programms mit GUI. Sprich GUI hat die Teile als member wodurch ich von GUI aus alle Teile bedienen kann und die teile machen Ausgabe in dem die setChanged() und notifyObservers( this ) aufrufen.
Wäre cool wenn ich dies auch dazu verwenden könnte um JFrame in dem die Klasse eingefügt wird auch dadurch bekommen könnte

Hatte leider noch keine Zeit die Lösungvorschläge von KrokoDiehl auszuprobieren, aber im Gründe ist es genau das was ich suche
Danke
 
Zuletzt bearbeitet:
Eine Möglichkeit:
Java:
public class ClassInPanel extends JPanel {
	private static JFrame frame;

	public static void createAndShow() {
		frame = new JFrame();

		frame.getContentPane().add(new ClassInPanel());
	}
}
Allerdings könnt man in dem Fall genauso gut direkt von JFrame ableiten.
Ausserdem finde ich das mit dem static eher unschön.

Zu:
Leider kann ich den Zusammenhang zwischen meinem Problem ( das ich nicht weiß wie ich den Frame bekomme ) und MVC nicht nachvollziehen.
Man könnte z.B. den Frame als Controller des Panels definieren.
 
Kannst du bitte etwas genauer werden wie das funktionieren soll? -Ich würde gern so machen, aber in Java ist ja nicht üblich eigene ControllerKlasse zu erstellen - deswegen ist es auch mehr MV als MVC.

Ich habe heit Klasse
Java:
public Class Model extends Observable
{
private String msg;

public String getMsg()
{
return msg;
}

public void ausgabe ( String s )
{
text = s;
setChanged();
notifyObservers( this );
}

}

Dadurch wenn ich irgendwo ausgabe auf View machen möchte sage ich [DUKE]ausgabe("zeige dies in View" );[/DUKE]

In view sieht es dann so aus
Java:
public Class View extends Jpanel implements Observer
{
public View( )
{
/* erstelle eine schoene GUI */
}
@Override public void update ( Observable o, Object arg )
{
	textArea.append ( model.getMsg( ) );
}

public static void createAndShow ( )
{
	JFrame frame = new JFrame ( );
	
	// Add contents to the window.
	frame.getContentPane ( ).add ( new View ( ) );

}
}

So sieht momentan vereinfacht meine MVC implementierung aus.
An welcher Stelle muss ich den Listener einsetzten um den JFrame zu bekommen wo mein View drin "liegt"?

Würde es jetzt am liebsten Listener lösen, nur habe ich momentan leider keinen Plan wie ihr es meint.

Schreibt pls genau hin wie es geht. Danke
 
Zuletzt bearbeitet:
Wieso sollte es nicht üblich sein??

Kannst Du mal ein KSKB mit korrekten Code posten. Deine zwei Klassen haben momentan ja gar nichts miteinander zu tun.

sicher - wenn ich etwas für mich neues neues in mein Project implementiere dann mache ich meistens zuvor einen kleinen beispiel - in diesem Fall MVC muster. -Den poste ich unten

Das Programm macht nichts anderes als einfach jede sekunde ein Zahl in die JTextArea reinzuschreiben. Wenn jemand auf plus klikt dann wird das 1 erhöht und in JTextArea erscheint "plus X", bei minus um 1 verringern und letzte zahl löschen.

Die Sache ist dabei das Model nicht direkt die GUI kennt, sondern die ausgabe über die von Java API gestellte Klasse Observable und Interface Observer passiert. -Deswegen ist es möglich 1 GUI für unendlich viele Models zu verwenden.

Model:
Java:
package mvc;

import java.util.ArrayList;
import java.util.Observable;

public class InThread extends Observable implements Runnable
{
	private ArrayList < String > ar;
	private Thread t;
	private int count;
	Integer inter;
	
	public InThread ( )
	{
		ar = new ArrayList < String > ( );
		count = 0;
	}
	
	@Override public void run ( )
	{
		System.out.println ( "run aufgerufen" );
		inter = new Integer ( count++ );
		t = new Thread ( this );
		while ( ( t != null ) && ( !t.isInterrupted ( ) ) )
		{
			System.out.println ( "while schleife" );
			ar.add ( inter.toString ( ) );
			this.setChanged ( );
			this.notifyObservers ( this );
			
			synchronized ( t )
			{
				try
				{
					t.wait ( 1000 );
				} catch ( InterruptedException ie )
				{
					// ie.printStackTrace ( );
					t.interrupt ( ); // interrupt() widerholen... scheint wichtig
					t = null;
					System.out.println ( "setzte t auf null, interup bekommen" );
				}
			}
		}
	}
	
	public void plus ( )
	{
		inter = new Integer ( count++ );
		ar.add ( "plus" + inter.toString ( ) );
		setChanged ( );
		notifyObservers ( this );
	}
	
	public void minus ( )
	{
		count-- ;
		if ( ar.size ( ) > 0 )
		{
			ar.remove ( ar.size ( ) - 1 );
		}
		setChanged ( );
		notifyObservers ( this );
	}
	
	public ArrayList < String > getList ( )
	{
		return ar;
	}
	
	public Thread getThread ( )
	{
		return t;
	}
	
	public static void stopButton ( InThread it )
	{
		it.getThread ( ).interrupt ( );
		System.out.println ( "setzte t auf null" );
	}
	
}

jetzt die View
Java:
package mvc;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class ViewTestContr extends JPanel implements Observer, ActionListener
{
	private static final long serialVersionUID = 1849955180284919981L;
	private JButton plus = new JButton ( "plus" );
	private JButton minus = new JButton ( "minus" );
	private JButton ende = new JButton ( "Close" );
	private JTextArea text = new JTextArea ( 20, 10 );
	private InThread in = new InThread ( );
	private Thread tr;
	
	public ViewTestContr ( )
	{
		this.setLayout ( new BorderLayout ( ) );
		
		plus.setPreferredSize ( new Dimension ( 20, 50 ) );
		plus.addActionListener ( this );
		
		minus.setPreferredSize ( new Dimension ( 20, 50 ) );
		minus.addActionListener ( this );
		
		ende.addActionListener ( this );
		
		text.setWrapStyleWord ( true );
		text.setLineWrap ( true );
		text.setFocusable ( false );
		JScrollPane scrollPane2 = new JScrollPane ( text );
		add ( scrollPane2, -1 );
		
		this.setLayout ( new GridLayout ( 3, 1 ) );
		
		add ( plus, -1 );
		add ( minus, -1 );
		add ( ende, -1 );
		
		in.addObserver ( this );
		tr = new Thread ( in );
		tr.start ( );
	}
	
	public void change ( ArrayList < String > ar )
	{
		text.setText ( "" );
		for ( String element : ar )
		{
			text.append ( element + ", " );
		}
	}
	
	@Override public void update ( Observable o, Object arg )
	{
		this.change ( in.getList ( ) );
	}
	
	@Override public void actionPerformed ( ActionEvent e )
	{
		if ( e.getSource ( ) == ende )
		{
			System.out.println ( "ende" );
			tr.interrupt ( );
			System.exit ( 0 );
		}
		if ( e.getSource ( ) == plus )
		{
			in.plus ( );
		}
		if ( e.getSource ( ) == minus )
		{
			in.minus ( );
		}
	}
	
	public static class CloseListener extends WindowAdapter
	{
		@Override public void windowClosing ( WindowEvent e )
		{
			e.getWindow ( ).setVisible ( false );
			e.getWindow ( ).dispose ( );
			System.exit ( 0 );
		}
	}
	
	public static void createAndShow ( )
	{
		JFrame jf = new JFrame ( "ViewTestContr" );
		jf.setPreferredSize ( new Dimension ( 150, 250 ) );
		jf.addWindowListener ( new CloseListener ( ) );
		
		jf.getContentPane ( ).add ( new ViewTestContr ( ) );
		
		jf.pack ( );
		jf.setVisible ( true );
	}
}

und schließlich Main:
Java:
package mvc;

public class MainTest2
{
	public static void main ( String[] args )
	{
		javax.swing.SwingUtilities.invokeLater ( new Runnable ( )
		{
			public void run ( )
			{
				ViewTestContr.createAndShow ( );
			}
		} );
	}
	
}

Kannst du jetzt da rein schreiben wie ich in View das Fenster bekomme durch mvc mit listeners pls?
 
Kannst du jetzt da rein schreiben wie ich in View das Fenster bekomme durch mvc mit listeners pls?
Ich bin immer noch der Meinung, dass View garnichts vom Fenster wissen sollte.
Da ich ehrlich gesagt um die Zeit nicht mehr grossartig motiviert bin mich durch fremden Code zu beissen. Hier mal ein Bsp wie ich es mir vorstellen könnte, allerdings ohne den Teil mit dem Model (dafür reicht meine Motivation auch nicht mehr ;-))
Java:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class ExtendedMVC {
	public static void main(String[] args) {
		new MyController().load();
	}
}

class MyController implements ActionListener {
	private MyModel model;
	private MyView view;
	private JFrame frame;
	private int count = 0;
	private boolean isEnlarged = true;

	public MyController() {
		frame = new JFrame("Demo Frame");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(0, 0, 250, 100);

		model = new MyModel();
		view = new MyView(model);
		view.addActionListener(this);
		frame.getContentPane().add(view);
	}

	public void load() {
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}

	public void actionPerformed(ActionEvent evt) {
		if (evt.getActionCommand().equals(MyView.DO))
			view.setText("View modified by Conroller " + ++count + " time(s)");
		else if (evt.getActionCommand().equals(MyView.CHANGE)) {
			if (isEnlarged)
				frame.setSize(50, 100);
			else
				frame.setSize(250, 100);
			isEnlarged = !isEnlarged;
			frame.validate();
		}
	}
}

class MyView extends JPanel {
	public static String CHANGE = "AENDERE", DO = "MACHWAS";
	private JButton changeButton, doButton;
	private JLabel label;

	private MyModel model;

	public MyView(MyModel model) {
		this.model = model;
		this.setLayout(new GridLayout(3, 1));
		this.add(label = new JLabel("", JLabel.CENTER));
		this.add(doButton = new JButton("DO"));
		this.add(changeButton = new JButton("CHANGE"));
		doButton.setActionCommand(MyView.DO);
		changeButton.setActionCommand(MyView.CHANGE);
	}

	public void addActionListener(ActionListener listener) {
		changeButton.addActionListener(listener);
		doButton.addActionListener(listener);
	}

	public void setText(String text) {
		label.setText(text);
	}
}

class MyModel {

}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben