Java Form bleibt Weiß

wusli

Aktives Mitglied
Heyho,
Ich starte meine Java Form, doch diese ist einfach nur Weiß, ohne Objekte...
Quellcode:
Java:
private static final long serialVersionUID = 1L;
	public JFrame frmLanChat;
	public JTextArea ta_schreiben;
	public JTextField tf_nick;
	public JTextArea ta_lesen;
	public JTextField txt_nick;
	

	/**
	 * Startet die Anwendung.
	 */
	public static void main(String[] args) {

		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Chat window = new Chat();
					window.frmLanChat.setVisible(true);
					Empfangen.listen(window);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
public Chat() {
		
		Empfangen empf = new Empfangen();
		// Netzwerk-Gruppe
		final String NETWORK_GROUP = "231.0.0.1";
		// Netzwerk-Gruppen Port
		final int NETWORK_GROUP_PORT = 3337;
		// Client-Port
		final int CLIENT_MULTICAST_PORT = 3336;

		// Nachrichten-Codierung
		final String TEXT_ENCODING = "UTF8";

		frmLanChat = new JFrame();
		frmLanChat.setIconImage(Toolkit.getDefaultToolkit().getImage(Chat.class.getResource("/javax/swing/plaf/metal/icons/ocean/computer.gif")));
		frmLanChat.setResizable(false);
		frmLanChat.setTitle("Lan Chat");
		frmLanChat.getContentPane().setBackground(Color.LIGHT_GRAY);
		frmLanChat.setBounds(100, 100, 596, 634);
		frmLanChat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmLanChat.getContentPane().setLayout(null);

		ta_lesen = new JTextArea();
		ta_lesen.setBounds(39, 49, 371, 411);
		frmLanChat.getContentPane().add(ta_lesen);

		ta_schreiben = new JTextArea();
		ta_schreiben.setBounds(39, 471, 371, 101);
		frmLanChat.getContentPane().add(ta_schreiben);

		JButton btn_Nick = new JButton("Nickname setzen");
		btn_Nick.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				 String nickname = txt_nick.getText();
			}

		});
		btn_Nick.setBounds(237, 10, 173, 23);
		frmLanChat.getContentPane().add(btn_Nick);

		JButton btn_senden = new JButton("Senden");
		btn_senden.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String sende_text = ta_schreiben.getText();
				ta_schreiben.setText(" ");
				String nickname = txt_nick.getText();
				try {
					MulticastSocket socket = new MulticastSocket(
							CLIENT_MULTICAST_PORT);
					byte[] message = sende_text.getBytes(TEXT_ENCODING);

					// Nachricht an Gruppe senden
					socket.send(new DatagramPacket(message, message.length,
							InetAddress.getByName(NETWORK_GROUP),
							NETWORK_GROUP_PORT));
				} catch (IOException e1) {
					e1.printStackTrace();
				}

			}

		});

		btn_senden.setBounds(420, 472, 129, 23);
		frmLanChat.getContentPane().add(btn_senden);
		
		txt_nick = new JTextField();
		txt_nick.setBounds(39, 11, 173, 20);
		frmLanChat.getContentPane().add(txt_nick);
		txt_nick.setColumns(10);
		
		final String liste[] = {":)", ":(", ":P", ":D", ":*", ":/"};
		final JComboBox smileybox = new JComboBox(liste);
		smileybox.setModel(new DefaultComboBoxModel(new String[] {":) ", ":( ", ":P ", ":D ", ":* ", ":/ "}));
		smileybox.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				int auswahl = smileybox.getSelectedIndex();
				ta_schreiben.setText(ta_schreiben.getText() +liste[auswahl]);
			}

		});
		smileybox.setToolTipText("Smileys");
		smileybox.setBounds(420, 506, 129, 20);
		frmLanChat.getContentPane().add(smileybox);
		
		
	}

}

Und die Kasse Empfangen:
Java:
package chat;

import java.io.*;
import java.net.*;
import java.awt.event.*;
import chat.*;




public  class Empfangen {
	public static void listen(Chat window) {
	

		// Netzwerk-Gruppe erstellen
		String NETWORK_GROUP = "231.0.0.1";
		// Port der Netzwerkgruppe
		int NETWORK_GROUP_PORT = 3337;

		// Nachrichten-Codierung
		String TEXT_ENCODING = "UTF8";

		InetAddress group;
		MulticastSocket socket;

		try {
			// Gruppe anlegen
			group = InetAddress.getByName(NETWORK_GROUP);
			socket = new MulticastSocket(NETWORK_GROUP_PORT);

			// Gruppe beitreten
			socket.joinGroup(group);

			byte[] bytes = new byte[65536];
			DatagramPacket packet = new DatagramPacket(bytes, bytes.length);

			while (true) {
				// Auf Nachrichten warten
				socket.receive(packet);
				final String message = new String(packet.getData(), 0,
						packet.getLength(), TEXT_ENCODING);
				System.out.println(message);
				window.ta_lesen.append(message+"\n");
				
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	
}

Wenn ich die Zeile:[c]Empfangen.listen(window);[/c] auskommentiere funktioniert die Form wieder, aber das schreiben nicht...
Hat jemand nen Lösungsansatz? 🙂

Vielen Dank im Vorraus 🙂
 
ups verlesen...sry

Es liegt daran:
Java:
                    Chat window = new Chat();
                    window.frmLanChat.setVisible(true);
sollte außerhalb des Threads liegen.
Denn sonst werden die Änderungen vom Frame auch erst sichtbar, wenn der
receive passiert ist.

Dann sieht deine main so aus:
Java:
    public static void main(String[] args) {
        final Chat window = new Chat();
        window.frmLanChat.setVisible(true);

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Empfangen.listen(window);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
 
@anti-Held
Danke für den tollen ansatz, wird wieder alles angezeigt, Problem ist ich kann die Textfelder nicht anklicken :/
 
Ich hab mir überlegt, dass mit nem Thread zu machen, aber bin mir nicht sicher wie und ob überhaupt?
Edit: hab grad erst gesehen, dass ich das in nem Thread machen soll, was ich auch versucht habe, aber nicht so wirklich will.
Wie verpack ich das denn in einen Thread, weil starten tu ich den ja einfach nur mit Thread.start();?
 
Zuletzt bearbeitet:
Das waren nur die Grundfehler...
Da, wie bERtOr richtig erwähnt hat, die Eventqueue in einer endlosschleife steckt werden auch die actionlistener
nicht ausgeführt.

Würdest du einen normalen Thread verwenden könnte es funktionieren:

Java:
    public static void main(String[] args) {
        final Chat window = new Chat();
        window.frmLanChat.setVisible(true);
 
        new Thread(new Runnable() {
            public void run() {
                try {
                    Empfangen.listen(window);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

P.S. lösch doch bitte dein Empfangen - Objekt aus Chat raus...
Du brauchst kein Objekt, um eine statische Methode aufzurufen.
 

Zurück
Oben