Swing JTabbedPane wird nicht angezeigt

KingOfExceptions

Bekanntes Mitglied
Hallo,

wieso wird mit der Methode
Code:
makeNewTab()
kein neuer Tab angezeigt?

Hier mal der 'relevante' Ausschnitt.

Java:
class GuiMaker
{
    private JFrame      frame = new JFrame();
    
    private JTabbedPane tp    = new JTabbedPane(JTabbedPane.TOP,JTabbedPane.SCROLL_TAB_LAYOUT);
    
    void setBasics()
    {
        frame.setTitle("Spielerverwaltung");
        frame.setLayout(new GridLayout(1, 1));
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        addMenu();
        frame.add(tp);
        frame.setSize(400, 400);
        frame.setVisible(true);
    }
    
    GuiMaker()
    {
        frame.validate();
        tp.validate();
    }
    
    public void makeNewTab(String playersName, String message, String hover)
    {
        tp.addTab(playersName, null, new JLabel(message), hover);
        
        frame.validate();
    }
}
 
Bei mir funktioniert das problemlos: ("addMenu();" auskommentiert)

Java:
public static void main(String[] args) {
    	GuiMaker maker = new GuiMaker();
    	maker.setBasics();
    	
    	for(int i = 0; i < 10; i++) {
    		maker.makeNewTab("Player", "Message", "Hover");	
    	}
}

Bug liegt wohl wo anderst.
btw. revalidatierst du, bevor du überhaupt Inhalt hinzufügst.
 
frame.add(tp); sollte schon irgendwo auftauchen ^^

tuts doch:

Java:
void setBasics()
    {
        frame.setTitle("Spielerverwaltung");
        frame.setLayout(new GridLayout(1, 1));
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        addMenu();
        frame.add(tp);
        frame.setSize(400, 400);
        frame.setVisible(true);
    }

[EDIT]ZU LANGSAM >.<[/EDIT]

Und so wird es aufgerufen:
Java:
try
{
     new GuiMaker().setBasics();
}
catch(Exception e)
{}

Java:
try
{
      new GuiMaker().makeNewTab(spielername, info, spielername);
}
catch (Exception e)
{
       e.printStackTrace();
}

BTW: alle variablen sind nicht
Code:
null
 
Zuletzt bearbeitet:
Jetzt erzeugst du aber 2x GuiMaker. 1x rufst du setBasics auf und 1x makeNewTab. Also hat einer die GUI aufgebaut und einer keine aufgebaute GUI, dafür einen Tab.
 
das ist natürlich schlecht.... kann ich die beiden methoden auch aufrufen, ohne ein neues objekt zu erstellen? nur mit
Code:
new
anstatt:

Java:
GuiMaker maker=new GuiMaker();
maker.setBasics();
maker.makeNewTab();
 
Ok dann mach ichs halt so...

aber wie kann ich auf eine Variable in Klasse A mit Klasse B zugreifen?

Java:
public class SpielerVerwaltung
{
    public GuiMaker maker=new GuiMaker();
    public SpielerVerwaltung()
    {
        maker.setBasics();
    }
 
    public static void main(String[] args)
    {
        new SpielerVerwaltung();
    }
    
    
}

Java:
class Spieler
{
    
    public void spielerSuchen() throws IOException
    {
        String spielername = JOptionPane.showInputDialog(null, "Name des Spielers, der gesucht werden soll:");
        
        getListOfPlayers();
        
        if (spielerNamen.contains(spielername))
        {
            getListOfInfos();
            
            String info= spielerInfos.elementAt(spielerNamen.indexOf(spielername));
            
            try
            {
                maker.makeNewTab(spielername, info, spielername);  //HIER IST DAS PROBLEM
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
    
    
}
 
SpielerVerwaltung enthält die Spielerinstanzen/Namen und getListOfPlayers(); soll sie bekommen? Du kannst ein Interface in SpielerVerwaltung erzeugen (z. B. anonym), eine Methode überschreiben die die Spielernamen zurückgibt und die Instanz an Spieler übergeben. Wenn du sie dann noch SpielerModel nennst wirkt das ganze professionell. 😉
 
Wie wäre es damit?

Java:
package javaforum.kingofexceptions;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.io.IOException;
import java.util.EventListener;
import java.util.EventObject;
import java.util.LinkedList;
import java.util.List;

import javaforum.kingofexceptions.GuiMaker.Spieler.SpielerEvent;
import javaforum.kingofexceptions.GuiMaker.Spieler.SpielerListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;

class GuiMaker {
	private JFrame frame;
	private JTabbedPane tp;
    
	GuiMaker() {
		setBasics();
	}
	void setBasics() {
		frame = new JFrame("Spielerverwaltung");
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

		tp = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
		frame.add(tp, BorderLayout.CENTER);
        
		relocate();
		frame.setVisible(true);
	}
    
	public void makeNewTab(String playersName, String message, String hover) {
		tp.addTab(playersName, null, new JLabel(message), hover);
	}
	public void relocate() {
		frame.pack();
		frame.setLocationRelativeTo(null);		
	}
    
	public static class SpielerVerwaltung {
		private GuiMaker maker;
		private List<Spieler> spielerList;
    	
		public SpielerVerwaltung() {
			maker = new GuiMaker();
			spielerList = new LinkedList<GuiMaker.Spieler>();
			
			for(int i = 0; i < 5; i++) {
				int playerId = i + 1;
				createPlayer("Player " + playerId, "Nachricht des Spielers " + playerId);
			}
			try {
				spielerList.get(0).spielerSuchen();
			} catch (IOException e) {
				e.printStackTrace();
			}
			maker.relocate();
		}
		private void createPlayer(String playerName, String playerMessage) {
			Spieler spieler = new Spieler();
			spieler.setName(playerName);
			spieler.addSpielerListener(new SpielerListener() {
				public void spielerGefunden(SpielerEvent e) {
					maker.makeNewTab(e.getSpielerName(), "Nachricht", e.getSpielerName());
				}
			});
			spielerList.add(spieler);
		}
	}
	public static class Spieler {
		private SpielerModel model;
		
		public Spieler() {
			this(new DefaultSpielerModel());
		}
		public Spieler(SpielerModel model) {
			this.model = model;
		}
		
		
		public void spielerSuchen() throws IOException
	    {
			String spielername = JOptionPane.showInputDialog(null, "Name des Spielers, der gesucht werden soll:");
			
			getListOfPlayers();
	        
			String mySpielerName = model.getSpielerName();
			if (mySpielerName.contains(spielername))
			{
				getListOfInfos();
	            
				//String info= spielerInfos.elementAt(spielerNamen.indexOf(spielername));
	            
				try {
					fireSpielerFoundEvent(spielername);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
	    }
		
		public void setName(String newName) {
			model.setSpielerName(newName);
		}
		public void addSpielerListener(SpielerListener listener) {
			model.addSpielerListener(listener);
		}
		

		protected void fireSpielerFoundEvent(String spielername) {
			SpielerListener[] listeners = model.getSpielerListeners();
			final SpielerEvent event = new SpielerEvent(this, spielername);
			for(final SpielerListener l:listeners) {
				EventQueue.invokeLater(new Runnable() {
					public void run() {
						l.spielerGefunden(event);
					}
				});
			}
		}
		
		private void getListOfInfos() {
			// TODO Auto-generated method stub
			
		}
		private void getListOfPlayers() {
			// TODO Auto-generated method stub

		}
		
		public static interface SpielerModel {
			void addSpielerListener(SpielerListener l);
			SpielerListener[] getSpielerListeners();
			void setSpielerName(String s);
			String getSpielerName();
		}
		public static class DefaultSpielerModel implements SpielerModel {
			private String spielerName;
			private List<SpielerListener> spielerListener;
			
			public DefaultSpielerModel() {
				spielerListener = new LinkedList<SpielerListener>();
			}
			public void addSpielerListener(SpielerListener l) {
				spielerListener.add(l);
			}
			public SpielerListener[] getSpielerListeners() {
				return(spielerListener.toArray(new SpielerListener[spielerListener.size()]));
			}
			public void setSpielerName(String s) {
				spielerName = s;				
			}
			public String getSpielerName() {
				return(spielerName);
			}
		}
		public static interface SpielerListener extends EventListener {
			void spielerGefunden(SpielerEvent e);
		}
		public static class SpielerEvent extends EventObject {
			private String spielerName;
			
			public SpielerEvent(Object source) {
				super(source);
			}
			public SpielerEvent(Object source, String spielerName) {
				super(source);
				this.spielerName = spielerName;
			}
			public String getSpielerName() {
				return spielerName;
			}
		}
	}
	public static void main(String[] args) {
		new SpielerVerwaltung();
	}
}
 
Uiuiui... das ist ja kompliziert ^^ da muss ich mich erst mal reinfinden :/

Das ist unglaublich nett, dass du mir das Programm geändert hast! Man findet nicht oft leute, die wirklich zeit in das problem eines anderen investieren!

Aber leider verstehe ich die hälfte des codes nicht ;(

ich hab eine andere Möglichkeit gefunden:

Java:
SpielerVerwaltung.maker.makeNewTab(spielername, info, spielername);

um auf die variable in spielerverwaltung zuzugreifen.. keine ahnung wieso
Code:
maker
static sein muss aber egal.. es funktioniert ! 😉

Vielen dank, dass du deine zeit für mich geopfert hast!
 
Zuletzt bearbeitet:
Maker muss statik sein, da du über die Klasse darauf zugreifst. Deshalb muss er unabhängig jeder Instanz sein.

Von deinem Vorgehen ist aber aus 4 Gründen (die mir gerade einfallen) abzuraten:

1) Spieler ist nicht wiederverwendbar.
2) Kleine Änderungen (wie z. B. die Änderung, dass die SpielerVerwaltung nichtmehr die Instanz von GuiMaker speichert, was ich auch für sinnvoller halten würde, da die SpielerVerwaltung nichts mit der GUI zu tun hat und eine Klasse auch immer nur 1 Basisaufgabe haben sollte) müssen im ganzen Programm angepasst werden.
3) Klassen sollten nur mit benachtbarten Klassen kommunizieren.
4) Persönlicher Grund, aber es ist doch echt häßlich, dass ein Objekt mit irgend einen anderen weit entfernten Objekt kommuniziert. Vor allem bei größeren Programmen ist das kaum noch durchsichtig, falls alles kreuz und quer durch das Programm direkt auf etwas anderes zugreift.

Ich glaube, dass du es schon verstehst. Ich denke das ist eher so wie wenn du eine neue Sprache lernst. (Landessprache, nicht Programmiersprache)
Du kannst es zwar übersetzen (zur Not mit einem Wörerbuch), aber da du es nicht so gewöhnt bist und noch kein "Auge" dafür hast denkst du, dass du es nicht verstehst. Zumindest kenne ich das von mir.

Ist aber im Endeffekt nichts anderes als das, was man immer macht. Instanzen erzeugen und Methoden davon aufrufen.
 
Maker muss statik sein, da du über die Klasse darauf zugreifst. Deshalb muss er unabhängig jeder Instanz sein.

ich hab mich sowieso noch nicht so mit OOP und static befasst... das scheint so kompliziert :rtfm:

1) Spieler ist nicht wiederverwendbar.

inwiefern wiederverwendbar? ???:L

2) Kleine Änderungen (wie z. B. die Änderung, dass die SpielerVerwaltung nichtmehr die Instanz von GuiMaker speichert, was ich auch für sinnvoller halten würde, da die SpielerVerwaltung nichts mit der GUI zu tun hat und eine Klasse auch immer nur 1 Basisaufgabe haben sollte) müssen im ganzen Programm angepasst werden.

SpielerVerwaltung soll eigentlich alle Fäden in der Hand haben, aber hast schon recht, GuiMaker hat die eher... 😳

3) Klassen sollten nur mit benachtbarten Klassen kommunizieren.

die sind doch benachbart oder ?:autsch:

4) Persönlicher Grund, aber es ist doch echt häßlich, dass ein Objekt mit irgend einen anderen weit entfernten Objekt kommuniziert. Vor allem bei größeren Programmen ist das kaum noch durchsichtig, falls alles kreuz und quer durch das Programm direkt auf etwas anderes zugreift.

bis jetzt fand ich es eig recht übersichtlich 😛ueh: :bae: aber wahrscheinlich nicht für einen anderen :/

Ich glaube, dass du es schon verstehst. Ich denke das ist eher so wie wenn du eine neue Sprache lernst. (Landessprache, nicht Programmiersprache)
Du kannst es zwar übersetzen (zur Not mit einem Wörerbuch), aber da du es nicht so gewöhnt bist und noch kein "Auge" dafür hast denkst du, dass du es nicht verstehst. Zumindest kenne ich das von mir.

Ist aber im Endeffekt nichts anderes als das, was man immer macht. Instanzen erzeugen und Methoden davon aufrufen.

ich kann 5 richtige Sprachen, mit denen hab ich keine Probleme, nur mit Programmiersprachen 😉
Ich finde es zb total unübersichtlich, wie du mit implements und so jonglierst... da finde ich meinen code viel klarer :bahnhof:
 
