2010-10-06 8 views
1

J'ai un JInternalFrame auquel j'applique une interface utilisateur personnalisée. L'interface utilisateur peint le composant, mais lorsque j'ajoute un JPanel au JInternalFrame, il n'apparaît pas. Je pense que l'interface utilisateur est douloureuse sur l'ensemble du composant, mais comment puis-je peindre l'interface utilisateur puis peindre les composants?Problème de peinture de l'interface utilisateur personnalisée

Mais si quelqu'un a une meilleure façon de le faire, s'il vous plaît faites le moi savoir! Merci!

public class ClassInternalFrame extends JInternalFrame { 
    public static Color currentColor; 
    public static final Color CLASS_TYPE = new Color(148, 227, 251); 

    public ClassInternalFrame(String title, Color classType) { 
     super(title, true, true, false, true); 
     currentColor = classType; 
     super.setUI(new ClassFrameUI()); 

     Container pane = super.getContentPane(); 
     pane.setLayout(new BorderLayout()); 

     JPanel titlePanel = new JPanel(); 
     titlePanel.setPreferredSize(new Dimension(0, 20)); 
     pane.add(titlePanel, BorderLayout.NORTH); 

     titlePanel.setBorder(new MatteBorder(1, 1, 1, 1, Color.yellow)); 
    } 

} 

class ClassFrameUI extends InternalFrameUI { 
    private final static ClassFrameUI frmUI = new ClassFrameUI(); 

    public static ComponentUI createUI(JComponent c) { 
     return frmUI; 
    } 

    @Override 
    public void paint(Graphics g, JComponent c) 
    { 
     Graphics2D g2d = (Graphics2D) g; 

     g2d.setColor(Color.LIGHT_GRAY); 
     g2d.fillRect(0, 0, c.getWidth(), c.getHeight()); 

     g2d.setColor(ClassInternalFrame.currentColor); 
     g2d.fillRect(0, 0, c.getWidth(), 20); 

     g2d.setColor(Color.DARK_GRAY); 
     g2d.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[] { 1, 0 }, 0)); 
     g2d.drawRect(0, 0, c.getWidth()-1, c.getHeight()-1); 
     g2d.drawLine(0, 20, c.getWidth(), 20); 


    } 
} 

Répondre

2

Le problème est que vous ne peignez sur quoi que ce soit, mais que InternalFrameUI ne fait absolument rien (si elle l'a fait, vous auriez besoin aussi d'appeler super.paint(g, c);). Normalement, la peinture des composants est effectuée par une sous-classe telle que BasicInternalFrameUI. Il semble que vous essayez de peindre une barre de titre personnalisée, une tâche que BasicInternalFrameUI délègue à BasicInternalFrameTitleBar.