JDialog Frage

Status
Nicht offen für weitere Antworten.

Sanix

Top Contributor
Ich erstelle gerade ein 4 Gewinnt, das man übers Netz spielen kann.
Nun habe ich folgendes Problem:
Man kann im Menu auf Neues Netzwerkspiel gehen, dann wird ein JDialog geöffnet. Dort kann man IP Adresse angeben und den gewünschten Port wählen. Danach auf ok klicken und die Verbindung wird hergestellt.
Die Verbindung wird jedoch in der Klasse FourWins gebraucht, welche das Spielfeld erstellt, Methoden für die Züge hat.
Wie kriege ich die Verbindung am Besten in diese Klasse rein? Derzeit habe ich es mit einer statische Variable gemacht, weiss jedoch nicht ob das gut ist oder obs auch anders geht.
Wenn man beim JDialog auf ok klickt, fängt ja der Actionlistener die Aktionen ab. Wie kann ich am besten auf die Textfelder zugreifen, wenn ich gerade im ActionLIstener bin? Muss ich alle an den Listener übergeben oder gibts hier eine schönere Variante?
Ich will eigentlich nicht die ganze Zeit Objekte hin und herschieben, damit sie Schlussendlich am richtigen Ort bekannt sind.


Derzeit siehts so aus:
Neues Menu wird erstellt in dem MainWindow. Dort kann man den Unterpunkt Netzwerkspiel anwählen. Jetzt kommt der erste Listener. Der ruft dann den JDialog auf. Dort kann man eingaben machen. Diese müssen dann abgefragt werden, mit denne eine Verbindungsthread erstellt werden, welcher dann aber in der FourWins Klasse bekannt sein müsste, welche auf dem Frame erstellt wird.

Ist wahrscheinlich bisschen wirr geschrieben aber ich weiss nicht, wie ichs anders erklären soll. Ich kann sonst auch den Code posten.
 
B

bygones

Gast
die Textfelder müssen Instanzvariablen des Dialogs sein, dann kannst du in der action Methode darauf zugreifen !

Intuitiv kräultst mir die Verbindung in die FourWins Klasse zu legen. Ohne Code bzw. genaues Design ist es natürlich schwer viel dazu zusagen, aber eben intuitiv würde ich eine Controller Klasse haben, die den Ablauf regelt. D.h. der Dialog wird geöffnet, die Infos ausgelesen, die Klasse übergibt dann die Infos an die FourWins Klasse.
 

Sanix

Top Contributor
So hier mal den Code. Wie würde das mit dem Controller dann aussehen? Also der erstellt einfach alle Klassen, die Actionlistener melden sich zuerst bei ihm, dann führt er weitere Aktionen aus?
Wie geht das mit den Istanzvariablen?

FourWins.java
Code:
public class FourWins 
{
	private JButton[] jbFields;
	private int yFields;
	private int xFields;
	private static MyConnection mc;
	
