2016-02-19 5 views
0

J'ai eu du mal à faire en sorte que le composant de peinture dessine quoi que ce soit sur le troisième écran. Je l'ai testé avec cette simple quantité de code et j'ai trouvé une chose. Si je place les coordonnées à 0,0 pour le rectangle alors un petit point apparaît au milieu de l'écran à une fraction de la taille qu'il devrait être.JPanel n'affiche pas paintComponent lors de l'utilisation de cardLayout

import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Toolkit; 
import java.awt.event.*; 
import java.util.Random; 
import javax.swing.*; 

public class hello extends JPanel { 
    public int[][] room = new int[20][20];// Whether the room is solid or hollow 

    public static Random r = new Random(); 
    boolean toggle, GameEnable; 
    int i, j, px, py, temp, endx, endy; 
    private static final long serialVersionUID = 1L; 
    JFrame f = new JFrame("Maze Game"); 

    JPanel p0 = new JPanel(); 
    JPanel p1 = new JPanel(); 
    JPanel p2 = new JPanel(); 
    JPanel p3 = new JPanel(); 
    JPanel p4 = new JPanel(); 

    JButton b1 = new JButton("Screen 2"); 
    JButton b2 = new JButton("Give Visuals"); 

    CardLayout cl = new CardLayout(); 
    public void Game() { 
     p0.setLayout(cl); 

     p1.add(b1); 
     p2.add(b2); 
     p3.add(new GameVisual()); 
     p1.setBackground(Color.RED); 
     p2.setBackground(Color.BLACK); 
     p4.setBackground(Color.PINK); 

     p0.add(p1, "1"); 
     p0.add(b2, "2"); 
     p0.add(p3, "3"); 
     p0.add(p4, "4"); 
     cl.show(p0, "1"); 

     final Timer timer = new Timer(10 * 60 * 1000, new ActionListener() { 
      public void actionPerformed(final ActionEvent e) { 
       cl.show(p0, "4"); 
      } 
     }); 

     b1.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       cl.show(p0, "2"); 
      } 
     }); 
     b2.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       cl.show(p0, "3"); 
       timer.start(); 
      } 
     }); 

     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(816, 816); 
     f.setVisible(true); 
     f.setLocationRelativeTo(null); 
     f.add(p0); 
     timer.start(); 
    } 

    class GameVisual extends JPanel { //This is a sub class not a separate class file 
     private static final long serialVersionUID = 2L; 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.BLUE); 
      g.fillRect(10,10, 400, 400); 
     } 
    } 

    public static void main(String[] args) { 
     new hello().Game(); 
    } 
} 

Alors ma question est pourquoi est mon paintComponent pas apearing l'écran (ou en montrant à la fraction de la taille au mauvais endroit et comment puis-je résoudre ce problème. PS si possible je voudrais tout garder dans la même classe plutôt que de les mettre dans des classes séparées comme j'utilise un tableau pour faire la majorité de ma peinture dans la plus grande version de ce code

Répondre

1

D'abord, je pense que vous voulez ajouter p2 à p0 (pas b2) :

p0.add(p2, "2"); 

Deuxièmement, si vous voulez voir le rectangle plein, vous pouvez le faire:

GameVisual gv = new GameVisual(); 
gv.setPreferredSize(new Dimension(500,500)); 
p3.add(gv); 

Cependant, comme vous ajoutez des composants à GameVisual, il se réajustera ces composants. Alors peut-être que vous ne devriez pas définir la taille préférée.

+0

ah ok, donc quand il arrive au troisième écran, il va redimensionner l'écran pour s'adapter au visuel? Est-ce que je le comprends correctement? – MrFAYAZ666

+0

Oui. En tant que test, n'utilisez pas la méthode setPreferredSize() indiquée ci-dessus. Au lieu de cela, ajoutez simplement des composants à GameVisual. Vous verrez le rectangle bleu se développer, car le JPanel doit grandir pour s'adapter aux composants. Je ne sais pas à quoi votre dernier panneau GameVisual est censé ressembler, mais il va grandir pour s'adapter aux composants que vous y ajoutez. –