tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
474
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    simon1389 simon1389 ist offline Rookie
    Registriert seit
    Dec 2010
    Beiträge
    7
    Hallo miteinander

    Bin jetzt seit 3 oder 4 Tagen am googeln und suchen.. komme aber auf keinen wirklich grünen Zweig.

    Das Problem:
    Ich hab ein Programm mit einer unter Umständen ziemlich großen Zeichenfläche (JPanel). Dadrauf werden Objekte als Shapes gezeichnet.
    Diese Objekte kann ich jetzt per Knopfdruck an einem Raster ausrichten.
    Jetzt möchte ich in dieser Zeichenfläche das Raster allerdings auch sichtbar machen, also die Gitternetzlinien zeichnen.
    Bei einer kleinen Zeichenfläche ist das noch nicht weiter schlimm und geht recht flüssig.

    Das Problem kommt wenn meine Zeichenfläche sehr groß wird. Dann muss ich ja auch bei jedem paintComponent aufruf (die ich überschrieben habe) die Gitternetzlinien neu zeichnen (zb wenn man zoomt oder Objekte aus der Zeichenfläche rausschiebt und diese dann vergrößert werden muss)). Anfangs hatte ich das noch ziemlich bescheuert in zwei while-Schleifen direkt in der paintComponent gemacht.. Bin jetzt aber schon soweit, dass ich immer wenn eine Neuzeichnung des Raster notwendig ist, das in BufferedImage zeichne und dann nurnoch das BufferedImage in der paintComponent zeichnen lasse.
    Geht schon wesentlich besser, allerdings immernoch nicht ganz zufriedenstellend.
    Das ist die Methode, in der das Raster in ein BufferedImage gezeichnet wird die wiegesagt beim zoomen und verschieben von Elementen aufgerufen wird (Unter Umständen auch beim hinzufügen von Elementen, weil diese aus der Zeichenfläche rausragen):

    Code :
    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
    
    public void paintRasterToImage() {
            if (refreshRaster) {
            raster = new BufferedImage(Math.max(800, Math.max(this.getWidth(),
                    (int) this.getVisibleRect().getWidth())),
                    Math.max(800, Math.max(this.getHeight(), (int) this
                            .getVisibleRect().getHeight())),
                    BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = raster.createGraphics();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
     
            int pictureWidth = raster.getWidth();
            int pictureHeight = raster.getHeight();
     
            int counter = 1;
            g2d.setColor(Color.white);
            g2d.fillRect(0, 0, pictureWidth, pictureHeight);
            g2d.setColor(Color.black);
            g2d.scale(tabPane.getZoomFactor(), tabPane.getZoomFactor());
            g2d.setStroke(s3);
            while (counter
                    * (tabPane.getZoomFactor() * UtilityViewConstants.RASTER_SIZE) < pictureWidth) {
                g2d.drawLine(counter * UtilityViewConstants.RASTER_SIZE, 0, counter
                        * UtilityViewConstants.RASTER_SIZE,
                        (int) (pictureHeight / tabPane.getZoomFactor()));
                counter++;
            }
     
            counter = 1;
            while (counter
                    * (tabPane.getZoomFactor() * UtilityViewConstants.RASTER_SIZE) < pictureHeight) {
                g2d.drawLine(0, counter * UtilityViewConstants.RASTER_SIZE,
                        (int) (pictureWidth / tabPane.getZoomFactor()), counter
                                * UtilityViewConstants.RASTER_SIZE);
                counter++;
            }
            g2d.dispose();
            }
        }

    In den while-Schleifen rechne ich mir nur aus wieviele Linien ich zeichnen muss und wie lang die werden müssen

    Hab schon versucht das Weichzeichnen rauszulassen. Das bringt aber auch keine Verbesserung...
    Das Problem ist einfach gesagt, dass ich nicht am Anfang ein großes Image erzeugen kann, weil selbst dieses große Image dann unter Umständen irgendwann zu klein wird
    Zoomen tu ich einfach nur über die scale-Methode von Graphics2D direkt in der paintComponent.. (falls das wichtig ist)

    Ich denke dass es da doch irgendeine einfachere Lösung geben muss für sein ein "banales" Problem?

    Ich hoffe ihr könnt mir einen Tipp geben

    LG
     

  2. #2
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hi,

    also wenn das Raster nicht all zu "schön" aussehen muss, kannst du prinzipiell alle RenderingHint-Optionen auf ein Minimum runter stellen. Dann geht das zeichnen um einiges schneller.
    Wenn du das Raster aber schon in ein Image reinmalst, kannst du doch auch gleich das Image nehmen und da ranzoomen. Dann brauchst du das Raster nur einmal - evtl. auch auf voller Qualität - zeichnen lassen und kannst das immer wieder her nehmen.

    Gruß

    Fabio
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

Ähnliche Themen

  1. Bei "Line"-Befehl Balken mit Umrandung zeichnen
    Von Black-Zero im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 29.10.08, 23:39
  2. Antworten: 2
    Letzter Beitrag: 23.04.06, 18:50
  3. Visual C++ Express Edition großes Problem mit "mmsystem.h"
    Von stimon im Forum VisualStudio & MFC
    Antworten: 3
    Letzter Beitrag: 20.12.05, 18:02
  4. richtiges Zeichnen der Buttons in einem "geskinnten" Dialog
    Von EriFo im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 27.05.05, 23:41

Stichworte