我一直在为学校制作一个tic-tac-toe游戏,它通过控制台接收用户输入,然后在GUI中显示当前的板状态。我有所有的代码来确保游戏按预期运行,但是我不知道如何在玩家玩游戏时将X或O图像绘制到棋盘上。当调用构造函数时,它可以很好地绘制电路板,但当我调用我的方法来绘制图像时,它根本没有改变。我对GUI了解不多,非常感谢您的帮助。
我的代码:
package part1;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class boardDraw extends JFrame{
private ImageIcon XIcon = new ImageIcon("XJava.png");
private ImageIcon OIcon = new ImageIcon("OJava.png");
private Image X = XIcon.getImage();
private Image O = OIcon.getImage();
private Point[][] coords = new Point[3][3];
public boardDraw(){
setTitle("Tic-Tac-Toe");
setSize(1000, 1000);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
fillCoords();
}
public void paint(Graphics g){
g.drawLine(0, 333, 1000, 333);
g.drawLine(0, 666, 1000, 666);
g.drawLine(333, 0, 333, 1000);
g.drawLine(666, 0, 666, 1000);
}
public void fillCoords(){
int x = 170;
int y = 170;
for(int i = 0; i<3; i++){
for(int j = 0; j<3; j++){
coords[i][j] = new Point(x, y);
y += 333;
}
x += 333;
}
}
public void setX(int row, int col){
Graphics g = this.getGraphics();
//g.drawImage(X, (int)coords[row][col].getX(), (int)coords[row][col].getY(), null);
//System.out.println(X);
}
public void setO(int row, int col){
Graphics g = this.getGraphics();
g.drawImage(O, (int)coords[row][col].getX(), (int)coords[row][col].getY(), this);
//System.out.println(O);
//g.drawOval((int)coords[row][col].getX(), (int)coords[row][col].getY(), 100, 100);
}
}
...如何将图片绘制到已经存在的JFrame(?)
我不建议为此使用定制绘画。相反,在网格布局中放置9个标签(JLabel);//n是单元格之间的填充,并将图像用作标签的图标。
想象这些是图像。
那么这可能是最终结果:
这是将其组合在一起的代码:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class TicTacToe {
private JComponent ui = null;
private BufferedImage xImage;
private BufferedImage oImage;
private BufferedImage blankImage;
TicTacToe() {
initUI();
}
public void initUI() {
if (ui != null) {
return;
}
ui = new JPanel(new BorderLayout(4, 4));
ui.setBorder(new EmptyBorder(4, 4, 4, 4));
try {
xImage = ImageIO.read(new URL("https://i.stack.imgur.com/F0JHK.png"));
oImage = ImageIO.read(new URL("https://i.stack.imgur.com/gJmeJ.png"));
blankImage = new BufferedImage(
xImage.getWidth(), xImage.getHeight(),
BufferedImage.TYPE_INT_ARGB);
} catch (IOException ex) {
System.err.println("Unable to load icons!");
ex.printStackTrace();
System.exit(1);
}
JPanel ticTacToeBoard = new JPanel(new GridLayout(3, 3, 4, 4));
ui.add(ticTacToeBoard, BorderLayout.CENTER);
Random r = new Random();
Image[] images = {
xImage,
oImage,
blankImage
};
for (int ii = 0; ii < 9; ii++) {
// next line is to show how it might look.
Image image = images[r.nextInt(3)];
JLabel l = new JLabel(new ImageIcon(image));
l.setOpaque(true);
l.setBackground(Color.WHITE);
ticTacToeBoard.add(l);
}
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
TicTacToe o = new TicTacToe();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
我忘了,最终目标是让用户能够使用键盘和鼠标与方块交互!:P
考虑到这一点,请注意,我们只能将鼠标侦听器添加到标签。对于键盘交互,按钮(
JButton)会更好。一旦将ActionListener添加到按钮,它将对键盘或鼠标输入作出反应。请参见为基于按钮阵列的棋盘游戏制作一个健壮、可调整大小的Swing Chess GUI。例如。
JButton[][] chessBoardSquares = new JButton[8][8];
问题内容: 我无法在JFrame上绘制此椭圆形。 框架显示,但其中未绘制任何内容。我在这里做错了什么? 问题答案: 您创建了一个静态方法,该方法不会覆盖paint方法。现在,其他人已经指出,您需要覆盖paintComponent等。但是,为了快速修复,您需要执行以下操作: 但是,正如其他人指出的那样,在JFrame上进行绘制非常棘手。最好使用JPanel。
问题内容: 我正在尝试制作一个在鼠标本地化处绘制一个圆的简单Java程序,它获取了鼠标的X和Y坐标,但是它没有绘制任何内容,我试图绘制一个String,一个圆和一条线,但是没有任何效果,我稍微修改了代码,但仍然无法正常工作 问题答案: 不要直接在上执行自定义绘画。如果可以,请始终在替代方法上进行操作。 为此,请勿使用无限循环。有用于Mouse Motion收听的
我该怎么做才能在我自己的视图上使用freehanf手指画?
基本上,我想写这样的代码: 这是不可能的,因为没有重载 因此,我目前正在使用,但它并不完美。 有没有一种方法可以不重新声明函数就知道函数是否存在? 基本上,我想做一些类似的事情 和主要的:
问题内容: 我是一个狂热的程序员,但是今天是我的第一堂Java课。 使用上面的代码,我想在窗口上写一个句子,但是它永远不会写。我究竟做错了什么? 编辑:没关系-油漆一定是油漆。我深表歉意。 问题答案: 在给定的代码中,您想要的是 一个工作示例供您参考:
问题内容: 我正在设计一个程序,该程序在JFrame中包含两个JPanel,一个用于保存图像,另一个用于保存GUI组件(Searchfields等)。我想知道如何将图像绘制到JFrame中的第一个JPanel? 这是我的构造函数的示例代码: } 我试图覆盖JPanel的paintComponent方法来绘制图像,但是当我尝试编写时,这在我的构造函数中导致了一个问题: 因为这将只允许我传递null的