Portal > Foren > Java > Desktop-Applikationen und Grafik > Line2D.Double-Objekt auf Panel zeichnen - kein Graphics-Objekt vorhanden :-/
Antwort
 
Themen-Optionen
Alt 15.02.2006, 00:01 Nach oben    #1
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard Line2D.Double-Objekt auf Panel zeichnen - kein Graphics-Objekt vorhanden :-/

Kurze Frage .. und sorry im Voraus. Ich bin kurz vorm Einpennen, aber ich will schnell noch die Frage loswerden, damit ich das nicht vergesse *gg*

Aaaaaalso.
Ich habe ein Objekt vom Typ Line2D.Double, welches ich gerne auf ein Panel zeichnen möchte.
Wie mach ich das denn am besten?

Ich habe mir jetzt überlegt, dass ich mit der Methode drawLine(..) arbeite. Das Problem ist aber, dass ich in der Methode buildBorder() kein Graphics-Objekt zur Verfügung habe.
Das hier ..
PHP-Code:
    private void buildBorder() {
        
BorderBarricade leftBorder = new BorderBarricade(new Point(3030), new Point(30400));
        
        
Graphics g getGraphics();
        
g.drawLine((int)leftBorder.getX1(), 
                   (int)
leftBorder.getY1(), 
                   (int)
leftBorder.getX2(), 
                   (int)
leftBorder.getY2());
    } 
mit
PHP-Code:
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;

public class 
BorderBarricade extends Line2D.Double
                             
