2010-05-06 11 views
13

Come discusso here, durante il ridimensionamento di un'applicazione Swing in Vista (e Windows 7, che è quello che sto usando) si ottiene uno sfondo nero nell'angolo in basso a destra mentre il ridisegno di Swing raggiunge i cambiamenti.Modifica del colore di sfondo sottostante di una finestra altalena

Giocare con altre applicazioni (Windows Explorer (Nativo), Firefox (C++?) Ed Eclipse (Java)) Ho notato che hanno tutti lo stesso problema - contrariamente a quello che dicono i colleghi sopra - ma loro minimizza il problema avendo un colore di riempimento grigio, che è molto meno visivamente più scomposto del nero che appare in Swing.

Mi chiedo se c'è un modo per cambiare questo in modo che Swing si comporti come queste altre applicazioni? Ho provato a impostare il colore di sfondo di JFrame, ma senza risultato.

Altre Informazioni Jonas scoperto (vedi la loro risposta informativa qui di seguito) che questo è un problema con JFrames, ma non AWT Frames - forse che aiuterà qualcuno questo numero.

+0

si può dare un frammento di codice veloce? – bragboy

+0

@Bragaadeesh: è possibile eseguire il codice nella mia risposta. – Jonas

+0

@Jonas: Sì, è un po 'strano, ho lavorato così a lungo con Swings, ma non l'ho notato. Penso di avere uno o due supplenti, proverò a fare qualcosa su questo problema. Bella domanda, tra l'altro +1 – bragboy

risposta

3

Ho notato lo stesso problema. Questo colore è grigio a IE, in Opera è nero e in Eclipse è grigio. Si cucisce per essere più visibile in Swing, perché la cucitura è leggermente più lenta per ridipingere e il colore è come hai detto, nero. Questo problema è più visibile se si utilizza l'angolo in alto a sinistra per ridimensionare.

Ho codificato un esempio e ho cercato di capire dove si definisce questo colore nero. A JFrame has many layers, quindi ho impostato uno sfondo diverso su ogni livello.

import java.awt.Color; 
import javax.swing.JFrame; 

public class BFrame { 

    public static void main(String[] args) { 
     new JFrame() {{ 
      super.setBackground(Color.CYAN); 
      this.getRootPane().setBackground(Color.BLUE); 
      this.getLayeredPane().setBackground(Color.RED); 
      this.getContentPane().setBackground(Color.YELLOW); 
      this.setSize(400,340); 
      this.setVisible(true); 
     }}; 
    } 
} 

Ma questo esempio non ha aiutato. E forse il colore è impostato da una superclasse a Frame.

java.lang.Object 
    java.awt.Component 
     java.awt.Container 
      java.awt.Window 
       java.awt.Frame 

mio Teoria è che, dal momento che si dipinge swing, ma utilizza una finestra nativa, allora è lo sfondo nativo dipinta prima del ridimensionamento, e lo sfondo di Swing è dipinto dopo il ridimensionamento. Ma per le applicazioni native, lo sfondo viene dipinto prima del ridimensionamento.

UPDATE: ho provato con un Frame ora, e non sta avendo lo stesso problema. La cucitura di sfondo da dipingere prima del ridimensionamento.

import java.awt.Color; 
import java.awt.Frame; 

public class B2Frame extends Frame { 

    public static void main(String[] args) { 
     new Frame() {{ 
      setBackground(Color.YELLOW); 
      setSize(400,340); 
      setVisible(true); 
     }}; 
    } 

} 
+0

Grazie per la risposta dettagliata, e provando tutte queste cose. Mi chiedo perché la differenza, e se c'è un modo per risolverlo. Mi chiedo se non c'è nemmeno un modo per impostare il colore del JFame stesso (al contrario di getContentPane(), l'unico che sembra fare qualsiasi cosa). Ho appena provato ad ottenere l'oggetto grafico di JFrame e ad impostarne il colore, ma anche questo non ha funzionato. Qualche idea su dove è impostato lo sfondo grigio predefinito? Forse questo ha qualcosa a che fare con questo. – dimo414

+0

@ dimo414: Il grigio predefinito è impostato in JFrame: http://fuseyism.com/classpath/doc/javax/swing/JFrame-source.html con 'setBackground (UIManager.getDefaults(). GetColor (" control ")) ; ' – Jonas

+0

@ dimo414: è possibile eliminare questo problema se si salta la barra del titolo e il bordo nativi. Vedi la mia domanda e risposta a: http://stackoverflow.com/questions/2780780/how-to-add-support-for-resizing-when-using-an-undecorated-jframe/2781132#2781132 – Jonas

1

Ho notato anche questo. Per me questo problema è stato risolto cambiando il layout manager (ho usato Free Form Layout prima) e ha funzionato molto bene (color painting di sistema).

Ma alla fine sono tornato a FFL. Anche alcune applicazioni ben conosciute affrontano questo problema (ad esempio SKYPE), ma in realtà non mi dispiace ...

+0

Hai un collegamento a "Layout modulo libero"? – Jonas

+0

È il layout predefinito nel builder NetBeans (di cui ho fatto la maggior parte delle app di Swing) ... – Xorty

2

Il telaio è responsabile della colorazione dello sfondo, quindi è necessario assicurarsi di lasciare che faccia il suo lavoro.

È dimostrano impostando:

System.setProperty("sun.awt.noerasebackground", "true"); 

questo farà sì che lo sfondo di essere sempre nero su espansioni di ridimensionamento. (Quindi non farlo.)

Di seguito ha lavorato per me:

  1. (AWT solo) istituito il doppio buffer utilizzando createBufferStrategy(2) - avvolto in addNotify() altrimenti si incorrerà in eccezioni durante la creazione del telaio

    (Fase 1 è necessario solo in AWT come swing è doppio buffer per impostazione predefinita.)

  2. sempre (importante) chiamare super() nel Frame.paint() implementazione

  3. impostare il colore di sfondo con setBackground() poi lo sfondo dovrebbe essere sempre lo stesso colore quando espandere la cornice

codice di esempio:

class InnerFrame extends Frame { 
     public void addNotify() { 
      super.addNotify(); 
      // Buffer 
      createBufferStrategy(2);   
      strategy = getBufferStrategy(); 
     } 

     public void paint(Graphics g) { 
      super(g); 
      //... 
     } 
     //... 
    } 
+0

Interessante, grazie. Cercherò di approfondire la prossima volta che sto lavorando a uno dei miei progetti Swing. – dimo414

+0

Ho anche scoperto che l'aggiunta di un ComponentListener al figlio primario di un Frame sembra essere di grande aiuto con i problemi di ridimensionamento (aggiunti alla risposta originale). –

+0

Aggiornato con una soluzione basata sulla correzione degli ultimi mesi –