Simpler DrawLine - Befehl!?

fl_ex

Bekanntes Mitglied
Moorgen...

ich habn Problem mit nem Simplen DrawLine-Befehl^^

also ich habe die Paintfunktion:
Java:
public void paint(Graphics g, int x, int y, int x2, int y2) {
	g.drawLine(x, y, x2, y2);
}

Und nun will ich ne Line zeichnen die von einem Button zum nächsten geht...

d.h:

Java:
Graphics g = null;
Graphics2D g2 = (Graphics2D) g; 
paint(g2, x, y, btn3.getX(), btn3.getY());

NullPointerException... weil g ja null ist... aber wie mach ich das sonst? weil btn3.getX und so verändert sich ja... will nich direkt in der paintmethode die x und y werte eintragen...

:/
 
Java:
package diags;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;

import bebauung.domain.Process;

public class DiagramShow extends JFrame {

	/**
	 * Create the panel.
	 */
	public DiagramShow(final bebauung.domain.Process process) {

		setSize(630, 501);
		getContentPane().setLayout(null);
		setVisible(true);

		int x = 10;
		int y = 10;
		int width = 50;
		int height = 25;

		final List<Process> subProcessesList = process.getSubProcesses();
		// TODO
		System.out.println(process.getName());
		final JButton btn1 = new JButton();
		btn1.setBounds(x, y, width, height);
		getContentPane().add(btn1);

		y += 30;

		for (Process process2 : subProcessesList) {
			// TODO
			System.out.println("--" + process2.getName());
			final JButton btn2 = new JButton();
			btn2.setBounds(x, y, width, height);
			getContentPane().add(btn2);

			final List<Process> subSubProcessesList = process2.getSubProcesses();
			if (subSubProcessesList.isEmpty() == true) {
				x += 55;
			} else {
				y += 30;
			}

			for (Process process3 : subSubProcessesList) {
				// TODO
				System.out.println("---" + process3.getName());
				final JButton btn3 = new JButton();
				btn3.setBounds(x, y, width, height);
				getContentPane().add(btn3);
				Graphics g = getGraphics();
				Graphics2D g2 = (Graphics2D) g;
				paint(g2, x, y, btn3.getX(), btn3.getY());
				y -= 30;
				x += 55;
			}
		}
	}

	public void paint(Graphics g, int x, int y, int x2, int y2) {
		g.drawLine(x, y, x2, y2);
	}

}

er malt dann quasi die buttons ... und soll sie nun verbinden...

vielleicht klappts jetzt?^^
 
In ActionListenern oder so zeichnest du überhaupt nichts. paint und paintComponent werden von Swing aufgerufen, und sollen auch nur von Swing aufgerufen werden. Das Graphics-Objekt muss auch von Swing stammen, woher soll es sonst "sehen", was du gemacht hast?

Du musst also paintComponent (paint lässt man im Normallfall besser in Ruhe) so ändern, dass dort das richtige gezeichnet wird. Dazu kann dein Programm natürlich irgendwelche Werte setzen, die paintComponent zum Zeichnen verwenden kann.
 
Grob sowas wie
Java:
class PanelMitButtonsUndLinien extends JPanel
{
    private List<Line2D> linien = ...
    // (add/remove-Methoden für Linien einbauen)

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        // hier jetzt alle Linien zeichnen
    }
}
 
Genau, versuche es so wie Marco vorschlägt. Wenn du im ActionListener etwas verändert hast (z.B. eine Linie hinzufügst), musst du danach normalerweise noch repaint am Panel aufrufen, damit Swing "weiss", dass sich etwas geändert hat.
 

Zurück
Oben