Swing Panel Extra Klasse & Aufruf über Button

Xpisto

Aktives Mitglied
Hi, ich hab ein kleines Problem. Ich mach mich gerade an Swing und Multitouch zugange und mir fehlt bisschen die Logik glaube ich, da ich das nicht so richtig gebacken bekomme.

Folgendes:

Ich habe eine Klasse PanelMaster in der ich ein Panel erstelle mit dem Borderlayout:

Java:
public class PanelMaster extends JPanel{
	
	private static final long serialVersionUID = 1L;

	private MTButton btnVor;
	private MTButton btnZurueck;
	private MTButton btnBeenden;

	public PanelMaster()
	{
	setLayout(new BorderLayout());
	
	btnVor = new MTButton(">");

    btnVor.setVisible(true);

	add(btnVor, BorderLayout.EAST);
	
    btnZurueck = new MTButton("<");
    btnZurueck.setArc(20);
    btnZurueck.setVisible(true);

	add(btnZurueck, BorderLayout.WEST);
	
	ImageIcon I = new ImageIcon ("X"); 
    btnBeenden = new MTButton(I);
    btnBeenden.setArc(20);
    btnBeenden.setVisible(true);
	
	add(btnBeenden);
	
	
}
}


Stört euch nich an den Buttons die sind noch ohne Funktion und ohne Sinn, hab einfach alles mal durchgetestet. Aber sie sollten angeziegt werden!

Nun hab ich eine Klasse MainFrame:

Java:
public class MainFrame extends MTFrame {
	
	private static final long serialVersionUID = 1L;
	
	private MTButton btnNext_date;
	private MTButton btnBack_date;
	private MTButton btnNext_event;
	private MTButton btnBack_event;
	private MTButton btnPic;
	private MTButton btnVideo;
	private MTButton btnText;
	private MTButton btnExitFrame;
	private JPanel panelMaster;
	
	public MainFrame()
	{
		
	/*
	* ----------------------------------------------------------------
	* Frame inkl. BackgroundLabel
	* ----------------------------------------------------------------
	*/	   
		
	setSize(1024,768);
	setDefaultCloseOperation(MTFrame.EXIT_ON_CLOSE);	 
    setContentPane(new BackgroundLabel("Zeitreise.jpg"));
    setVisible(true);
    setLayout(null);
     
    /*
	 * ----------------------------------------------------------------
	 * Datum, Exit, Vor und Zurück MTButtons
	 * ----------------------------------------------------------------
	 */
    
    JLabel lblEreignistag = new JLabel("Datum");
	lblEreignistag.setBounds(700, 100, 100, 35);
	lblEreignistag.setFont(lblEreignistag.getFont().deriveFont(15f));
	this.getContentPane().add(lblEreignistag);
	
    ImageIcon ImgExit = new ImageIcon ("Exit.png");  
    btnExitFrame = new MTButton(ImgExit);
    btnExitFrame.setUI(new BasicButtonUI());			//setzt Button Transparent
    btnExitFrame.setBounds(5, 5, 55, 55);
    btnExitFrame.setArc(20);
    
    btnExitFrame.addActionListener(new ActionListener()
    {
    	public void actionPerformed(ActionEvent e) 
    	{
    		System.exit(0);
    	}
    });
    
    this.getContentPane().add(btnExitFrame);
	
    ImageIcon ImgNext_date = new ImageIcon ("Next.png");  
    btnNext_date = new MTButton(ImgNext_date);
    btnNext_date.setUI(new BasicButtonUI());			//setzt Button Transparent
    btnNext_date.setBounds(900, 100, 60, 50);
    btnNext_date.setArc(20);

	this.getContentPane().add(btnNext_date);
	
	ImageIcon ImgBack_date = new ImageIcon ("Back.png");
	btnBack_date = new MTButton(ImgBack_date);
	btnBack_date .setUI(new BasicButtonUI());		//setzt Button Transparent;
	btnBack_date.setBounds(500, 100, 60, 50);
	btnBack_date.setArc(20);
	
	this.getContentPane().add(btnBack_date);
	
	/*
	 * ----------------------------------------------------------------
	 * Ereignis, Vor und Zurück MTButtons
	 * ----------------------------------------------------------------
	 */
	
	JLabel lblEvent = new JLabel("Ereignis");
	lblEvent.setBounds(775, 180, 100, 35);
	lblEvent.setFont(lblEvent.getFont().deriveFont(15f));
	this.getContentPane().add(lblEvent);
	
	ImageIcon ImgNext_event = new ImageIcon ("Next_klein.png");
	btnNext_event = new MTButton(ImgNext_event);
	btnNext_event.setUI(new BasicButtonUI());			//setzt Button Transparent;
	btnNext_event.setBounds(910, 180, 40, 30);
	
	this.getContentPane().add(btnNext_event);
	
	ImageIcon ImgBack_event = new ImageIcon ("Back_klein.png");
	btnBack_event = new MTButton(ImgBack_event);
	btnBack_event.setUI(new BasicButtonUI());		//setzt Button Transparent;
	btnBack_event.setBounds(650, 180, 40, 30);
	
	this.getContentPane().add(btnBack_event);
	
	/*
	 * ----------------------------------------------------------------
	 * Medienbuttons
	 * ----------------------------------------------------------------
	 */
	
	btnPic = new MTButton("Bilder");
	btnPic.setUI(new BasicButtonUI());
	btnPic.setBounds(72, 288, 88, 88);
	btnPic.setArc(80);
	btnPic.setVisible(true);
	
	this.getContentPane().add(btnPic);
	
	
	btnVideo = new MTButton("Videos");
	btnVideo.setBounds(275, 235, 60, 60);
	btnVideo.setArc(80);
	btnVideo.setVisible(true);

	this.getContentPane().add(btnVideo);
	
	
	btnText = new MTButton("Texte");
	btnText.setBounds(545, 325, 160, 160);
	btnText.setArc(250);
	btnText.setVisible(true);
	
	btnText.addActionListener(new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) 
		{
			
		
		}
	});
	
	this.getContentPane().add(btnText);
	
	
	PanelMaster pm = new PanelMaster();
	pm.setBounds(100, 100, 500, 500);
	pm.setVisible(true);
	
	this.getContentPane().add(pm);
	
	}


	}


Hier der letzte Abschnitt. Ich erzeuge zwar ein panel aber das hat gar keinen Bezug zu meiner Panel Klasse, vllt könnt ihr mir da ein Tipp geben, wie gesgat ich hab nciht sooo das riesen Verständnis, ich probiere und mache.

Als zweites "Problem" wäre dann, dass ich dieses Panel nur anzeigen lassen möchte, wenn ich einen MTButton betätige, d.h. durch das anklicken des MTButton Text soll das Panel dann angezeigtw erden.

VIELEN DANK SCHONMAL!!!
 
Hey Xpisto, ich verstehe deine Problem nicht ganz:

Ich erzeuge zwar ein panel aber das hat gar keinen Bezug zu meiner Panel Klasse, vllt könnt ihr mir da ein Tipp geben

Zum Problem, dass das Panel erst nach einem Buttonklick angezeigt wird:

Bau einfach einen ActionListener ein, der beim Klick auf den Button ein neues JPanel hinzufügt:

Java:
deinFrame.add(deinPanel, deinLayout);


mfg schmidi000
 
Zuletzt bearbeitet von einem Moderator:
Hey danke für die schnelle antwort, nach deinem vorgehen würde ich ja nur ein neues panel erstellen, aber ich möchte das panel anzeigen lassen, welches ich in der klasse panelMaster gecoded habe, da von dieser klasse noch weitere panels erben werden.
 
dann mach das Panel unsichtbar mit
Code:
setVisible(false)
und dann beim ActionListener vom Button in der actionPerformed()-Methode einfach
Code:
setVisible(true)
 
wie nicht? was ist das Problem?
in MainFrame gibt es doch anscheinend ein Instanzattribut panelMaster, also kannst du damit auch irgendwas machen,
genauso wie du alles mögliche sonst machst


Java:
    PanelMaster pm = new PanelMaster();
    pm.setBounds(100, 100, 500, 500);
    pm.setVisible(true);
    
    this.getContentPane().add(pm);
hier wird allerdings nicht das Instanzattribut panelMaster verwendet, es bleibt null, zu ändern?
 
