Zum Inhalt springen

Probleme mit Komponente setDoubleBuffered


Devilmarkus

Empfohlene Beiträge

Hallo zusammen,

nach dem aktuellen JAVA-Update funktioniert bei mir die Methode

this.setDoubleBuffered(true);

nicht mehr.

Ist das ein BUG in der aktuellen Version oder geht das irgendwie zu beheben?

Denn es nervt extrem, wenn die Ausgabe am flimmern ist, und man einzelne Sachen garnicht mehr sieht.

(Den Source nun hier reinkopieren hat, denk ich, wenig Sinn, es ist ein Display, welches ein Image "painted" (g.drawImage...) und über dieses Image andere Sachen pinseln soll, welche neuerdings nur noch flimmern / fast garnicht mehr zu sehen sind)

Bis vor Kurzem hat es noch wunderbar funktioniert.

Seit dem letzten Update wie gesagt nicht mehr.

Wer kann mir hier weiterhelfen?

MfG

Markus

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bug ID: 4967886 Swing should provide full double buffering per window

Du scheinst eine veraltete Java Version einzusetzen, da Du hier ja keine Version nennst

jdk1.6.0_16

(Hatte ich nicht erwähnt: neu installiert heute?)

Ausserdem:

jre1.6.0_15

Edit:

Ich verwende NetBeans 6.7.1

Bearbeitet von Devilmarkus
Link zu diesem Kommentar
Auf anderen Seiten teilen

So nach einem längeren Test habe ich nun herausgefunden:

Bis zum Java 1.6 Update 13 funktioniert es noch.

Ab Java 1.6 Update 14 flimmert es nur noch.

(Gut, dass Sun ältere Versionen parat hat)

Das Display zeigt ein Bild an und aktualisiert bei ca. 50fps.

Über das Bild werden Icons / bzw andere Grafiken/Text gezeichnet.

(Im Idealfall 50fps, ältere PCs zeigen nur weniger an)

Hier Auszüge aus dem Sourcecode:


  public Display() {

      int[] pixelsc = new int[16 * 16];

      imagec = Toolkit.getDefaultToolkit().createImage(

              new MemoryImageSource(16, 16, pixelsc, 0, 16));

      blankCursor =

              Toolkit.getDefaultToolkit().createCustomCursor

              (imagec, new Point(16, 16), "invisibleCursor");

      gunCursor =

              Toolkit.getDefaultToolkit().createCustomCursor

              (lightGun, new Point(16, 16), "gunCursor");

      setCursor(blankCursor);

      enableEvents(AWTEvent.FOCUS_EVENT_MASK);

      setFocusTraversalKeysEnabled(true);

      setRequestFocusEnabled(true);

      setDoubleBuffered(true);

  }

................


  public void updateImage(boolean wait) {

    painted = false;

    if (imageRect.width != 0 && imageRect.height != 0 && isShowing()) {

      raster.setDataElements(0,0,imageWidth,imageHeight,pixels);

      repaint(0,imageRect.x,imageRect.y,imageRect.width,imageRect.height);

      if (wait)

        waitPainted();

    }

  }

.................

  protected void paintImage(Graphics g) {

      if (showfps >=1)

          doTouchFPS();

      if (showfps <=-1 && debug){

          showfps++;

          doTouchFPS();

      }

      if (Switches.bilinear && !lowperformance){

      Graphics2D g2 = (Graphics2D)g;


       g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,

               RenderingHints.VALUE_INTERPOLATION_BILINEAR);

       g = g2;

       }

      if (sourceRect != null){

          g.drawImage(image,imageRect.x,imageRect.y,imageRect.x + imageRect.width,

                  imageRect.y + imageRect.height,sourceRect.x,sourceRect.y,

                  sourceRect.x + sourceRect.width,sourceRect.y + sourceRect.height,null);

      }

      else if (sameSize){

          g.drawImage(image,imageRect.x,imageRect.y,null);

      }

      else

          g.drawImage(image,imageRect.x,imageRect.y,imageRect.width,imageRect.height,null);

      }

      else{

          if (skin == 1)

              g.drawImage(YMmode,imageRect.x,imageRect.y,imageRect.width,imageRect.height,null);

          else {

              g.drawImage(YMmode2,imageRect.x,imageRect.y,imageRect.width,imageRect.height,null);

          }

              if (!lowperformance)

                  paintBalls(g);

      }

................

[Weitere Routinen, wo noch mehr gezeichnet wird]

}


  public void doTouchFPS() {

      long time = System.currentTimeMillis();

      mNextFPS++;

      if (time-mLastFPSTime >= 1000) {

          mCurrFPS = mNextFPS;

          mNextFPS = 0;

          mLastFPSTime = time;

      }

  }


  @Override

  public void paintComponent(Graphics g) {

    if (image != null){

        paintImage(g);

    }

    painted = true;

  }

So in etwa....

(Wer den kompletten Code sehen möchte, bitte melden)

Wie gesagt: ab 1.6 Update 14 flimmert es nur noch.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...