Zum Inhalt springen

Probleme mit Komponente setDoubleBuffered


Empfohlene Beiträge

Geschrieben

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

Geschrieben

Ich wurde von anderen drauf aufmerksam gemacht...

Komischerweise lief es ja noch bis zum vorletzten Update.

Ich werde später mal Teile des Sources hier reinsetzen. Vielleicht fällt ja jemandem etwas auf.

Geschrieben

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.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...