Swing Prog in mehrere Klassen zerlegen

Status
Nicht offen für weitere Antworten.

Holgrich

Mitglied
Hallöchen

ich habe mit Swing ein Programm zu schrieben, dass u.a. eine Uhr anzeigen kann. Ich wollte das Programm in mehrere Klassen zerlegen, hier der Code:


Die main-Methode
Code:
import javax.swing.*;

public class Main
{		
	private static final long serialVersionUID = 1L;
	private JFrame _frame;
	
	public Main ()
	{
		_frame = new Aufbau(); 
		_frame.setDefaultCloseOperation(3);
		_frame.setVisible(true);	
	}
	
	public static void main( String args[] )
	{
		new Main();
	}
}

dazu die Klasse Aufbau
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Aufbau extends JFrame
{
	private JPopupMenu _popup;
	
	public Aufbau()
	{
		JMenuBar  menue     = new JMenuBar();
		JMenu     bedienung = new JMenu("Bedienung"); 		
		JMenuItem anzeige   = new JMenuItem("Anzeige");
		JMenuItem alarm     = new JMenuItem("Alarm");
		JMenuItem beenden   = new JMenuItem("Beenden");

                [...]

                menue.add(bedienung);
		menue.add(sekunden);
		menue.add(Box.createGlue());
		menue.add(hilfe);
	}

aber wenn ich es jetzt ausführe öffnet sich ein leeres Fenster. Weiß jmd warum?
 
weil du keine Elemente in das JFrame einfügst, oder poste/ benenne die entsprechenden Befehle

das menue hat beispielsweise keine Verbindung zum JFrame
 
läuft eigentlich so:

JFrame erzeugen
Panel erzeugen was du aufs JFrame packst (sonst siehst du immer nur die zuletzt geaddete komponente)
und alles was du nun brauchst auf das panel packen

Menu kannst du direkt mit JFrame-methode festlegen (setJMenuBar)

dann sollte das gehen

zB:
Code:
public void setup(String mainFrameName) {	
		mainFrame = new JFrame(mainFrameName);
		mainFrame.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
		
		//create mainPanel with BorderLayout
		mainPanel = new JPanel(new BorderLayout(0,0));
		
		//create toolbarMenu
		mainPanel.add(setupToolbar(),BorderLayout.NORTH);
		
		//create cardPanel and add Cards
		cardPanel = new JPanel(new CardLayout());
		
		for (CardController c: cc) {
			c.initCard(cardPanel);
		}//for
		
		//add cardPanel
		mainPanel.add(cardPanel,BorderLayout.CENTER);
		
		//create statusbarPanel
		mainPanel.add(setupStatusbar(),BorderLayout.SOUTH);
		
		mainFrame.add(mainPanel); // >> Panel aufs Frame packen, als einzige Komponente <<
		
		//create menubar
		mainFrame.setJMenuBar(setupMenubar());
		
		mainFrame.pack();
		
		//centered on desktop
		java.awt.Rectangle maxBounds = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
		mainFrame.setLocation((maxBounds.width-mainFrame.getWidth())/2, 
						      (maxBounds.height-mainFrame.getHeight())/2);
		
		mainFrame.setVisible(true);
	}//init
 
genauer: setMenuBar() (edit: oh, schon gefunden bzw. wenn es setJMenuBar() gibt, dann ist das sicher besser 😉 )

und um mögliche Folgefragen vorzugreifen: wenn immer noch nichts zu sehen ist, mehr Code posten,
idealerweise ein vollständiges Programm,

solange nix zu sehen ist, reicht übrigens EIN beliebiges Element, es müssen nicht 10 Menüs, 20 sonstige Elemente usw. gleichzeitig sein
 
Weiterhin würde ich
Code:
 _frame.setDefaultCloseOperation(3);

Ändern. Es gibt in der Klasse JFrame statische Variablen, die die Integerwerte unter einem Namen kapseln, z.B.

Code:
JFrame.EXIT_ON_CLOSE

Mit 3 können vermutlich die wenigsten etwas anfangen, wohingegen man bei EXIT_ON_CLOSE sofort weiß was passiert.

mfg
Michael
 
jo danke, dachte mir das ganze programm wäre zu unübersichtlich, deswegen hab ich den mittelteil rausgeschnitten. und es ist so umfangreich, weils ja eigentlich schon lief, nur das zerlegen in mehrere klassen hat wieder alles geschrottet.

noch eine frage vom swing-newbie: wenn ich jetzt das panel in einer extra klasse erstellen will funktioniert das dann so:

Code:
import java.text.SimpleDateFormat;
import javax.swing.*;

public class UhrAnsicht extends JComponent
{
	private JComponent _panel;
	
	public UhrAnsicht()
	{	
		_panel = new Digital(new SimpleDateFormat("HH:MM:SS"));
	}
}

(Digital ist ne selbstgeschrieben Klasse, die einfach nur die Zeit als Digitalanzeige, also als STring zurückgibt)
 
Digital ist ne selbstgeschrieben Klasse, die einfach nur die Zeit als Digitalanzeige, also als STring zurückgibt

da bestünde ja nicht unbedingt die nötigkeit, das diese Klasse von JComponent erbt ( was sich aus der Nutzung im code ergibt) ... du kannst die Anzeige von JComponent erben oder gleich von Panel und legst da n label drauf, was sich den wert aus der digitalklasse holt oder dergleichen.
 
ja mir gings mehr um die Frage, dass wenn ich ein JPanel auf mein JFrame packen will, kann ich dann ne Klasse erstellen, die "extends JComponent" bzw "extends JPanel" deklariert ist, davon in der main ein neues Objekt erstellen und das zu meinem Frame hinzufügen?
 
ja klar sieh mal mein code oben (nutze da zb auch methoden die JPanel zurückgeben), dann würde quasi stehen:

mainFrame.add(new HauptPanel(<parameter wenn nötig>));
 
habi55 hat gesagt.:
Weiterhin würde ich
Code:
 _frame.setDefaultCloseOperation(3);

Ändern. Es gibt in der Klasse JFrame statische Variablen, die die Integerwerte unter einem Namen kapseln, z.B.

Code:
JFrame.EXIT_ON_CLOSE

:meld: Ähäm. Du meinst sicher das WindowConstants interface. Ansonsten hast Du natürlich recht.

Grüße, Ebenius
 
Deine Digital-Klasse ist ziemlich sinnfrei. Entweder sie stellt ein JComponent bereit, das man dann irgendwo im JFrame einfügen kann, dann braucht Digital aber nicht JComponent zu überschreiben. Oder Digital ist wirklich eine JComponent, dann braucht sie den internen Panel nicht, sondern malt sich entweder selbst (durch Überschreiben von paintComponent oder Paint) bzw. leitet von einer bequemeren Swing-Klasse wie JLabel ab, und erweitert diese (z.B. durch automatisches Aktualisieren des Texts). Wenn du weißt, was du willst, helfe ich gern weiter...
 
Ebenius hat gesagt.:
habi55 hat gesagt.:
Weiterhin würde ich
Code:
 _frame.setDefaultCloseOperation(3);

Ändern. Es gibt in der Klasse JFrame statische Variablen, die die Integerwerte unter einem Namen kapseln, z.B.

Code:
JFrame.EXIT_ON_CLOSE

:meld: Ähäm. Du meinst sicher das WindowConstants interface. Ansonsten hast Du natürlich recht.

Grüße, Ebenius

Danke, dass wusste ich bisher nicht 😀 Weiß nur, dass ich die Variablen immer über JFrame setze, dass ja das Interface implementiert.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben