在java中的Jframe上绘制简单的矩形

我正在扩展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); } 

但是,屏幕上只绘制了一个正方形,有人知道为什么吗?

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

JFrame的contentPane默认使用BorderLayout。 当你向它添加一个Square时,它会默认添加BorderLayout.CENTER并覆盖之前添加的任何Squares。 您将需要阅读Swing GUI所有可用的布局管理器。

例如,从这里开始: 在Container中布置组件

但话说回来,我会以不同的方式做事。 我只创建一个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 squares = new ArrayList(); 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); } } } 

Fo绝对定位,调用setLayout(null)。 然后,图标将在其getLocation()方法返回的位置绘制,因此您可能希望首先调用setLocation()。

甚至在使用绝对布局(即布局设置为null)的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. 

我仍然遇到问题,因为没有显示矩形。除非你在Square(JComponent)上明确设置边界,否则它将无法工作。即使Square在构造函数中传递了位置,setbounds也只修复了问题。所以下面修复了这个问题,这个问题是针对绝对布局的jframe。

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