【发布时间】:2017-01-20 20:37:15
【问题描述】:
我只是想构建一个带有瓷砖的游戏板。我通过使用 BufferedImage 将图块绘制成行和列来让它工作,但我需要在玩游戏时不断更新 GUI。
所以我尝试将平铺图像添加到 ImageIcon,然后添加到 JLabel 数组,以便我可以设置位置。之后我会将标签添加到 gui JPanel,但它们之间有这些默认间隙。
我是不是在错误地处理这个问题?我对 Swing 和 Java 很陌生
public static void main (String[] args) throws IOException{
int NUMROWS = 10;
int NUMCOLS = 10;
int NUMMINES = 10;
int[] mineList = GameBoard.setMines(NUMMINES, NUMROWS, NUMCOLS);
int[][] cellNums = GameBoard.setCellNum(NUMROWS, NUMCOLS);
boolean[][] mineField = GameBoard.getMineField(mineList, cellNums);
int[][] adjacentMineVals = GameBoard.getAdjacentMineVals(cellNums, mineField);
ImageIcon img = new ImageIcon(ImageIO.read(new File("GraphicFile\\Cell.png")));
JLabel[][] label = new JLabel[NUMROWS][NUMCOLS];
for (int i = 0; i < NUMROWS; i++){
for (int j = 0; j < NUMCOLS; j++){
label[i][j] = new JLabel();
label[i][j].setIcon(img);
label[i][j].setLocation(i*img.getIconHeight(), j*img.getIconWidth());
}
}
JFrame frame = buildFrame();
int fX = 2*frame.getInsets().left;
int fY = (frame.getInsets().top + frame.getInsets().bottom);
JPanel GUI = new JPanel();
GUI.setSize(NUMCOLS*img.getIconWidth(), NUMROWS*img.getIconHeight());
for (int i = 0; i < NUMCOLS; i++){
for (int j = 0; j < NUMROWS; j ++){
GUI.add(label[i][j]);
}
}
frame.setSize(NUMCOLS*img.getIconWidth() + fX, NUMROWS*img.getIconHeight() + fY);
frame.add(GUI);
}
public static JFrame buildFrame(){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
return frame;
}
这就是它给我的 https://i.stack.imgur.com/rX3yM.png
更新,到新版本。以前的问题已通过使用网格并将图像作为图标放入按钮中来解决
这就是我所拥有的。它不会将带有文本的标签放在已按下的按钮上。我调试了,它接收坐标和文本的输入,但它只是没有将它绘制到面板上
public MinesweeperGraphics() throws IOException {
GUI.setOpaque(false);
for (int i = 0; i < NUMROWS; i++){
for (int j = 0; j < NUMCOLS; j++){
buttons[i][j] = new JButton();
buttons[i][j].setIcon(tileUp);
buttons[i][j].setBorder(null);
buttons[i][j].addActionListener(this);
buttons[i][j].setPressedIcon(tilePressed);
GUI.add(buttons[i][j]);
}
}
frame.add(GUI, BorderLayout.CENTER);
frame.add(reset, BorderLayout.NORTH);
reset.addActionListener(this);
frame.setResizable(false);
frame.pack();
GUI.setLayout(null);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(reset)){
for (int i = 0; i < NUMROWS; i++){
for (int j = 0; j < NUMCOLS; j++){
buttons[i][j].setIcon(tileUp);
}
}
}else {
for (int i = 0; i < buttons.length; i++) {
for (int j = 0; j < buttons.length; j++) {
if (e.getSource().equals(buttons[i][j])){
if (mineField[i][j] == false){
buttons[i][j].setIcon(tileEmpty);
numberText.setOpaque(false);
numberText.setSize(buttons[i][j].getWidth(), buttons[i][j].getHeight());
numberText.setText("a");
numberText.setLocation(buttons[i][j].getLocation());
GUI.add(numberText);
} else if (mineField[i][j] == true){
buttons[i][j].setIcon(tileExplodedMine);
}
//isn't working here
buttons[i][j].setEnabled(false);
}
}
}
}
}
【问题讨论】:
-
构建扫雷游戏的最佳方式是将带有动作侦听器的按钮放入网格布局中。这些按钮将响应键盘和鼠标输入并可以显示图标。网格布局可以在屏幕上组织它们。
-
一般建议:1) 为了尽快获得更好的帮助,请发帖minimal reproducible example 或Short, Self Contained, Correct Example。 2) 例如,获取图像的一种方法是热链接到在this Q&A 中看到的图像。
-
@AndrewThompson 什么样的按钮是可能的?它们可以显示不同的 .png 图像而不是默认图像吗?
-
提示,您可以标记某人,以便他们通过添加
@后跟他们的名字来通知您的回复,例如@AndrewThompson,您可以调用方法setEnabled(false);来禁用您的JButton,很抱歉我正在打电话,目前无法发布文档链接,但您可以在 Google 中查找 -
如需更好的帮助,请尽快发布有效的minimal reproducible example,即使在我将布局改回 null 后,您可能会做的更糟,请发布您的代码
标签: java swing graphics jpanel minesweeper