2013-04-01 1 views
0

J'essaie d'ajouter un cadre jinternelle à un cadre qui est en mode exclusif plein écran. Cependant quand je l'ajoute, il remplit tout l'écran avec du blanc. Voici mon code. Si quelqu'un sait comment faire cela correctement s'il vous plaît le poster, ou dites-moi ce que je fais mal.Ajout de JInternalFrame à la trame fsem

Détails

OS: Windows 7

JDK: 1.7.0_11 jdk

IDE: Eclipse

J'utilise un panneau sur le JFrame, et je dessine sur le panneau

code peinture

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 

    for(int i = 0; i<1000; i++) 
     g.drawImage(bi, i*bi.getWidth()-getXs(), 0, bi.getWidth(), Main.HEIGHT, null); 

    g.setColor(Color.WHITE); 

    for(int x = 0; x<Main.X_TILES; x++) 
    { 
     for(int y = 0; y<Main.Y_TILES; y++) 
     { 
      Block block = map[x][y]; 

      if(block!=null && x*Block.WIDTH>=xs-Block.WIDTH && x*Block.WIDTH<=xs+Main.WIDTH) 
       g.drawImage(block.getImage(x,y), x*Block.WIDTH-getXs(), y*Block.HEIGHT, Block.WIDTH, Block.HEIGHT, null); 
     } 
    } 

    for(Entity entity : entities) 
    { 
     if(entity!=null && entity.getX()>=xs-Block.WIDTH && entity.getX()<=xs+Main.WIDTH) 
      g.drawImage(entity.getImage(), entity.getX()-getXs(), entity.getY(), entity.getWidth(), entity.getHeight(), null); 
    } 

    if(displayDebug) 
    { 
     g.drawString("Free memory "+Runtime.getRuntime().freeMemory()/1024+" KB", 10, 12); 
     g.drawString("Total memory "+Runtime.getRuntime().totalMemory()/1024+" KB", 10, 24); 
     g.drawString("Max memory "+Runtime.getRuntime().maxMemory()/1024+" KB", 10, 36); 
     g.drawString("X "+character.getX(), 10, 48); 
     g.drawString("Y "+character.getY(), 10, 60); 
     g.drawString("XS "+xs, 10, 72); 
    } 

    g.setColor(Color.BLACK); 
    g.drawString("Life "+character.getHealth(), 700, 12); 
    g.dispose(); 
} 

J'ai vu une réponse à une question similaire JInternalFrame in full-screen mode qui dit de le mettre directement sur le panneau mais j'ai essayé et cela ne fonctionnait toujours pas. EDIT: Quand j'ai commenté mon code de peinture, et je l'ai ajouté directement au panneau à la place il a fonctionné, mais il ne traînait pas, donc ma nouvelle question est de savoir comment faire apparaître quand un travail de peinture est être fait. Est-ce un moyen de dessiner un composant sur l'utilisation de composants de peinture? Pour des raisons de clarté, cela ne fonctionnait toujours pas lorsqu'il était ajouté au panneau sans le code de peinture.

+1

Je ne conteste pas obtenir l'exemple de travailler, sauf le redimensionnement ou déplacer le cadre interne. Quel OS et JDK exécutez-vous sous – MadProgrammer

+0

windows 7 jdk 1.7.0_11 –

+0

Si vous faites de la peinture personnalisée, vous avez besoin de présenter est en dehors de votre exemple ainsi – MadProgrammer

Répondre

1

Vous dites que vous ajoutez un JPanel (2ème extrait de code) à votre image, mais en fait vous remplacez tout le contenu de votre cadre avec le JDesktopPane dans cette ligne:

f.setContentPane(pane); 

donc à moins que vous ajoutez votre panneau de jeu (celui avec la méthode paintComponent surchargée) quelque part sur le volet de verre du cadre ou quelque chose d'étrange, il ne sera jamais affiché, puisque le JDesktopPane (et le JInternalFrame que vous ajoutez) sont les seuls composants sur le cadre point.

En outre, pour être complet, vous devez déplacer votre setVisible (true) invocation à la fin de l'initialisation (à savoir après createFrame(f);) et supprimer complètement l'appel de disposer() dans votre méthode de paintComponent (g.dispose();). Au moins c'est ce que j'imagine en cours, essayez de poster un exemple plus concis et autonome qui présente le problème que vous rencontrez si cela n'aide pas.

Voici un exemple modifié qui affiche des graphiques personnalisés (juste texte dans ce cas) et un JInternalFrame dans le même composant plein écran:

public class FrameTest { 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     f.setTitle("Platform Game"); 
     f.setLocationRelativeTo(null); 
     f.setUndecorated(true); 
     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     GraphicsDevice gs = ge.getDefaultScreenDevice(); 
     gs.setFullScreenWindow(f); 

     JDesktopPane pane = new MyPanel(); 
     JInternalFrame frame = new JInternalFrame("Options", false, true, false, false); 
     frame.setVisible(true); 
     frame.setSize(100, 100); 
     frame.setLocation(10, 10); 
     pane.add(frame); 
     f.setContentPane(pane); 

     f.setVisible(true); 
    } 

    private static class MyPanel extends JDesktopPane { 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      g.setColor(Color.BLACK); 

      g.drawString("Free memory " + Runtime.getRuntime().freeMemory()/1024 + " KB", 10, 12); 
      g.drawString("Total memory " + Runtime.getRuntime().totalMemory()/1024 + " KB", 10, 24); 
      g.drawString("Max memory " + Runtime.getRuntime().maxMemory()/1024 + " KB", 10, 36); 
     } 
    } 
} 
+0

j'ai essayé de le faire mais je ne sais pas comment ajouter le panneau et le cadre interne en même temps. –

+0

@JoshSobel par exemple, au lieu d'étendre votre "Game Panel" de JPanel, étendez-vous de JDesktopPane afin d'utiliser le même composant pour votre peinture personnalisée et JInternalFrame.OU, puisque JDesktopPane étend JLayeredPane, utilisez son mécanisme pour ajouter votre panneau personnalisé à un calque inférieur au calque par défaut. – jkovacs

+0

ill essayer que demain aller au lit maintenant si cela fonctionne mal accepter votre réponse –

Questions connexes