Z
zehner
Gast
Hallo
Habe ein kleines Problem mit ScrollPanes. Habe mal einen kleinen ChatClient programmiert mit verschiedenen Textfarben und Emoticons. In Swing ist das ja kein Problem. Dank Microsoft und Ihrer tollen JVM hilft mir das ja nicht viel. Also bastele ich das mal in AWT um. Mein Problem ist, dass ich so meine Schwierigkeiten mit Canvas und ScrollPanes habe. Das ganze funktioniert soweit wunderbar, dass mir die Nachrichten schön untereinander angehängt werden, aber er will nicht scrollen. Das AWT Tutorial von Sun gibt ja in dem Bereich nicht viel her, und meine AWT-Referenz von O'Reilly auch nicht unbedingt.
Wie es in der Theorie funktioniert ist mir glaube ich klar, aber ich habe so meine Probleme mit der Praxis. Ich habe schon in append() von ChatCanvas erstmal invalidate() für das Canvas aufgerufen, dann validate() für das ScrollPane und ich habe getPreferredSize() und getMinimumSize() überschrieben. Das Ergebnis war, dass er zwar gescrollt hat, aber doppelt soweit wie nötig und alle vorherigen Einträge werden gelöscht.
Ausserdem habe ich so meine Probleme mit dem Scrollen. Wenn ich mit setSize() im append() des Canvas die neue Höhe von y zuweise(die Breite sollte ja immer gleich bleiben) und mit setScrollposition(0, y) dann dahinspringe, stimmt zwar die Position, aber der gesamte Text ist weg. Ich bin schon kurz vor dem Durchdrehen, also könnte mir vielleicht jemand von euch mal erklären (am besten mit Codebeispielen), wie ich das ScrollPane so einsetze, dass ich durch mein Canvas scrollen kann und wie ich das Canvas dazu bringe, beim scrollen nicht immer den Text zu löschen. Ich weiß, dass sind gleich zwei Wünsche auf einmal, aber ich bin wirklich kurz vor dem Durchdrehen
Danke schonmal im Voraus
Gruß
zehner
Habe ein kleines Problem mit ScrollPanes. Habe mal einen kleinen ChatClient programmiert mit verschiedenen Textfarben und Emoticons. In Swing ist das ja kein Problem. Dank Microsoft und Ihrer tollen JVM hilft mir das ja nicht viel. Also bastele ich das mal in AWT um. Mein Problem ist, dass ich so meine Schwierigkeiten mit Canvas und ScrollPanes habe. Das ganze funktioniert soweit wunderbar, dass mir die Nachrichten schön untereinander angehängt werden, aber er will nicht scrollen. Das AWT Tutorial von Sun gibt ja in dem Bereich nicht viel her, und meine AWT-Referenz von O'Reilly auch nicht unbedingt.
Wie es in der Theorie funktioniert ist mir glaube ich klar, aber ich habe so meine Probleme mit der Praxis. Ich habe schon in append() von ChatCanvas erstmal invalidate() für das Canvas aufgerufen, dann validate() für das ScrollPane und ich habe getPreferredSize() und getMinimumSize() überschrieben. Das Ergebnis war, dass er zwar gescrollt hat, aber doppelt soweit wie nötig und alle vorherigen Einträge werden gelöscht.
Ausserdem habe ich so meine Probleme mit dem Scrollen. Wenn ich mit setSize() im append() des Canvas die neue Höhe von y zuweise(die Breite sollte ja immer gleich bleiben) und mit setScrollposition(0, y) dann dahinspringe, stimmt zwar die Position, aber der gesamte Text ist weg. Ich bin schon kurz vor dem Durchdrehen, also könnte mir vielleicht jemand von euch mal erklären (am besten mit Codebeispielen), wie ich das ScrollPane so einsetze, dass ich durch mein Canvas scrollen kann und wie ich das Canvas dazu bringe, beim scrollen nicht immer den Text zu löschen. Ich weiß, dass sind gleich zwei Wünsche auf einmal, aber ich bin wirklich kurz vor dem Durchdrehen
Danke schonmal im Voraus
Gruß
zehner
Code:
public class ChatClient extends Applet implements Runnable {
private Panel centerP;
private ScrollPane chatP;
private ChatCanvas chatC;
...
private void initComponents() {
centerP = new Panel();
chatP = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);
chatC = new ChatCanvas();
chatP.add(chatC);
centerP.add(chatP);
...
setLayout(new BorderLayout(5, 5));
add("Center", centerP);
...
public void run() {
try {
while(true) {
String nachricht = inputStream.readUTF();
chatC.append(nachricht);
}
}
...
}
class ChatCanvas extends Canvas {
String nachricht;
Font nachrichtF = new Font("Dialog", Font.PLAIN, 12);
FontMetrics fm;
int abstand, y;
public ChatCanvas() {
fm = this.getFontMetrics(nachrichtF);
abstand = fm.getHeight();
y = abstand;
}
public void update(Graphics g) {
setBackground(Color.WHITE);
g.setFont(nachrichtF);
g.drawString(nachricht, 5, y);
y+=abstand;
}
public void paint(Graphics g) {
update(g);
}
public void append(String input) {
this.nachricht = input;
Graphics g = getGraphics();
update(g);
}
}