Hi,
ich habe vor, ein kleines Chatprogramm mit Java und SWT zu schreiben. Dieses Programm soll es außerdem ermöglichen, mit mehreren Benutzern gleichzeitig kommunizieren zu können, dafür möchte ich jeden Chat in einem eigenen Tab darstellen (das soll dann so aussehen, wie das "Tabbed Browsing" bei Firefox).
Ich habe mir das so vorgestellt, dass ich einen CTabFolder als Grundlage nehme und für jeden Chat einen eigenen TabItem aufmache und der Inhalt soll immer der gleiche sein, nämlich ein Konversationsfenster, eine Eingabezeile und ein Senden-Button, welcher nur aktiviert werden soll, wenn auch im Textfeld tatsächlich was eingegeben wurde.
Da habe ich mir gedacht, da ich ja auf jeder Seite das gleiche haben will, schreibe ich einfach mein Chat-Fenster in eine eigene Klasse und setze diese dann als Composite auf meinen jeweiligen TabItem, aber leider funktioniert das nicht richtig und ich frage mich verzweifelt, warum... Man kann nämlich immer nur im letzten Item den Button aktivieren, bzw. eine Nachricht schicken. Hier mal mein Code:
Main.java (die Hauptklasse):
ChatPanel.java (Hier wird ein Chat-Fenster erzeugt):
Meine Fragen sind jetzt folgende:
1.) Wie mache ich das, damit man auf jeder Seite chatten kann und nicht nur auf der letzten?
2.) Das Textfeld mit der Konversation muss auch von außen (etwa von einem Netzwerk-Thread, der auf ankommende Nachrichten wartet) beschreibbar sein, deshalb ist die Methode "addMessage" auch public static, nur wie kann ich von außen unterscheiden, in welchen Tab ich schreiben soll?
Ich hoffe, mein (wahrscheinlich recht simples) Problem ist einigermaßen verständlich, ich habe zwar schon etwas Erfahrung mit Java-Programmierung, bin aber erst am Anfang bei SWT, da ich bisher nur mit der Console gearbeitet habe und nicht mit einer GUI. Ich danke in Voraus für eure Hilfe!
Grüße, Japster
ich habe vor, ein kleines Chatprogramm mit Java und SWT zu schreiben. Dieses Programm soll es außerdem ermöglichen, mit mehreren Benutzern gleichzeitig kommunizieren zu können, dafür möchte ich jeden Chat in einem eigenen Tab darstellen (das soll dann so aussehen, wie das "Tabbed Browsing" bei Firefox).
Ich habe mir das so vorgestellt, dass ich einen CTabFolder als Grundlage nehme und für jeden Chat einen eigenen TabItem aufmache und der Inhalt soll immer der gleiche sein, nämlich ein Konversationsfenster, eine Eingabezeile und ein Senden-Button, welcher nur aktiviert werden soll, wenn auch im Textfeld tatsächlich was eingegeben wurde.
Da habe ich mir gedacht, da ich ja auf jeder Seite das gleiche haben will, schreibe ich einfach mein Chat-Fenster in eine eigene Klasse und setze diese dann als Composite auf meinen jeweiligen TabItem, aber leider funktioniert das nicht richtig und ich frage mich verzweifelt, warum... Man kann nämlich immer nur im letzten Item den Button aktivieren, bzw. eine Nachricht schicken. Hier mal mein Code:
Main.java (die Hauptklasse):
Java:
package test;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Main {
static Display display;
static Shell shell;
static CTabFolder tabFolder;
static CTabItem tabItem;
static ChatPanel chatPanel;
private static void addTabItem(String nick) {
tabItem = new CTabItem(tabFolder, SWT.NONE);
tabItem.setText(nick);
chatPanel = new ChatPanel(tabFolder);
tabItem.setControl(chatPanel);
tabFolder.setSelection(tabItem);
}
public static void main(String[] args) {
display = new Display();
shell = new Shell(display, SWT.SHELL_TRIM);
shell.setText("SWT Tabbed Chat");
shell.setLayout(new FillLayout());
tabFolder = new CTabFolder(shell, SWT.CLOSE);
tabFolder.setBorderVisible(true);
tabFolder.setSimple(true);
addTabItem("TEST");
addTabItem("test2");
shell.setSize(640, 480);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
ChatPanel.java (Hier wird ein Chat-Fenster erzeugt):
Java:
package test;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Text;
public class ChatPanel extends Composite {
static Display parentDisplay;
static GridLayout layout;
static GridData data;
static Text messages;
static Text input;
static Button send;
public ChatPanel(Composite parent) {
super(parent, SWT.NONE);
parentDisplay = parent.getDisplay();
layout = new GridLayout(2, false);
this.setLayout(layout);
data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan = 2;
messages = new Text(this, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI);
messages.setEditable(false);
messages.setBackground(new Color(parentDisplay, 255, 255, 255));
messages.setLayoutData(data);
data = new GridData(GridData.FILL_HORIZONTAL);
input = new Text(this, SWT.BORDER);
input.setLayoutData(data);
data = new GridData();
send = new Button(this, SWT.PUSH);
send.setText("Nachricht senden");
send.setEnabled(false);
send.setLayoutData(data);
input.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
if (input.getText() != "") {
send.setEnabled(true);
} else {
send.setEnabled(false);
}
}
});
send.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
addMessage("test", input.getText());
}
});
}
public static void addMessage(String nick, String message) {
messages.append(nick + ": " + message + "\n");
}
}
Meine Fragen sind jetzt folgende:
1.) Wie mache ich das, damit man auf jeder Seite chatten kann und nicht nur auf der letzten?
2.) Das Textfeld mit der Konversation muss auch von außen (etwa von einem Netzwerk-Thread, der auf ankommende Nachrichten wartet) beschreibbar sein, deshalb ist die Methode "addMessage" auch public static, nur wie kann ich von außen unterscheiden, in welchen Tab ich schreiben soll?
Ich hoffe, mein (wahrscheinlich recht simples) Problem ist einigermaßen verständlich, ich habe zwar schon etwas Erfahrung mit Java-Programmierung, bin aber erst am Anfang bei SWT, da ich bisher nur mit der Console gearbeitet habe und nicht mit einer GUI. Ich danke in Voraus für eure Hilfe!
Grüße, Japster
Zuletzt bearbeitet: