java panel.add_Java Swing Add JPanel to JPanel

The Situation

I am currently trying to build a 2D game with Java's Swing. For this, I have my main class Puzzle which is subclassing JFrame. To my frame I add my main JPanel which consists of several JPanels added together (each of them being a new piece).

EDIT 2: PlayingField is my model which will store the current location of each piece. One can select a piece with the mouse (the plan is to highlight it) and move it with the arrow keys as long as the next step (a full cell, so approx. 100 pixel) isn't the location of one of the other pieces. As of right now, PlayingFielddoes not store any data since the pieces are missing.

private void createAndShowGui() {

// The playing-field with a 4x6 grid.

PlayingField field = new PlayingField(4, 6);

JPanel mainPanel = new ComputerView(field);

setTitle("Puzzle");

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(400, 600);

add(mainPanel);

setVisible(true);

}

The method above will create my frame and adds the main panel. The following method is my main panel which adds several JPanels to itself.

public ComputerView(PlayingField field) {

this.field = field;

this.setLayout(null);

JPanel topLeft = new GamingPiece(PlayingField.TOP_LEFT);

add(topLeft);

JPanel topRight = new GamingPiece(PlayingField.TOP_RIGHT);

add(topRight);

JPanel bottomLeft = new GamingPiece(PlayingField.BOTTOM_LEFT);

add(bottomLeft);

}

Each GamingPiece or rather my sub-JPanels are drawing a basic piece (I only drawing one and rotating the others, since all consists of the same arbitrary shape). The GamingPiece class also subclasses JPanel and invokes the JPanel#paintComponent() method to draw the piece.

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;

g2.setColor(Color.YELLOW);

g2.fillPolygon(pieceX, pieceY, pieceX.length);

}

The Problem And My Questions

Since I am pretty new to Java I really do not know how to do it properly. If I add my pieces by creating a new object and adding it to the main panel, it won't show all of them, only the last one added. Some don't even seem to work, even if they're the only ones added (to explain my situation: I have for pieces which are the same arbitrary shape just rotated differently but using Graphics2D#rotate() doesn't seem to work fine).

I hope I explained my situation and my problem well enough fo you guys to help me. Thanks in advance!

EDIT:

My Codes

Puzzle.java

package programming.schimmler;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.SwingUtilities;

import programming.schimmler.model.PlayingField;

import programming.schimmler.view.ComputerView;

public class Puzzle extends JFrame {

...

Invoking the createAndShowGui()

...

private void createAndShowGui() {

// The playing-field with a 4x6 grid.

PlayingField field = new PlayingField(4, 6);

JPanel mainPanel = new ComputerView(field);

setTitle("Puzzle");

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(400, 600);

add(mainPanel);

setVisible(true);

}

}

ComputerView.java

package programming.schimmler.view;

import java.util.HashSet;

import java.util.Set;

import javax.swing.JPanel;

import programming.schimmler.model.PlayingField;

public class ComputerView extends JPanel {

...

Instance variables

....

public ComputerView(PlayingField field) {

this.field = field;

this.setLayout(null);

JPanel topLeft = new GamingPiece(PlayingField.TOP_LEFT);

add(topLeft);

JPanel topRight = new GamingPiece(PlayingField.TOP_RIGHT);

add(topRight);

JPanel bottomLeft = new GamingPiece(PlayingField.BOTTOM_LEFT);

add(bottomLeft);

}

}

GamingPiece.java

package programming.schimmler.view;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Graphics2D;

import javax.swing.JPanel;

import programming.schimmler.model.PlayingField;

/**

*

*/

public class GamingPiece extends JPanel {

...

public GamingPiece(int type) {

switch (type) {

// Need to draw each polygon from different coordinates since rotating did not work yet.

case PlayingField.TOP_LEFT:

pieceX = new int[] { 100, 100, 300, 300, 200, 200, 100 };

pieceY = new int[] { 100, 100, 100, 200, 200, 300, 300 };

break;

case PlayingField.TOP_RIGHT:

pieceX = new int[] { 400, 400, 300, 300, 200, 200 };

pieceY = new int[] { 0, 200, 200, 100, 100, 0 };

break;

case PlayingField.BOTTOM_LEFT:

pieceX = new int[] { 0, 200, 200, 100, 100, 0 };

pieceY = new int[] { 400, 400, 300, 300, 200, 200 };

break;

case PlayingField.BOTTOM_RIGHT:

pieceX = new int[] { 400, 400, 300, 300, 200, 200 };

pieceY = new int[] { 400, 200, 200, 300, 300, 400 };

break;

case PlayingField.SQUARE:

pieceX = new int[] { 100, 300, 300, 100 };

pieceY = new int[] { 100, 100, 300, 300 };

break;

}

setLayout(null);

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;

g2.setColor(Color.YELLOW);

g2.fillPolygon(pieceX, pieceY, pieceX.length);

}

}

These classes above are the only classes interacting with my GUI, no other classes take part.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值