Probleme mit eigenem Canvas und ScrollPane

Status
Nicht offen für weitere Antworten.
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
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);
    }
}
 
B

Beni

Gast
Canvas speichert das gezeichnete nicht. Nur schon wenn du ein anderes Fenster über das Canvas zieht, wird alles gelöscht...

Versuch das Ganze mal mit einer java.awt.TextArea ! (die hat die ScrollBars auch gleich mitgeliefert :) )

mfg Beni
 
Z

zehner

Gast
Mit einer TextArea würde alles wunderbar funktionieren, aber das Problem ist, dass ich die paint Methode der Textarea nicht für verschiedene Fonts u.v.a. Images überschreiben kann. Daher ja die umständliche Lösung mit dem Canvas
 
B

Beni

Gast
Sorry, hab deinen Text nicht so genau gelesen...

Andere Möglichkeit:
Du speicherst den Text irgendwo (z.B. in einem Vector). Damit du die Canvas selbst ganz neuzeichnen kannst (bei jedem Aufruf von paint alles neuzeichnen).

Und dann kannst du die setScrollposition verwenden.
 
Z

zehner

Gast
Das artet ja langsam in einen Chat aus, so schnell kommen hier die Antworten.
Vector fällt leider flach, soweit ich weiss ist der erst in Java 1.1.5 drin und Microsoft nimmt nur 1.1.4 abwärts.
Was ich nicht ganz verstehe ist, warum eigentlich Vectoren(oder was ähnliches um den Text zwischenzuspeichern), bisher hängt er den Text ja auch unten an. Erst wenn er zu scrollen beginnt, dann ist alles weg.
Ich versteh das einfach nicht
 
B

Beni

Gast
*Werbung* hier Chat

Also: das Canvas ist eine einfache Schicht Pixel, die man mit den Graphics jederzeit beeinflussen kann. Normalerweise behält es diese Schicht Pixel (es macht einfach so wenig wir nur möglich).
Manchmal hat das Canvas aber das Gefühl, dass seine Anzeige nicht mehr simmen kann (bei Grössenänderungen z.B.), dann löscht es einfach mal alles.

Die Paint-Methode ist eigentlich dazu bestimmt, dass alles neugezeichnet wird.

Deshalb solltest du alles speichern.

Wenn kein Vector da ist, schreibst du halt selber einen :wink: (oder suchst dir sonst eine Datenstruktur die passt).

mfg Beni
 
Z

zehner

Gast
Danke für die Hilfe Beni
Werde es mal mit dem Zwischenspeicher machen. Was mich noch interessieren würde ist, warum es bisher ohne Vector funktioniert hat. Das Canvas hängt den Text an, und wenn ich mit System.out.println die Nachrichten und deren Position abfange, dann sehe ich auch, dass es weiterschreibt, nur eben nicht mehr im sichtbaren Bereich. Daher auch die Notwendigkeit eines ScrollPanes. Wenn ich mit repaint() ein neuzeichnen erzwinge, dann passt auch noch alles. Nur wenn das ganze auf einem ScrollPane liegt, dann funktioniert nichts.

mfg
zehner
 
Z

zehner

Gast
Sollte mal jemand die gleichen Probleme haben wie ich, hier mein geänderter Code:
Es funktioniert jetzt so wie ich es haben wollte, aber da ich erst seit einem viertel Jahr in Java programmiere, bin ich natürlich für jeden Verbesserungsvorschlag dankbar.
An Beni danke nochmal, ich benutze vorläufig einen Vector bis ich sowas ähnliches selber programmieren kann
mfg
zehner
Code:
class ChatCanvas extends Canvas {
    private Dimension dim;
    private Vector nachrichten = new Vector(20, 10);
    Font nachrichtF = new Font("Dialog", Font.PLAIN, 12);
    FontMetrics fm;
    int abstand, y;
    