inwiefern wiederverwendbar? ???:L
Du kannst z. B. niemals die Suchergebnisse auf einem anderen Weg verwenden, da immer direkt in die GUI geschrieben wird.

SpielerVerwaltung soll eigentlich alle Fäden in der Hand haben, aber hast schon recht, GuiMaker hat die eher... 😳
Ich würde eine Main-Klasse machen, die die GUI und SpielerVerwaltung erzeugt und über Listener vernetzt. Ist aber auch eher Geschmackssache.


die sind doch benachbart oder ?:autsch:
GuiMaker und Spielerverwaltung bzw. Spielerverwaltung und Spieler sind benachbart. Spieler kann es egal sein, ob und was für eine GUI verwendet wird. Wichtig ist nur, dass irgendjemand informiert wird, dass sich da was getan hat.

bis jetzt fand ich es eig recht übersichtlich 😛ueh: :bae: aber wahrscheinlich nicht für einen anderen :/

Wenn du mit static (wenigstens besser als Singleton ^^) quer durch das Programm aufrufst kommt das dabei raus (aus einen anderen Thread). Ist zwar etwas übertrieben, aber das Programm wird am Ende wohl auch sehr viel Größer sein, wodurch sich das ausgleicht.

4515d1335125220-jframe-jbutton-jtextfield-dia1.jpg


Durch das Listener-Konzept das:

4516d1335125223-jframe-jbutton-jtextfield-dia2.jpg



ich kann 5 richtige Sprachen, mit denen hab ich keine Probleme, nur mit Programmiersprachen 😉
Ich finde es zb total unübersichtlich, wie du mit implements und so jonglierst... da finde ich meinen code viel klarer :bahnhof:
Wow, 5 Sprachen. 😱 Ich kann gerade mal Deutsch und soviel Englisch wie ich in der JavaDoc gelernt habe. ^^
Ich implementiere ja nur 2 Interface. EventListener soll laut Java-Spec in Listeners implementiert werden. Ob das einen tieferen Sinn hat weiß ich nicht, anhand des Namens weiß sowieso jeder, dass es sich um einen Listener handelt. Ansonst definiere ich noch die Methoden für ein Model und schreibe ein DefaultModel.
 
Ich würde eine Main-Klasse machen, die die GUI und SpielerVerwaltung erzeugt und über Listener vernetzt. Ist aber auch eher Geschmackssache.


GuiMaker und Spielerverwaltung bzw. Spielerverwaltung und Spieler sind benachbart. Spieler kann es egal sein, ob und was für eine GUI verwendet wird. Wichtig ist nur, dass irgendjemand informiert wird, dass sich da was getan hat.


so langsam verstehe ich es ^^

Wenn du mit static (wenigstens besser als Singleton ^^) quer durch das Programm aufrufst kommt das dabei raus (aus einen anderen Thread). Ist zwar etwas übertrieben, aber das Programm wird am Ende wohl auch sehr viel Größer sein, wodurch sich das ausgleicht.


was ist denn singleton?
 
Java:
public class Klasse {
	private static Klasse instance;

	static {
		instance = new Klasse();
	}
	private Klasse() {
		super();
	}
	public static Klasse getInstance() {
		return(instance);
	}
}

Soll verwendet werden, falls es nur 1 Instanz der Klasse geben darf. Nur so ein Fall ist mir noch nie begegnet.
 

Neue Themen


Zurück
Oben