2009-09-14 7 views
0

Y at-il un truc pour appeler JFrame.setGlassPane(Component) plus d'une fois? Dans le code ci-dessous, je l'appelle d'abord pour créer une boîte rouge dans la vitre. Cela fonctionne bien. Puis, dans un gestionnaire de clic de souris, je l'appelle à nouveau pour créer une boîte bleue dans un nouveau volet en verre. Cela ne fonctionne pas. La vitre rouge d'origine disparaît, mais la vitre bleue n'apparaît pas. Qu'est-ce que je fais mal ici?Appeler JFrame.setGlassPane (Component) plusieurs fois

public class GlassPaneProblem extends Component { 

    private BufferedImage img; 
    private JFrame f; 

    public void paint(Graphics g) { 
     g.drawImage(img, 0, 0, null); 
    } 

    public GlassPaneProblem() { 
     try { 
      img = ImageIO.read(new File("images/AppleCorps.JPG")); 
     } catch (IOException e) { 
     } 
     this.addMouseListener(new MouseAdapter() { 
      public void mouseClicked(MouseEvent e) { 
       BlueGlassPane blueGlassPane = new BlueGlassPane(); 
       setTheGlassPane(blueGlassPane); 
      } 
     }); 
    } 

    public Dimension getPreferredSize() { 
     if (img == null) { 
      return new Dimension(100, 100); 
     } else { 
      return new Dimension(img.getWidth(null), img.getHeight(null)); 
     } 
    } 

    public void run() { 
     f = new JFrame("Glass Pane Problem"); 

     f.add(this); 
     f.pack(); 
     RedGlassPane redGlassPane = new RedGlassPane(); 
     setTheGlassPane(redGlassPane); 
     f.setVisible(true); 
    } 

    void setTheGlassPane(JComponent glassPane) { 
     f.setGlassPane(glassPane); 
     f.getGlassPane().setVisible(true); 
    } 

    public static void main(String[] args) { 
     GlassPaneProblem glassPaneProblem = new GlassPaneProblem(); 
     glassPaneProblem.run(); 
    } 
} 

class RedGlassPane extends JComponent { 
    protected void paintComponent(Graphics g) { 
     Rectangle clip = g.getClipBounds(); 
     g.setColor(Color.RED); 
     g.fillRect(clip.x + clip.width/3, clip.y + clip.height/3, 
      clip.width/3, clip.height/3); 
    } 
} 

class BlueGlassPane extends JComponent { 
    protected void paintComponent(Graphics g) { 
     Rectangle clip = g.getClipBounds(); 
     g.setColor(Color.BLUE); 
     g.fillRect(clip.x + clip.width/3, clip.y + clip.height/3, 
      clip.width/3, clip.height/3); 
    } 
} 

Appel repaint() comme cela ne résout pas le problème:

void setTheGlassPane(JComponent glassPane) { 
    f.setGlassPane(glassPane); 
    f.getGlassPane().setVisible(true); 
    f.repaint(); 
} 
+2

avez-vous essayez d'appeler manuellement valider ou de repeindre sur le composant? – clamp

+0

Wow, validez() travaillé! Merci! (Repaint() n'a pas fonctionné pour ce que ça vaut.) –

Répondre

1

Dans setTheGlassPane(), ajoutez la première ligne:

f.getGlassPane().setVisible(false); 
Questions connexes