    public ChatCanvas() {
        dim = new Dimension(550, 20);
        fm = this.getFontMetrics(nachrichtF);
        abstand = fm.getHeight();
    }
    public void paint(Graphics g) {
        setBackground(Color.WHITE);
        g.setFont(nachrichtF);
        int y = abstand;
        boolean farbwechsel = true;
        for(int i=0; i<nachrichten.size(); i++) {
            if(farbwechsel)
                g.setColor(Color.BLACK);
            else
                g.setColor(Color.BLUE);
            g.drawString((String)nachrichten.elementAt(i), 5, y);
            y+=abstand;
            farbwechsel=!farbwechsel;
        }
        dim = new Dimension(550, y);
    }
    
    public Dimension getMinimumSize() {
        return getMinimumSize();
    }
    public Dimension getPreferredSize() {
        return dim;
    }
    
    public void append(String input) {
        if(nachrichten.size() > 500) {
            nachrichten.removeElementAt(0);
        }
        nachrichten.addElement(input);
        repaint();
        ScrollPane parent = (ScrollPane)getParent();
        this.invalidate();
        parent.validate();
        parent.setScrollPosition(0, this.getHeight());
    }
}
 
Z

zehner

Gast
Bräuchte doch nochmal Hilfe
Die Lösung mit dem Vector hat den Nachteil, dass ja jedesmal das gesamte Canvas neu gezeichnet wird. Wenn ich jetzt die Vectorgrösse beschränke(im Code 500), sagen wir mal auf 30, dann verschmiert erstmal jede Zeile, die nach 30 dazukommt. Wenn ich die Zeile aus dem Bild scrolle und wieder reinscrolle, dann sieht alles wieder ganz normal aus. Ein Aufruf von repaint() hilft seltsamerweise nichts. Nur wenn ich update() nicht überschreibe, dann tritt das Verschmieren nicht auf. Das muss ich aber, da ich animierte gifs in das Canvas einfüge und und die ansonsten grausam flackern. Hat vielleicht jemand einen Java 1.1 konformen Vorschlag?

Übrigens zu 1.1: Vectoren funktionieren wunderbar mit MS's JVM, nur solche Späße wie add() nicht, nimmt man aber addElement() funktionieren sie. getHeight() funktioniert nur mit Bildern, ansonsten muss man es in meinem Canvas mit getSize().height ersetzen, dann läuft es tadellos mit MS. getWidth() natürlich ebenso
Danke schonmal für die Hilfe