ok allerdings übernimmt das panel nicht das layout welches ich in der klasse PanelMaster geschrieben habe, es ist ein leeres Panel...
 
du musst nicht setVisible(true) für jeden Button einzeln aufrufen, welches du eh nicht konsequent machst,
und wichtig: du solltest setVisible(true) fürs JFrame erst als letzten Befehl im MainFrame-Konstruktor setzen,

danach noch Layout zu wechseln/ Komponenten einzufügen ist nicht anzuraten, erfordert validate(), repaint() usw., lieber vermeiden,
geht es mit Änderung?
 
So sieht die MainFrame klasse aus:

Java:
btnText.addActionListener(new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) 
		{
			
					//panel.setVisible(true);
		
		
		}
	});
	
	this.getContentPane().add(btnText);
	
	
	PanelMaster panel = new PanelMaster();
	panel.setBounds(100, 100, 500, 500);
	panel.setVisible(true);
	
	this.getContentPane().add(panel);
	
	
	this.setVisible(true);

Die Panel Klasse so:

Java:
package timeliners.mt.ui;


public class PanelMaster extends JPanel{
	
	private static final long serialVersionUID = 1L;

	private MTButton btnVor;
	private MTButton btnZurueck;
	private MTButton btnBeenden;

	public PanelMaster()
	{
		
	setLayout(new BorderLayout());
	
	btnVor = new MTButton(">");

	add(btnVor, BorderLayout.EAST);
	
    btnZurueck = new MTButton("<");
    btnZurueck.setArc(20);
    

	add(btnZurueck, BorderLayout.WEST);
	
/*	//ImageIcon I = new ImageIcon ("X"); 
    btnBeenden = new MTButton("X");
    btnBeenden.setArc(20);
    
	add(btnBeenden,BorderLayout.);
*/
	setVisible(true);
	
}
}

Panel wird angezeigt, aber es wird nicht das Layout angezeigt was in panelMaster steht ....
 
Zuletzt bearbeitet:
du hast immer noch ziemlich viele setVisible(true) auf Teilkomponenten..,
deine MTButton kenne ich nicht, vielleicht sind die einfach unsichtbar,
andere Probleme mit Layout/ Überdeckung der Bereiche sind auch denkbar,
es bräüchte ein vollständiges Testprogramm für genaue Tests,

hier eins von mir recht nahe an deinem, geht wunderbar

Java:
public class TestGUI   extends JFrame {

    public TestGUI()  {
        setLayout(null);
        PanelMaster panel = new PanelMaster();
        panel.setBounds(100, 100, 200, 200);
        add(panel);
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        setVisible(true);
    }

    public static void main(String[] args)  {
        new TestGUI();
    }

}


class PanelMaster  extends JPanel {

    private JButton btnVor;
    private JButton btnZurueck;
    private JButton btnBeenden;

    public PanelMaster()  {
        setLayout(new BorderLayout());

        btnVor = new JButton(">");
        add(btnVor, BorderLayout.EAST);

        btnZurueck = new JButton("<");
//        btnZurueck.setArc(20);
        add(btnZurueck, BorderLayout.WEST);
    }
}

-------

> setContentPane(new BackgroundLabel("Zeitreise.jpg"));
klingt ja reichlich übel, ist überhaupt irgendwas auf dem ContentPane präsent, andere Buttons des MainFrame?
wie erkennst du das PanelMaster?
 
Zuletzt bearbeitet von einem Moderator:
Ja also das Frame steht und passt auch so, aber das Panel gar nicht, wenn es angezeigt wird dann wie gesgat ohne layout komisch das es bei dir geht ist ja eigentlich 1:1 die MTButtons sind sichtbar, da ich diese auch schon beim Frame nutze.

Ich hab keine ahnung wieso es nicht klappt....

Was meinst du mit "wie erkennst du das PanelMaster"?
 
wie sieht man etwas was nichts sichtbares enthält? hebt es sich von Hintergrundbild ab?

und wie gesagt wäre Testprogramm nötig, über jede Fehlermöglichkeit, die sich noch in der letzten einzelnen Codezeile einer Unterklasse befinden kann, zu sprechen lohnt sich nicht,