implements BarricadeBumper {
    
    
    public 
BorderBarricade(Point2D startPoint2D end) {
        
super(startend);
    }
    
    
    public 
void determineNewDirection() {
    }


ergibt mir ein NullPointerException, da getGraphics() eben NULL zurückgibt.
Ich dachte mir .. okay, haste doch noch nicht verstanden, wie das mit getContentPane() läuft .. aber das ist dort auch gar nicht verfügbar, also wird es daran ja nicht wirklich liegen.

Die Methode liegt in der Klasse FlipperPanel extends JPanel implements Runnable, in der es auch eine paintComponent()-Methode gibt. Diese zeichnet ein gepuffertes Bild, zur Reduktion des Bildschirmflackerns auf das Panel. (richtig ausgedrückt?)

Meine Frage ist nun .. wie kann ich es am besten realisieren, dass diese verdammte Linie gezeichnet wird?

Ich danke für Eure Antworten.
Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2006, 09:33 Nach oben    #2
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

Warum rufst du "buildBorder" nicht in der paintComponent() auf (und übergibst idealerweise noch das Graphics-Objekt)?
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2006, 11:20 Nach oben    #3
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 575
Standard

Also ich würde das nach dem Vorbild der GUI machen. Dort gibt es ja Container und Elemente die du darin addest.
Auf mich scheint es so als wenn BorderBarricade ein Element ist das mehr als 1x auf dem FlipperPanel gezeichnet werden kann, oder?

Ich würde das ganze also nach folgendem Model aufbauen:
FlipperPanel ist ein Container
BorderBarricade ist ein Element

Damit das funktioniert muß BorderBarricade von einer Klasse abstammen von der auch alle anderen Klassen abstammen die gadded werden können.
Zu diesem Zweck erstellen wir die Basis GraphicElement, diese sorgt dafür, dass alle von ihr abgeleiteten Klassen eine Methode paintElement(Graphics g) hat die du dann selbst bei einer Ableitung überschreiben mußt.

So, von dieser Basis muß BorderBarricade also erben, und die die paintElement(Graphics g)-Methode von BorderBarricade schreibst du dann das zeichnen der Graphic indem du das Graphics-Element verwendest.


Jetzt schnappst du dir FlipperPanel und schreibst dort einen Vector<GraphicElement> hinein den wir graphicElements nennen und legst eine Methode .addGraphicElement(GraphicElement graphicElement) an die dann dem Vector ein Element hinten dran hängt.

Das "adden" besorgst du am besten im Konstructor, also während der initialisierung. Oder wann du möchtest.

Jetzt kommt der Clou:
Dort wo du in FlipperPanel das Bild zeichnest durchläufst du einfach den Vector und springst

jeweils die paintElement Methode des GraphicElement an, und schon kannst du sicher sein, dass alles gezeichnet wird. OOP ist es auch noch.

Code:
// Ungetestet
public void beispielMalMethodeInFlipperPanel(Graphics g) {
	for (int i=0; i < graphicElements.size(); i++) {
		graphicElements.get(i).paintElement(g);
	}
}

Ich hoffe das war verständlich


Gruß
Sparrow
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2006, 18:08 Nach oben    #4
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 521
Standard

ich glaub bla will damit nur nen rahmen malen und der wird in swing nicht mit ner eigenen komponente realisiert.

um den border zu ändern musst man die paintBorder(Graphics) methode überschreiben. und da steht dann auch ein graphics objekt zur verfügung.
allerdings müssen dann auch die insets verändert werden.
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist gerade online  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2006, 18:46 Nach oben    #5
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 575
Standard

Zitat:
Zitat von $traight-$hoota
ich glaub bla will damit nur nen rahmen malen und der wird in swing nicht mit ner eigenen komponente realisiert.

um den border zu ändern musst man die paintBorder(Graphics) methode überschreiben. und da steht dann auch ein graphics objekt zur verfügung.
allerdings müssen dann auch die insets verändert werden.
Nein, ausgehend von dem Code der hier irgendwo im Forum rumfliegt und dem Namen "Flipper" würd ich sagen er möchte ein Spielfeld zeichnen

Er soll ja auch für das Zeichnen keine Swing-Komponente verwenden sondern sein Vorgehen zur realsierung des "addens" der Grafik-Elemente ensprechend an der GUI anlehnen.
Das funktioniert recht gut.

Grüße
Sparrow
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.02.2006, 12:13 Nach oben    #6
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Jo hi,
also Deine Ausführungen sparrow sind mir gerade insoweit unklar, da ich nicht so ganz verstehe, welche Vorteile es mir bringt.
Vielleicht hab ichs auch einfach nicht verstanden *gg* .. wer weiß.

Ich habe das jetzt mal behelfsmäßig so gemacht, wie pago es vorgeschlagen hat.

Ich habe jetzt aber irgendwie ein Problemchen. Ich erstelle also einige "borders" und will diese nun mit Hilfe von g.drawLine(...) zeichnen.
Das Zeichnen klappt auch .. hm .. aber irgendwie .. äh ... nicht so, wie ich mir das vorstelle.
PHP-Code:
     private void buildBorders(Graphics g) {
        List 
borders = new ArrayList();
        
borders.add(new BorderBarricade(new Point(3030), new Point(30400)));
        
borders.add(new BorderBarricade(new Point(4040), new Point(40030)));
        
        
Iterator iter borders.iterator();
        while(
iter.hasNext()) {
            
BorderBarricade border = (BorderBarricade)iter.next();
            
            
g.drawLine((int)border.getX1(),
                       (int)
border.getY2(),
                       (int)
border.getX2(), 
                       (int)
border.getY2());
        }    
    } 
Hier wird nun nur der zweite Rahmen gezeichnet ... .. raff ich nicht .. *help*


EDIT:
Ähm .. es werden nur die horizontalen Rahmen gezeichnet.
Ich habe nun mal vier Rahmen erstellt .. mit Koordinaten, dass sie zusammen ein Quadrat ergeben.

Geändert von Ben (16.02.2006 um 12:22 Uhr).
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2006, 13:58 Nach oben    #7
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

*schubs*

Kann mir eventuell jemand dabei weiterhelfen?
Zitat:
Zitat von Ben
Ähm .. es werden nur die horizontalen Rahmen gezeichnet.
Ich habe nun mal vier Rahmen erstellt .. mit Koordinaten, dass sie zusammen ein Quadrat ergeben.
... aber es werden nur die horizontalen Linien (oben und unten ) gezeichnet.

Wieso das denn? Ist für mich vollkommen unlogisch.

Der Quelltext der Methode sieht derzeit so aus ...
PHP-Code:
private void buildBorders(Graphics g) {
        List 
borders = new ArrayList();
        
borders.add(new BorderBarricade(new Point(70400), new Point(40030)));
        
borders.add(new BorderBarricade(new Point(3030), new Point(40030)));
        
borders.add(new BorderBarricade(new Point(40030), new Point(400400)));
        
borders.add(new BorderBarricade(new Point(30400), new Point(400400)));
        
        
Iterator iter borders.iterator();
        while(
iter.hasNext()) {
            
BorderBarricade border = (BorderBarricade)iter.next();
            
            
g.drawLine((int)border.getX1(),
                       (int)
border.getY2(),
                       (int)
border.getX2(), 
                       (int)
border.getY2());
        }    
    } 
Mir ist dabei schnurz, ob die Linien passend angeordnet sind .. ich will einfach mal die vertikalen Striche gezeichnet bekommen ...

Danke, Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2006, 14:48 Nach oben    #8
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

Magst vielleicht mal nen Screenshot davon posten, wie es aussieht, und wie es aussehen soll?
Weil was ich da an deinen Koordinaten sehe, sieht nicht nach nem Rechteck aus... (die zweite X-Koordinate ist immer 400)
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2006, 14:56 Nach oben    #9
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Zitat:
Zitat von pago
Magst vielleicht mal nen Screenshot davon posten, wie es aussieht, und wie es aussehen soll?
Wie es aussehen sollte .. Du bist witzig. Das bekomme ich doch gerade nicht hin.

Jou. Ich hatte da auch einen kleinen Dreher drin. Na, wie soll das aussehen .. (sorry das Programm liegt auf dem Notebook und ich habe gerade keinen USB-Stick parat!) .. oben eine Linie, unten eine Linie (30,30) -> (400, 30) und (30,400) -> (400,400).

Der Code sieht nun mal so aus.
PHP-Code:
borders.add(new BorderBarricade(new Point(3030), new Point(40030)));
borders.add(new BorderBarricade(new Point(3030), new Point(30400)));
borders.add(new BorderBarricade(new Point(40030), new Point(400400)));
borders.add(new BorderBarricade(new Point(30400), new Point(400400))); 
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2006, 15:32 Nach oben    #10
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

Manche Menschen behaupten, Windows käme mit einem Grafikprogramm namens "Paint".
Aber gut, das ist ja nu klar. Verschwindet der Fehler, nachdem du die Koordinaten ersetzt hast?

Ah! Sieh mal:
java Code:
  1. g.drawLine((int)border.getX1(),
  2.                        (int)border.getY&#91;b&#93;2&#91;/b&#93;(),
  3.                        (int)border.getX2(),
  4.                        (int)border.getY2());
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2006, 15:34 Nach oben    #11
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

*kopfklatsch* ... heute binsch aber net gut drauf ... ..
Dankö ..
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Vokabeltrainer asenodin Allgemeine Java-Programmierung 9 28.05.2006 21:04
Problem mit Zugriff von externer class auf Panel Treter_Peter Desktop-Applikationen und Grafik 2 24.12.2004 13:22
mit Graphics Zeichnen in einer untergeordneten Klasse bluelight Desktop-Applikationen und Grafik 2 08.12.2004 22:23
Auf ein Canvas Objekt per Mouseevents Linien Zeichnen schärple Desktop-Applikationen und Grafik 6 12.06.2004 17:42


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:12 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44