	/**
	 * 
	 * @param xFields amount of fields on horizontal axis
	 * @param yFields amount of fields on vertical axis
	 * @param jp the buttons are placed on the given jpannel
	 */
	public FourWins(int _yFields, int _xFields, JPanel jp)
	{
		//Need vars for later use
		yFields = _yFields;
		xFields = _xFields;
		//Create buttons, set new actioncommand, add listener, add to the jpanel
		jbFields = new JButton[xFields * yFields];
		PlayFieldListener mblFields = new PlayFieldListener(this);
		for(int i = 0; i < xFields * yFields; i++)
		{
			jbFields[i] = new JButton("");
			jbFields[i].setActionCommand(new Integer(i).toString());
			jbFields[i].addActionListener(mblFields);
			jp.add(jbFields[i]);
		}
	}
	/**
	 * 
	 * @param fieldIndex field identifier
	 * @param strId player id
	 * @return true, if there are 4 in a row
	 * @throws IndexOutOfBoundsException if the field doens't exist
	 */
	public boolean takeField(int fieldIndex, String strId) throws IndexOutOfBoundsException
	{
		//Its only possible to set a coin over an other
		while((int)((fieldIndex + xFields) / yFields) <= yFields 
				&& jbFields[fieldIndex + xFields].getText().equals(""))
		{
			fieldIndex = fieldIndex + xFields;
		}
		
		//Check if field is not already used, if not, set player identifier
		if(jbFields[fieldIndex].getText().equals(""))
		{
			jbFields[fieldIndex].setText(strId);
		}
		
		//Check if there are 4 in a row
		int fieldIARow = 0;
		//Horizontal
		for(int i = fieldIndex - 3; i <= fieldIndex + 3; i++)
		{
			if(i >= 0 && i < yFields * xFields && 
					(int) (fieldIndex / xFields) == (int) (i / xFields))	//Filter impossible indexes
			{
				if(jbFields[i].getText().equals(strId))
				{
					fieldIARow++;
				}
				else
				{
					fieldIARow = 0;
				}
				if(fieldIARow == 4){return true;}
			}
		}
		//Vertical
		fieldIARow = 0; //Reset field
		for(int i = fieldIndex - 3*xFields; i <= fieldIndex + 3*xFields; i+=xFields)
		{
			if(i >= 0 && i < yFields * xFields)	//Filter impossible indexes
			{
				if(jbFields[i].getText().equals(strId))
				{
					fieldIARow++;
				}
				else
				{
					fieldIARow = 0;
				}
				if(fieldIARow == 4){return true;}
			}
		}
		//Diagonal down left to top right
		fieldIARow = 0; //Reset field
		for(int i = fieldIndex - (fieldIndex % xFields) * (xFields+1); 
			i <= fieldIndex + ((xFields-1) - (fieldIndex % xFields)) * (xFields+1); 
			i+=xFields+1)
		{
			if(i >= 0 && i < yFields * xFields)	//Filter impossible indexes
			{
				if(jbFields[i].getText().equals(strId))
				{
					fieldIARow++;
				}
				else
				{
					fieldIARow = 0;
				}
				if(fieldIARow == 4){return true;}
			}
		}
		//Diagonal down right to top left
		fieldIARow = 0; //Reset field
		for(int i = fieldIndex - ((xFields-1) - fieldIndex % xFields) *(xFields - 1);
		i <= fieldIndex + (fieldIndex % xFields) * (xFields - 1);
		i+=xFields-1)
		{
			if(i >= 0 && i < yFields * xFields)	//Filter impossible indexes
			{
				if(jbFields[i].getText().equals(strId))
				{
					fieldIARow++;
				}
				else
				{
					fieldIARow = 0;
				}
				if(fieldIARow == 4){return true;}
			}
		}		
		
		//Nobody won
		return false;
	}
	public static void setConnection(MyConnection _mc)
	{
		
	}
}

Window.java
Code:
public class Window extends JFrame
{
	private static final long serialVersionUID = 1L;
	
	public static void main(String[] args) 
	{
		new Window();
	}
	public Window()
	{
		setSize(400, 400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setTitle("Four wins");
		
		//Add menu
		JMenuBar jmbMain = new JMenuBar();
		JMenu jmGame = new JMenu("Game");
		jmbMain.add(jmGame);
		JMenuItem jmiNewGame = new JMenuItem("New game...");
		jmiNewGame.addActionListener(new MyMenuListener());
		jmGame.add(jmiNewGame);
		setJMenuBar(jmbMain);
		
		//Start new game
		//newGame(7, 8);
		
		//Make visible
		setVisible(true);
	}
	/**
	 * 
	 * @param yFields amount of fields on vertical axis
	 * @param xFields amount of fields on horizontal axis
	 */
	public void newGame(int yFields, int xFields)
	{
		JPanel jpField = new JPanel(new GridLayout(yFields, xFields));
		new FourWins(yFields, xFields, jpField);
		add(jpField);
	}
}

MyMenuListener
Code:
public class MyMenuListener implements ActionListener
{

	public void actionPerformed(ActionEvent e) 
	{
		if(e.getActionCommand().equals("New game..."))
		{
			new JFConnect();
		}
	}
}

JDialog zum Verbinden
Code:
public class JFConnect extends JDialog
{
	private static final long serialVersionUID = -3240453236508016763L;