evtl. reicht etwas mehr Code, je mehr %, desto eher die Chance dass etwas auffällt,
wobei ich nicht sage, dass es vielleicht nicht schon im geposteten Code steckt, muss halt nur irgendwer erkennen,
mit ausführen ist es meist sicher zu finden, als Text im Forum zwiespältige Aufgabe
 
Ok hier komplett:

Main:
Java:
package timeliners;

import timeliners.mt.ui.MainFrame;


public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		new MainFrame().setVisible(true);
		
		
	}

}

MainFrame
Java:
package timeliners.mt.ui;

public class MainFrame extends MTFrame {
	
	private static final long serialVersionUID = 1L;
	
	private MTButton btnNext_date;
	private MTButton btnBack_date;
	private MTButton btnNext_event;
	private MTButton btnBack_event;
	private MTButton btnPic;
	private MTButton btnVideo;
	private MTButton btnText;
	private MTButton btnExitFrame;
	
	//private PanelMaster panel;

	
	public MainFrame()
	{
		
	/*
	* ----------------------------------------------------------------
	* Frame inkl. BackgroundLabel
	* ----------------------------------------------------------------
	*/	   
		
	setSize(1024,768);
	setDefaultCloseOperation(MTFrame.EXIT_ON_CLOSE);	 
    setContentPane(new BackgroundLabel("Zeitreise.jpg"));
    setLayout(null);
     
    /*
	 * ----------------------------------------------------------------
	 * Datum, Exit, Vor und Zurück MTButtons
	 * ----------------------------------------------------------------
	 */
    
    JLabel lblEreignistag = new JLabel("Datum");
	lblEreignistag.setBounds(700, 100, 100, 35);
	lblEreignistag.setFont(lblEreignistag.getFont().deriveFont(15f));
	this.getContentPane().add(lblEreignistag);
	
    ImageIcon ImgExit = new ImageIcon ("Exit.png");  
    btnExitFrame = new MTButton(ImgExit);
    btnExitFrame.setUI(new BasicButtonUI());			//setzt Button Transparent
    btnExitFrame.setBounds(5, 5, 55, 55);
    btnExitFrame.setArc(20);
    
    btnExitFrame.addActionListener(new ActionListener()
    {
    	public void actionPerformed(ActionEvent e) 
    	{
    		System.exit(0);
    	}
    });
    
    this.getContentPane().add(btnExitFrame);
	
    ImageIcon ImgNext_date = new ImageIcon ("Next.png");  
    btnNext_date = new MTButton(ImgNext_date);
    btnNext_date.setUI(new BasicButtonUI());			//setzt Button Transparent
    btnNext_date.setBounds(900, 100, 60, 50);
    btnNext_date.setArc(20);

	this.getContentPane().add(btnNext_date);
	
	ImageIcon ImgBack_date = new ImageIcon ("Back.png");
	btnBack_date = new MTButton(ImgBack_date);
	btnBack_date .setUI(new BasicButtonUI());		//setzt Button Transparent;
	btnBack_date.setBounds(500, 100, 60, 50);
	btnBack_date.setArc(20);
	
	this.getContentPane().add(btnBack_date);
	
	/*
	 * ----------------------------------------------------------------
	 * Ereignis, Vor und Zurück MTButtons
	 * ----------------------------------------------------------------
	 */
	
	JLabel lblEvent = new JLabel("Ereignis");
	lblEvent.setBounds(775, 180, 100, 35);
	lblEvent.setFont(lblEvent.getFont().deriveFont(15f));
	this.getContentPane().add(lblEvent);
	
	ImageIcon ImgNext_event = new ImageIcon ("Next_klein.png");
	btnNext_event = new MTButton(ImgNext_event);
	btnNext_event.setUI(new BasicButtonUI());			//setzt Button Transparent;
	btnNext_event.setBounds(910, 180, 40, 30);
	
	this.getContentPane().add(btnNext_event);
	
	ImageIcon ImgBack_event = new ImageIcon ("Back_klein.png");
	btnBack_event = new MTButton(ImgBack_event);
	btnBack_event.setUI(new BasicButtonUI());		//setzt Button Transparent;
	btnBack_event.setBounds(650, 180, 40, 30);
	
	this.getContentPane().add(btnBack_event);
	
	/*
	 * ----------------------------------------------------------------
	 * Medienbuttons
	 * ----------------------------------------------------------------
	 */
	
	btnPic = new MTButton("Bilder");
	btnPic.setUI(new BasicButtonUI());
	btnPic.setBounds(72, 288, 88, 88);
	btnPic.setArc(80);
	
	
	this.getContentPane().add(btnPic);
	
	
	btnVideo = new MTButton("Videos");
	btnVideo.setBounds(275, 235, 60, 60);
	btnVideo.setArc(80);
	

	this.getContentPane().add(btnVideo);
	
	
	btnText = new MTButton("Texte");
	btnText.setBounds(545, 325, 160, 160);
	btnText.setArc(250);
	
	
	btnText.addActionListener(new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) 
		{
			
					//panel.setVisible(true);
		
		
		}
	});
	
	this.getContentPane().add(btnText);
	
	
	PanelMaster panel = new PanelMaster();
	panel.setBounds(100, 100, 500, 500);
	add(panel);
	panel.setVisible(true);
	
	
	
	
	this.setVisible(true);
	
	}


	}



