2017-09-04 6 views
0

Je crée un JFrame et dessine un rectangle dessus. Ça ne marche pas, parfois c'est complètement noir et parfois complètement blanc, voici mes méthodes. Par conséquent, la méthode de rendu est appelée deux fois car, la première fois qu'elle crée le tampon, ignore également le framerate, elle est irrelavée en ce moment.Ce code n'affichera pas un rectangle, mais il devrait

Edit1: J'ai résolu un problème: Il dessine un rectangle maintenant, mais parfois il affiche simplement un écran blanc. Je ai encore besoin de résoudre ce problème

Edit2: Je ne cherche pas seulement la solution, je cherche aussi la raison pour laquelle mon problème se produit, donc je ne suis pas seulement écrire aveuglément le code.

public MyFrame(String title,int width,int height) 
    { 
     super(title); 
     this.setSize(width,height); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setLocationRelativeTo(null); 
     this.setUndecorated(true); 
     this.addKeyListener(new KeyInput()); 
     this.setVisible(true); 
    } 
    public void draw(Graphics2D g,int arg) 
    { 
     g.setColor(new Color(0,0,0,255)); 
     g.fillRect(0,0,SIZE,SIZE); 
     g.setColor(new Color(255,255,255)); 
     g.fillRect(0,0,50,50); 
    } 
    public void render(int arg) 
    { 
     BufferStrategy bs=this.getBufferStrategy(); 
     if(null==bs) 
     { 
      this.createBufferStrategy(3); 
     } 
     else 
     { 
      Graphics2D g=(Graphics2D)bs.getDrawGraphics(); 
      g.setColor(new Color(0,0,0,255)); 
      g.fillRect(0,0,this.getWidth(),this.getHeight()); 
      BufferedImage canvas=new BufferedImage(SIZE,SIZE,2); 
      int s=Math.min(this.getWidth(),this.getHeight()); 
      g.drawImage(canvas,(this.getWidth()-s)/2,(this.getHeight()-s)/2,s,s,this); 
      Graphics2D g2=canvas.createGraphics(); 
      this.draw(g2,arg); 
      bs.show(); 
      g.dispose(); 
      g2.dispose(); 
     } 
    } 
    public static void main(String[] args) 
    { 
     Dimension d=Toolkit.getDefaultToolkit().getScreenSize(); 
     FRAME=new MyFrame("Insert name here!",d.width,d.height,1); 
     FRAME.render(0); 
     FRAME.render(0); 
    } 

Modifier: ce n'est plus nécessaire, j'ai réussi à résoudre le problème, merci pour votre aide de toute façon.

+2

1) * "INSERT_FRAME_NAME_HERE" * Cela ne devrait pas non plus être le cas. Veuillez apprendre la nomenclature Java courante (conventions de nommage - par exemple 'EachWordUpperCaseClass',' firstWordLowerCaseMethod() ',' firstWordLowerCaseAttribute' sauf s'il s'agit d'une 'UPPER_CASE_CONSTANT') et l'utiliser de manière cohérente. Même dans l'exemple de code. 2) Pour une meilleure assistance plus tôt, postez un [MCVE] ou [Short, Self Contained, Example correct] (http://www.sscce.org/). –

+0

Ok, je vais le changer. –

+2

S'il vous plaît consulter: [Leçon: Performing Custom Painting] (http://docs.oracle.com/javase/tutorial/uiswing/painting/index.html): tutoriel d'introduction aux graphiques Swing –

Répondre

1

Toutes les informations dont vous avez besoin peuvent être trouvées dans le tutorial Aéroglisseur suggéré.
Le code suivant illustre le dessin d'un rectangle noir d'un JFrame plein écran, avec quelques informations supplémentaires sur mcve.

import java.awt.Color; //mcve should include imports 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Toolkit; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class MyFrame extends JFrame{ 

    public MyFrame() 
    { 
     super(); 
     //this.setSize(width,height); use : 
     setExtendedState(JFrame.MAXIMIZED_BOTH); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //comment 1 : see http://docs.oracle.com/javase/tutorial/uiswing/painting/index.html 
     //as Hovercraft suggested 
     JPanel customJPanel = new MyPanel(); 
     add(customJPanel); 

     // not needed to demonstrate the issue. Remove to make mcve 
     /* 
     this.setLocationRelativeTo(null); 
     this.setUndecorated(true); also removes frame title 
     this.addKeyListener(new KeyInput()); 
     */ 
     pack(); 
     setVisible(true); 
    } 

    //comment 1 
    class MyPanel extends JPanel { 

     public MyPanel() { super(); } 

     @Override 
     public void paintComponent(Graphics g) { 

      super.paintComponent(g); 

      int x = getRectangleXpos();   //if postion and/or size 
      int y = getRectangleYPos();   //do not change, no need to 
      int width = getRectangleWidth(); //recalculate : move from this method 
      int height = getRectangleHeight(); 
      g.drawRect(x, y , width,height); 
      g.setColor(Color.BLACK); 
      g.fillRect(x, y , width,height); 
     } 

     private int getRectangleXpos() { 
      //apply calculation logic if needed 
      return 200; 
     } 

     private int getRectangleYPos() { 
      //apply calculation logic if needed 
      return 300; 
     } 

     private int getRectangleWidth() { 
      //apply calculation logic if needed 
      return 500; 
     } 

     private int getRectangleHeight() { 
      //apply calculation logic if needed 
      return 400; 
     } 
    } 

    public static void main(String[] args) 
    { 
     //compilation error: The constructor MyFrame(String, int, int, int) is undefined 
     //new MyFrame("Insert name here!",d.width,d.height,1); 

     //comment 1 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new MyFrame(); 
      } 
     }); 
    } 
} 
+0

Merci, je vais certainement essayer le JPanel parfois. Bien que j'ai encore besoin de savoir pourquoi cela se passe dans JFrame. –