Java 我能';我不知道如何在已经存在的框架上画图

Java 我能';我不知道如何在已经存在的框架上画图,java,swing,Java,Swing,我一直在为学校制作一个tic-tac-toe游戏,它通过控制台接收用户输入,然后在GUI中显示当前的板状态。我有所有的代码来确保游戏按预期运行,但是我不知道如何在玩家玩游戏时将X或O图像绘制到棋盘上。当调用构造函数时,它可以很好地绘制电路板,但是当我调用我的方法来绘制图像时,它一点也没有改变。我对GUI不太了解,非常感谢您的帮助 我的代码: package part1; import java.awt.Graphics; import java.awt.Image; import java.aw

我一直在为学校制作一个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);

}
包第1部分;
导入java.awt.Graphics;
导入java.awt.Image;
导入java.awt.Point;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类boardDraw扩展JFrame{
私有ImageIcon XIcon=newImageIcon(“XJava.png”);
私有ImageIcon OIcon=新的ImageIcon(“OJava.png”);
私有映像X=XIcon.getImage();
私有映像O=OIcon.getImage();
专用点[][]坐标=新点[3][3];
公共董事会抽签(){
SETTILE(“Tic Tac Toe”);
设置大小(10001000);
setVisible(真);
setDefaultCloseOperation(关闭时退出);
fillCoords();
}
公共空间涂料(图g){
g、 抽绳(0,333,1000,333);
g、 抽绳(06661000666);
g、 抽绳(333,0,333,1000);
g、 抽绳(666,0661000);
}
公共图书馆{
int x=170;
int y=170;
对于(int i=0;i
…如何在已经存在的JFrame(?)上绘制图片

我不建议为此使用自定义绘制。相反,在网格布局中放置9个标签(
JLabel
)(
newgridlayout(3,3,n,n);//n是单元格之间的填充物
),并将图像用作标签的图标

想象一下这些都是图像

  • X
  • O
那么这可能就是最终的结果:

这是将其组合在一起的代码:

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);
    }
}
…如何在已经存在的JFrame(?)上绘制图片

我不建议为此使用自定义绘制。相反,在网格布局中放置9个标签(
JLabel
)(
newgridlayout(3,3,n,n);//n是单元格之间的填充物
),并将图像用作标签的图标

想象一下这些都是图像

  • X
  • O
那么这可能就是最终的结果:

这是将其组合在一起的代码:

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);
    }
}

“通过控制台获取用户输入”将是您的第一个问题,控制台输入是线性的,GUI是事件驱动的,它们是不同的范例,不容易混合。不要使用getGraphics()。不要覆盖paint()在JFrame上。阅读Swing教程中关于绘制基础知识和一些工作示例的部分以开始。此外,类名应以大写字符开头。遵循Java约定。下一个问题是
paint
方法,这不是自定义绘制的方式,一般来说,您不应该这样做t覆盖顶级组件的
paint
,它们非常复杂,通常已经添加了子组件,相反,从
JPanel
开始,覆盖它的
paintComponent
方法,而不是1)查看我不再费心解决的问题。2)获取图像的一种方法例如,要热链接到在中看到的图像。3)我不建议为此使用自定义绘制。相反,在网格布局中放置9个标签(
JLabel
)(
new GridLayout(3,3,n,n);//n是单元格之间的填充
),并将这些图像用作标签的图标。“这需要用户通过控制台输入”第一个问题是,控制台输入是线性的,GUI是事件驱动的,它们是不同的范例,不容易混合使用getGraphics()。不要覆盖paint()在JFrame上。阅读Swing教程中关于绘制基础知识和一些工作示例的部分以开始。此外,类名应以大写字符开头。遵循Java约定。下一个问题是
paint
方法,这不是自定义绘制的方式,一般来说,您不应该这样做t覆盖顶级组件的
paint
,它们非常复杂,通常已经添加了子组件,相反,从
JPanel
开始,覆盖它的
paintComponent
方法,而不是1)查看我不再费心解决的问题。2)获取图像的一种方法例如,热链接到.3)中所示的图像,我不建议为此使用自定义绘制。相反,在网格布局中放置9个标签(
JLabel
)(
new GridLayout(3,3,n,n);//n是单元格之间的填充
),并将这些图像用作标签的图标。