PanelMaster
Java:
package timeliners.mt.ui;


public class PanelMaster extends JPanel{
	
	private static final long serialVersionUID = 1L;

	private MTButton btnVor;
	private MTButton btnZurueck;
	private MTButton btnBeenden;

	public PanelMaster()
	{
		
	setLayout(new BorderLayout());
	
	btnVor = new MTButton(">");
	
	add(btnVor, BorderLayout.EAST);
	
    btnZurueck = new MTButton("<");
    btnZurueck.setArc(20);
    

	add(btnZurueck, BorderLayout.WEST);
	
/*	//ImageIcon I = new ImageIcon ("X"); 
    btnBeenden = new MTButton("X");
    btnBeenden.setArc(20);
    
	add(btnBeenden,BorderLayout.);
*/
	setVisible(true);
	
}
}

Kann man so komplett ausführen, allerdings fehlen die icons, aber das ist irrelevant.
 
Zuletzt bearbeitet:
ohne MTButton geht gar nichts,
und du kannst ruhig vorher auch kürzen, ein Button in PanelMaster reicht sicherlich, wobei das nicht so lang ist,
aber die ganzen Buttons + Label können aus MainFrame temporär weg, ohne sie liegt das Problem doch sicher noch genauso vor,
mit nicht vorhandenen Bildern von der Festplatte haben andere eh Probleme

auch das BackgroundLabel kann mal testweise weg, vielleicht geht es dann schon?

MTButton wie in meinem Programm durch JButton ersetzen könntest du auch übernehmen, dann wäre diese Klasse egal,
falls nicht genau dadurch der Fehler verschwindet,

du siehst, man kann ständig und überall am Problem bzw. zumindest an der Suche arbeiten,
nicht nur ständig Fragen stellen

edit:
btnPic.setBounds(72, 288, 88, 88);

panel.setBounds(100, 100, 500, 500);

überlagern sich nicht diese Bereiche? habe ich als denkbares Problem schon früher angesprochen
 
nur zur Info: von mir folgt auf dieses Posting offensichtlich nichts neues zum Thema,
planst/ schreibst du gerade noch ein weiteres Posting, wartest du auf irgendwas, ist das Thema beendet?

besser nie so fragen-offene Postings stehen lassen

----

ach, doch noch was:
> Also den MTButton muss ich aufjedenfall nutzen, wegen Multitouch.
Multitouch ist doch erstmal völlig egal wenn um die Suche nach dem Anzeigefehler geht!,
ist mit JButton auch noch nichts zu sehen muss weiter gesucht werden, aber MTButton belastet nicht
ist mit JButton der Fehler weg, dann hat man eine wichtige Information gewonnen
 
Zuletzt bearbeitet von einem Moderator:
edit:
btnPic.setBounds(72, 288, 88, 88);

panel.setBounds(100, 100, 500, 500);

überlagern sich nicht diese Bereiche? habe ich als denkbares Problem schon früher angesprochen

Ja das überlagert sich, gibt es denn keine möglichkeit das Panel in den vordergrund zu stellen?
 

Zurück
Oben