	/**
	 * Creating the connection window with
	 * Server / Client function
	 * IP / Port field
	 *
	 */
	public JFConnect()
	{	
		super();
		//Window settings
		setModal(true);
		setTitle("JFConnect to...");
		setSize(360, 120);
		
		//JPanel
		JPanel jpMain = new JPanel(new GridBagLayout()); add(jpMain);
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.HORIZONTAL;
		
		//Actionlistener
		ACConnect acc = new ACConnect(this);
		
		//Fields
		JTextField jtfIP = new JTextField("IP");
		gbc.gridy = 0;
		gbc.gridx = 0;
		jpMain.add(jtfIP, gbc);
		JTextField jtfPort = new JTextField("Port"); jpMain.add(jtfPort);
		gbc.gridy = 0;
		gbc.gridx = 1;
		jpMain.add(jtfPort, gbc);
		JButton jbSClient = new JButton("JFConnect as client"); jpMain.add(jbSClient);
		gbc.gridy = 1;
		gbc.gridx = 0;
		jpMain.add(jbSClient, gbc);
		JButton jbSServer = new JButton("Start server...");
		jbSServer.addActionListener(acc);
		gbc.gridy = 1;
		gbc.gridx = 1;
		jpMain.add(jbSServer, gbc);
		
		//Make visible
		pack();
		setVisible(true);
	}
}

ACConnect.java - ActionListener für den JDialog
Code:
public class ACConnect implements ActionListener 
{
	public JDialog jd;
	
	public ACConnect(JDialog _jd)
	{
		jd = _jd;
	}
	public void actionPerformed(ActionEvent e) 
	{
		if(e.getActionCommand().toString().equals("Start server..."))
		{
			 //JTextField jtf = (JTextField) jd.getContentPane().getComponent();	//Get port textfield
			 //FourWins.setConnection(new MyConnection(new Integer(jtf.getText()).intValue()));
			 //jd.dispose();
			 //System.out.println("done");
		}
	}
}

Natürlich ist das ganze noch unfertig, da ich erst das mit der Verbindung schön "geregelt" haben wollte.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Jdialog nur 1x anzeigen Java Basics - Anfänger-Themen 2
D JButton in JDialog mit Action belgen Java Basics - Anfänger-Themen 6
J JDialog Zugriff auf parent JDialog Java Basics - Anfänger-Themen 5
J JDialog: wie kann ich ihn direkt als invisible erstellen Java Basics - Anfänger-Themen 7
A JDialog öffnet sich nicht Java Basics - Anfänger-Themen 7
D JDialog schließen Java Basics - Anfänger-Themen 11
I Veränderungen am JPanel vom JDialog aus Java Basics - Anfänger-Themen 6
H JDialog Problem Java Basics - Anfänger-Themen 10
H Problem JDialog.setVisible Java Basics - Anfänger-Themen 3
T Modales JDialog schliessen mit JButton Java Basics - Anfänger-Themen 2
I JDialog Problem Java Basics - Anfänger-Themen 37
J Icon JDialog mit Java 1.4 Java Basics - Anfänger-Themen 2
M JDialog Modality Java Basics - Anfänger-Themen 7
S JDialog resize zur Laufzeit PROBLEM!!! Java Basics - Anfänger-Themen 5
S JDialog und SwingUtilities Java Basics - Anfänger-Themen 6
H Modalen JDialog schließen, ohne dabei das Parent-Frame zu schließen Java Basics - Anfänger-Themen 7
M JDialog soll was an die AufruferKlasse zurück geben Java Basics - Anfänger-Themen 3
S Layout JDialog Java Basics - Anfänger-Themen 9
S eigene Methoden in JDialog Java Basics - Anfänger-Themen 13
pun Im JDialog auf Objekt im Parent JFrame zugreifen Java Basics - Anfänger-Themen 2
C Frame, JFrame, JDialog Java Basics - Anfänger-Themen 12
S Datenzugriff auf JDialog! Java Basics - Anfänger-Themen 8
A JDialog, Owner JFrame ZIEL: nciht in der taskbar Java Basics - Anfänger-Themen 9
E Übergabe von werten aus einem JDialog Java Basics - Anfänger-Themen 4
B Grafiken/Bilder mit Netbeans in Jdialog Java Basics - Anfänger-Themen 7
O Beim Schließen JDialog, im Frame-Owner eine Methode starten Java Basics - Anfänger-Themen 6
G JDialog + p aintComponent-Override Java Basics - Anfänger-Themen 3
A Klasse erbot von JDialog. Kontruktor? Java Basics - Anfänger-Themen 4
M Hauptfenster nicht wählbar bei offenem JDialog Java Basics - Anfänger-Themen 2
G Bei JDialog warten Java Basics - Anfänger-Themen 5
B Fenstergröße variiert bei JDialog.pack()-Aufruf Java Basics - Anfänger-Themen 10
S JDialog während automatischer Dateisuche einblenden Java Basics - Anfänger-Themen 6
J JDialog zeigt nichts an Java Basics - Anfänger-Themen 4
C JDialog Werte nach Frame übergeben Java Basics - Anfänger-Themen 10
G JDialog + setOpaque Java Basics - Anfänger-Themen 5
G JDialog auf Jpanel statt Frame? Java Basics - Anfänger-Themen 4
N Werte von JDialog entgegennehmen Java Basics - Anfänger-Themen 7
G JDialog-Status im Frame abfragen Java Basics - Anfänger-Themen 2
Bernasconi dynamisches JDialog Java Basics - Anfänger-Themen 2
T Register im JDialog Java Basics - Anfänger-Themen 9
G JDialog übers X schliessen und Programm beenden Java Basics - Anfänger-Themen 4
C Fehlermeldungen umleiten auf JDialog Java Basics - Anfänger-Themen 2
S new .() extends JDialog {.} Java Basics - Anfänger-Themen 15
M Button in einem JDialog mit Enter ausführen Java Basics - Anfänger-Themen 2
C FocusLost reagiert nicht bei JDialog Java Basics - Anfänger-Themen 5
E Von einem JDialog einen neuen JDialog aufrufen Java Basics - Anfänger-Themen 10
R JDialog schließen ( nicht mit dispose()! ) Java Basics - Anfänger-Themen 14
G JDialog Java Basics - Anfänger-Themen 15
M JDialog Java Basics - Anfänger-Themen 3
M JDialog basierend auf JDialog aufrufen Java Basics - Anfänger-Themen 4
B KeyListener beim JDialog Java Basics - Anfänger-Themen 4
E JDialog schließen Java Basics - Anfänger-Themen 9
G Wiedermal vererbung, extends JDialog extends Exception ? Java Basics - Anfänger-Themen 8
P JDialog funktioniert nicht? Java Basics - Anfänger-Themen 9
P JDialog & JProgressBar Java Basics - Anfänger-Themen 2
F JDialog per Button-Klick schliessen Java Basics - Anfänger-Themen 2
S JDialog einrichten Java Basics - Anfänger-Themen 4
G Owner von JDialog;Komme einfach nicht weiter Java Basics - Anfänger-Themen 4
G einfaches jdialog beispiel Java Basics - Anfänger-Themen 1
J Default Button bei jDialog Java Basics - Anfänger-Themen 2
M JDialog mit TextArea Java Basics - Anfänger-Themen 2
K JDialog aus einer anderen klasse einfügen Java Basics - Anfänger-Themen 2
S Auf JDialog aus anderer Datei zugreifen Java Basics - Anfänger-Themen 5
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
T Frage zu Parse Java Basics - Anfänger-Themen 2
H Frage an die Profis Java Basics - Anfänger-Themen 4
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
F Kurze Frage zu replace() Java Basics - Anfänger-Themen 19
JavaSchmecktLecker Polymorphie Frage zur Methodenüberschreibung Java Basics - Anfänger-Themen 21
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
DoubleM Runtime.getRuntime().exec Frage Java Basics - Anfänger-Themen 2
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
O Frage: Formaler Typbezeichner? Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
L Frage zum Array Java Basics - Anfänger-Themen 1
A Frage zum UML Design Java Basics - Anfänger-Themen 1
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
A OCA Study Guide: 2. Frage aus Kapitel 3 Java Basics - Anfänger-Themen 9
sserio Date Library Frage Java Basics - Anfänger-Themen 9
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
sserio Frage zu HashMaps Java Basics - Anfänger-Themen 20
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
sserio Frage zu Lambda Ausdrücken Java Basics - Anfänger-Themen 7
sserio Frage zu BigInteger Java Basics - Anfänger-Themen 1
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
xxx12 Frage Java Basics - Anfänger-Themen 2
I Generelle Frage zu Mikroservices (Spring Boot?), Docker... Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben