【发布时间】:2019-03-05 02:42:40
【问题描述】:
情况
我目前正在尝试使用 Java 的 Swing 构建 2D 游戏。为此,我有我的主类Puzzle,它是JFrame 的子类。在我的框架中,我添加了我的主要JPanel,它由几个添加在一起的JPanels 组成(每个都是一个新部分)。
编辑 2:PlayingField 是我的模型,它将存储每件的当前位置。
可以用鼠标选择一块(计划是突出显示它)并用箭头键移动它,只要下一步(一个完整的单元格,所以大约 100 像素)不是另一个的位置件。截至目前,PlayingField 不存储任何数据,因为这些片段丢失了。
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);
}
上面的方法将创建我的框架并添加主面板。以下方法是我的主面板,它为自己添加了几个JPanels。
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 或者更确切地说是我的子JPanels 都在绘制一个基本块(我只绘制一个并旋转其他块,因为它们都由相同的任意形状组成)。 GamingPiece 类也是JPanel 的子类,并调用JPanel#paintComponent() 方法来绘制棋子。
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.YELLOW);
g2.fillPolygon(pieceX, pieceY, pieceX.length);
}
问题和我的问题
由于我对 Java 还很陌生,我真的不知道如何正确地做到这一点。如果我通过创建一个新对象并将其添加到主面板来添加我的作品,它不会显示所有作品,只会显示最后一个添加的作品。有些甚至似乎不起作用,即使它们是唯一添加的(解释我的情况:我有相同任意形状的碎片,只是旋转方式不同,但使用 Graphics2D#rotate() 似乎不能正常工作) .
我希望我能很好地解释我的情况和我的问题,以便你们帮助我。提前致谢!
编辑:
我的代码
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);
}
}
以上这些类是仅与我的 GUI 交互的类,没有其他类参与。
【问题讨论】:
-
我看到了问题..
this.setLayout(null);使用。布局。 一般提示:为了尽快获得更好的帮助,edit 添加minimal reproducible example 或Short, Self Contained, Correct Example。 -
请添加minimal reproducible example。没有一个,我们只能猜测问题。
setLayout(null)是一种可能性。 -
我想要一匹会排泄冰淇淋的飞行小马。现在我们都讨论了我们无法实现的梦想,您应该使用布局来修复该代码。或者,如果您无法管理它,请将您的尝试展示为 MCVE / SSCCE。
-
什么是
PlayingField?是enum还是带有静态成员的class?它是一个模型,将碎片放在哪里,或者它们应该去哪里?你想用鼠标拖动碎片吗?或者棋子是否像 4x4“魔术 16”拼图一样移动,点击棋子会导致移动一个完整的 100 像素网格步长?在我们了解您要做什么之前,我们还不如戴着烤箱手套穿针;可能,但真的很难。 -
“我很抱歉让你们这么难”:我只能重复你得到的建议:mvce。不是整个代码(这就是 M 的意思),而是我们可以复制粘贴并运行的代码(E)。它比试图描述代码更清晰、更简短。
标签: java swing jpanel layout-manager null-layout-manager