私は次のように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);
}
しかし、画面に描かれている正方形は1つだけですが、その理由を知っている人はいますか?
また、MySquareクラスは次のようになります。
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を使用します。正方形を追加すると、デフォルトでBorderLayout.CENTERが追加され、以前に追加された正方形がすべて隠されます。 SwingGUIで使用できるすべてのレイアウトマネージャーを確認する必要があります。
たとえば、ここから開始します: コンテナ内のコンポーネントのレイアウト
しかし、そうは言っても、私は別のことをするでしょう。 JPanelを1つだけ作成し、複数の正方形をペイントできるようにします。たとえば、次のようなものです。
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);
}
}
}
絶対配置の場合は、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);