рисование простых прямоугольников на Jframe в Java - PullRequest
7 голосов
/ 15 марта 2012

Я расширяю JFrame следующим образом:

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);
}

Однако на экране рисуется только один квадрат, кто-нибудь знает почему?

также класс My Square выглядит следующим образом:

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);
}

Ответы [ 3 ]

12 голосов
/ 15 марта 2012

Панель содержимого JFrame по умолчанию использует BorderLayout. Когда вы добавляете квадрат, он по умолчанию добавляется BorderLayout.CENTER и закрывает все ранее добавленные квадраты. Вы захотите ознакомиться со всеми менеджерами компоновки, доступными для графического интерфейса Swing.

Например, начните здесь: Размещение компонентов в контейнере

Но сказав это, я бы поступил иначе. Я бы создал только один JPanel и смог бы рисовать несколько квадратов. Например что-то вроде этого:

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);
      }
   }

}
1 голос
/ 15 марта 2012

Для абсолютного позиционирования, вызов setLayout (null).Затем значки будут нарисованы в позиции, возвращаемой их методом getLocation (), так что вы можете сначала вызвать setLocation ().

0 голосов
/ 01 марта 2016

Даже у меня возникла проблема при отображении нескольких прямоугольников на jframe с абсолютной разметкой, то есть с разметкой равной нулю.

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.

Тем не менее у меня возникали проблемы, так как прямоугольник не отображался.границы на квадрате (JComponent), он не будет работать. Даже если у квадрата есть местоположение, переданное в конструкторе, setbounds только исправил проблему. Так что ниже решена проблема, и эта проблема для абсолютного макета jframe.

Square square = new Square(10,10,100,100);
square.setBounds(10,10,100,100);
frame.getContentPane().add(square);
...