Malen nach Zahlen - mehrere Linien

Moin,
so, nachdem ich nun schon eine Weile erfolglos herumfrickele, vielleicht kann mich ja hier jemand erhellen:
Also folgende Ausgangslage:
Ich lese eine Datei ein. In dieser Datei befinden sich Punktkoordinaten für mehrere Linien. Nun möchte ich von der Gui, in der über einen JButton die Datei bzw. Werte eingelesen werden, einen weiteren Dialog oder Fenster öffnen und dort die Linien zeichnen. Ich finde jede Menge triviale Beispiele, in denen einfach eine Linie in der paint()- oder paintComponent()-Methode gezeichnet wird.
Nun zu meinen Fragen… :smiley:
[ol]
[li]Wann und warum ist paint() sinnvoll, wann und warum paintComponent()?
[/li][li]Zeichnet man auf dem JFrame (habe Beispiele gesehen) oder JPanel, wenn ja, warum? g
[/li][li]Wie kann man eine Linie nach der nächsten zeichnen (in einer for-Schleife)? Hier stehe ich gerade am meisten auf dem Schlauch. Eine einfache Übergabe der Punktkoordinaten und dann a la plotFrame.drawLine(xValues, yValues, color) scheitert doch daran, dass zum Zeichnen paint()/paintComponent() benutzt werden muss?! Oder ist es eher sinnvoll, alle Linien in eine ArrayList zu speichern, diese an das plotFrame zu übergeben und alle Linien dann in der paint()/paintComponent() auf einen Schlag zeichnen zu lassen und nicht in der for-Schleife?
[/li][/ol]
Schliesslich noch ein bisschen Code meines jämmerlichen Versuchs, der
[ul]
[li]nur die zweite Linie zeichnet
[/li][li]beim Heraus- und wieder Hereinschieben des Fensters die Linien „verliert“
[/li][li]natürlich keine Schleife ist.
[/li][/ul]
Im Aufruf-Frame:

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        ZeichnenFrame zeichnenFrame = new ZeichnenFrame();
        
        zeichnenFrame.setVisible( true );
        zeichnenFrame.drawPolygon(xKoordinaten, yKoordinaten, 1);
        zeichnenFrame.drawPolygon(xKoordinaten2, yKoordinaten2, 3);
    }

Und im Darstellungs-Frame:

    void drawPolygon(int[] xKoordinaten, int[] yKoordinaten, int colorNumber) {
        this.xKoordinaten = xKoordinaten;
        this.yKoordinaten = yKoordinaten;
        switch ( colorNumber ) {
            case    1:  theColor = Color.BLUE;
                        break;
            case    2:  theColor = Color.YELLOW;
                        break;
            case    3:  theColor = Color.RED;
                        break;
            default:    theColor = Color.GREEN;
                        break;
        }
xKoordinaten.length);
        repaint();
    }

    public void paint(Graphics graphics) {
        if ( (xKoordinaten == null) || (yKoordinaten == null) ){
            return;
        }
        super.paintComponents(graphics);
        graphics.setColor(theColor);
        graphics.drawPolygon(xKoordinaten, yKoordinaten, xKoordinaten.length);
    }

Wann und warum ist paint() sinnvoll, wann und warum paintComponent()?

paint überschreibt man bei AWT (Panel, Canvas…). Bei Swing (JPanel, JComponent…) sollte man immer paintComponent überchreiben, weil paint sich dort auch noch um andere Dinge kümmert.

Zeichnet man auf dem JFrame (habe Beispiele gesehen) oder JPanel, wenn ja, warum? g

Man sollte einem JFrame normalerweise nicht in sein Zeichnen reinpfuschen. Der hat mit Border, Menüs & Co schon genug zu tun. Im Zweifelsfall immer die paintComponent von einem JPanel überschreiben (und dieses JPanel dann in den JFrame legen)

Wie kann man eine Linie nach der nächsten zeichnen

Wenn ich das richtig verstanden habe, soll er erst eine Linie zeichnen, dann kurz warten, dann zwei Linien usw… Das “Problem” ist, dass man in der paintComponent immer alles zeichnen muss, was gezeichnet werden soll… Im Pseudocode könnte das dann so aussehen:

class LinePanel extends JPanel
{
    private List<Line> lines = Collections.synchronizedList(new ArrayList<Line>());

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        synchronized (lines)
        {
            for (Line line : lines) g.drawLine(...);
        }
    }

    public void addLine(Line line)
    {
        lines.add(line);
        repaint();
    }
}

// Von woanders:
final LinePanel linePanel = ...
final Line theLines[] = .. aus einer Datei gelesen....
Thread t = new Thread(new Runnable())
{
    public void run()
    {
        for (int i=0; i<theLines.length; i++) linePanel.addLine(theLines**);
    }
});
t.start();

OK thx. Ich habe das jetzt so erledigt, dass ich wirklich erst mal alle Daten sammle und dann an das Panel übergebe. Darin die paintComponent()-Methode überschrieben und nun wird auch gezeichnet. Allerdings hatte ich ein interessantes Phänomen dabei:
Zunächst wurde mir quasi ein Screenshot des parent-Fensters im Panel angezeigt. Das hielt sich auch hartnäckig, wenn ich das Panel (Frame) verschoben habe. Erst ein graphics.clear(…) liess den Screenshot verschwinden und legt jetzt eine weiße Leinwand aufs Panel. Was für ein Phänomen ist das, ist meine clear()-Methode korrekt oder gibt es etwas “passenderes”?

Hm. Man sollte seinen Hauptframe mit SwingUtilities erstellen und anzeigen, und setVisible(true) erst ganz am Ende machen, aber ob das wirklich die Ursache für den “Screenshot” ist, kann man schwer sagen…