dessin de rectangles simples sur un Jframe en java


J'étends JFrame comme ceci:

public GameFrame() {
    this.setBounds(30, 30, 500, 500);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    initializeSquares();
}

private void initializeSquares(){
    for(int i = 0; i < 5; i++){
        this.getContentPane().add(new Square(i*10, i*10, 100, 100));
    }
    this.setVisible(true);
}

Toutefois, un seul carré est dessiné à l'écran, quelqu'un sait pourquoi?

Aussi ma classe Carrée ressemble à ceci:

private int x;
private int y;
private int width;
private int height;
public Square(int x, int y, int width, int height){
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawRect(x, y, width, height);
}
Author: mKorbel, 0000-00-00

3 answers

ContentPane du JFrame utilise BorderLayout par défaut. Lorsque vous lui ajoutez un carré, il est ajouté par défaut BorderLayout.CENTRE et couvre tous les carrés précédemment ajoutés. Vous voudrez lire sur tous les gestionnaires de mise en page disponibles pour Swing GUI.

Par exemple, commencez ici: Disposition des composants dans un conteneur

, Mais cela dit, je ferais les choses différemment. Je créerais juste un JPanel et le rendrais capable de peindre plusieurs carrés. Exemple quelque chose comme ça:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

public class GameFrame extends JFrame {
   public GameFrame() {
      super("Game Frame");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      Squares squares = new Squares();
      getContentPane().add(squares);
      for (int i = 0; i < 15; i++) {
         squares.addSquare(i * 10, i * 10, 100, 100);
      }

      pack();
      setLocationRelativeTo(null);
      setVisible(true);

   }

   public static void main(String[] args) {
      new GameFrame();
   }

}

class Squares extends JPanel {
   private static final int PREF_W = 500;
   private static final int PREF_H = PREF_W;
   private List<Rectangle> squares = new ArrayList<Rectangle>();

   public void addSquare(int x, int y, int width, int height) {
      Rectangle rect = new Rectangle(x, y, width, height);
      squares.add(rect);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      for (Rectangle rect : squares) {
         g2.draw(rect);
      }
   }

}
 12
Author: Hovercraft Full Of Eels, 2012-03-15 03:20:26

Pour le positionnement absolu, appelez setLayout(null). Ensuite, les icônes seront dessinées à la position renvoyée par leur méthode getLocation (), vous pouvez donc appeler setLocation() en premier.

 1
Author: Jakub Zaverka, 2012-03-15 03:20:41

Même si j'avais un problème lors de l'affichage de plusieurs rectangles sur un jframe avec une disposition absolue, c'est-à-dire une disposition définie sur null.

JFrame frame = new JFrame("hello");
frame.setLayout(null);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setSize(600, 600);
frame.getContentPane().setBackground(Color.red);
frame.getContentPane().add(new Square(10,10,100,100));//My rectangle class is similar to the Square mentioned in the question and it extends JComponent.

J'avais toujours des problèmes car le rectangle n'était pas affiché.Sauf si vous définissez explicitement les limites sur le carré (JComponent), cela ne fonctionnera pas.Même si le Carré a l'emplacement passé dans le constructeur ,setbounds a seulement corrigé le issue.So le ci-dessous a résolu le problème et ce problème concerne un jframe de mise en page absolue.

Square square = new Square(10,10,100,100);
square.setBounds(10,10,100,100);
frame.getContentPane().add(square);
 0
Author: crackerplace, 2016-03-01 17:34:48