mfg
zehner
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Probleme mit eigenem JOptionPane AWT, Swing, JavaFX & SWT 2
T JList mit eigenem TransferHandler: Fokus(?)-Probleme AWT, Swing, JavaFX & SWT 4
Juelin Probleme bei Stage.close() AWT, Swing, JavaFX & SWT 23
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
E repaint Probleme AWT, Swing, JavaFX & SWT 13
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
S GridBagLayout - Probleme mit Bilderanzeige AWT, Swing, JavaFX & SWT 3
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
J Probleme mit idividueller Tablecell AWT, Swing, JavaFX & SWT 0
D JavaFX Probleme beim nachtäglichen hinzufügen der jfx dependency AWT, Swing, JavaFX & SWT 7
J Probleme mit InputDialog AWT, Swing, JavaFX & SWT 4
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
pph080560 JavaFX Probleme mit FX AWT, Swing, JavaFX & SWT 3
M Probleme mit OpenJDK AWT, Swing, JavaFX & SWT 6
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
A Probleme mit gridheight (GridBagLayout) AWT, Swing, JavaFX & SWT 6
U Opaque Probleme AWT, Swing, JavaFX & SWT 3
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
F JavaFX Probleme beim automatischen Konvertieren AWT, Swing, JavaFX & SWT 4
S Probleme mit JComboboxen(?) AWT, Swing, JavaFX & SWT 18
S Swing Probleme mit MigLayout AWT, Swing, JavaFX & SWT 2
C Probleme mit createImage AWT, Swing, JavaFX & SWT 1
J Probleme mit contex Menu (javafx) AWT, Swing, JavaFX & SWT 1
J Probleme bei GameofLife AWT, Swing, JavaFX & SWT 24
S JavaFx - Button ActionEvent Probleme AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 0
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 5
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
D Swing Probleme mit dem Resizing AWT, Swing, JavaFX & SWT 7
G Probleme mit TextArea AWT, Swing, JavaFX & SWT 5
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
K Probleme beim JPasswordField AWT, Swing, JavaFX & SWT 11
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
L Probleme mit Programm AWT, Swing, JavaFX & SWT 13
blazingblade komischerweise probleme mit jtextfield.gettext() AWT, Swing, JavaFX & SWT 9
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
Sin137 LayoutManager GridBagLayout Probleme AWT, Swing, JavaFX & SWT 6
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
C Java FX Probleme beim Schließen einer Stage AWT, Swing, JavaFX & SWT 11
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
S Swing Probleme mit transparenz der Hintergrundfarbe und JRadioButtons AWT, Swing, JavaFX & SWT 2
Z Probleme mit JPanel's AWT, Swing, JavaFX & SWT 6
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
A Probleme mit TilledBorder("***") AWT, Swing, JavaFX & SWT 4
F Bildschirmschoner Probleme mit Preview AWT, Swing, JavaFX & SWT 8
X Panel Probleme (Tetris) AWT, Swing, JavaFX & SWT 8
N JTable probleme AWT, Swing, JavaFX & SWT 5
B Probleme bei ImageIO.read (?!) AWT, Swing, JavaFX & SWT 9
P JFrame Location-/Size-Probleme AWT, Swing, JavaFX & SWT 5
U LayoutManager Probleme mit Layouts AWT, Swing, JavaFX & SWT 5
C 3 kleine Probleme... AWT, Swing, JavaFX & SWT 13
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
A Probleme mit 2 JFrames in einem Programm AWT, Swing, JavaFX & SWT 7
K LayoutManager Probleme mit 2 Komponenten AWT, Swing, JavaFX & SWT 9
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
M Probleme mit Verkleinern eines GUI AWT, Swing, JavaFX & SWT 7
B Swing label.setText() macht probleme AWT, Swing, JavaFX & SWT 5
B ImageIcon - Probleme mit dem Dateipfad AWT, Swing, JavaFX & SWT 5
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Probleme mit (Graphics g) II AWT, Swing, JavaFX & SWT 4
F Probleme mit (Graphics g) AWT, Swing, JavaFX & SWT 3
K 2D-Grafik .GIF macht mir Probleme AWT, Swing, JavaFX & SWT 14
B Probleme bei Sortierung einer Tabelle mit DefaultTableModel AWT, Swing, JavaFX & SWT 6
T JTable Graphik probleme AWT, Swing, JavaFX & SWT 3
H GridBagLayout macht Probleme... AWT, Swing, JavaFX & SWT 4
vandread Swing Probleme mit jTextField im zusammenspiel mit einem Einblendeffekt (inkl. KSKB) AWT, Swing, JavaFX & SWT 6
S Swing Lauftext Performance Probleme, in größerer Anwendung AWT, Swing, JavaFX & SWT 6
B Infolabel Probleme mit Paint() ? AWT, Swing, JavaFX & SWT 8
P Probleme mit setIconImage AWT, Swing, JavaFX & SWT 8
U Swing Probleme mit Asynchronen Prozessen und Swing: AWT, Swing, JavaFX & SWT 3
das-mo Probleme mit GridBagLayout AWT, Swing, JavaFX & SWT 6
N 2D-Grafik 2 Probleme beim zeichnen AWT, Swing, JavaFX & SWT 18
L Probleme mit JPanel AWT, Swing, JavaFX & SWT 8
D Probleme bei Übertrag von ArrayList in Jtable AWT, Swing, JavaFX & SWT 2
G kleinere Probleme mit GUI AWT, Swing, JavaFX & SWT 2
G Mehrere Probleme mit Java's GUI AWT, Swing, JavaFX & SWT 6
M Swing Erste Schritte mit der GUI, viele Probleme AWT, Swing, JavaFX & SWT 36
J GUI-Aktualisierungs-Probleme AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben