当前位置: 首页 > 知识库问答 >
问题:

如何转换绘制的对象

司承业
2023-03-14

我现在正在做连接4游戏,我正在绘制令牌,我需要通过单击右键或左按钮之类的事件来翻译它...这是我的代码

public static Graphics myInstance;

public Executer(){
    setTitle("Connect 4");
    setSize(500,700);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    myInstance = this.getGraphics();
}

public void paint (Graphics g){
    //Drawing the grid
    Color black = new Color(0, 0, 0);
    g.setColor(black);
    //g.drawString("Hi", 50, 50);
    g.drawRect(20, 200, 441, 400);
    for (int i=0;i<7;i++)
        g.drawLine(83 + i*63, 200, 83 + i*63, 600);

    for (int i=0;i<5;i++)
        g.drawLine(20 ,267 + i*67, 461 , 267 + i*67);

    //End Drawing the grid

}

public static void main (String[] args){
    Executer e = new Executer();

    //Drawing Red Tokken
    Color red = new Color(255, 0, 0);
    myInstance.setColor(red);
    myInstance.fillOval(29, 150, 50, 50);
}

我不知道用哪一个函数翻译,我已经搜索了,但什么也没有找到,或者我应该从一开始就清除绘图并重新绘制?!

共有1个答案

云啸
2023-03-14

建议:

  1. 首先,不要像现在这样通过在组件上调用getGraphics()来获取Graphics对象。首先,几乎可以保证您的代码会给您一个空引用,从而有导致NullPointerException的风险。但另一方面,即使您成功了,这样获得的Graphics对象也会很短,并且在程序运行时可能会变得不起作用或为空
  2. 相反,您需要在扩展JPanel或JComponent的类的paintComponent方法中绘制
  3. 在这里,您将使用JVM给您的Graphics对象,它应该在paintComponent方法期间保持稳定
  4. 不要忘记调用覆盖中的super方法来进行内务绘图
  5. 您需要更改实例字段的状态,可能是一个名为diskColor的字段,然后将在paintComponent中使用该字段。这将允许外部类更改paintComponent中绘制的颜色
  6. 另一种选择是使用JLabels持有的ImageCons来保存您的图形,实际上这就是我要选择的,因为您可以创建一个JLabel网格,为它们提供MouseListeners,从而允许您玩游戏

例如,使用图像图标:

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;

import javax.swing.*;

@SuppressWarnings("serial")
public class ConnectGrid extends JPanel {
    public static final int ROWS = 7;
    public static final int COLS = 6;
    public static final int DIAMETER = 80;

    // color of blank icon, placeholder for grid position without disk
    private static final Color BLANK_COLOR = new Color(0, 0, 0, 0);

    // all colors -- placeholder, red and yellow
    public static final Color[] COLORS = { BLANK_COLOR, Color.RED, Color.YELLOW };

    // ImageIcons mapped to color
    private static final Map<Color, Icon> iconMap = new HashMap<>();
    private static final int GAP = 2;

    // JLabel grid that holds the colored icons
    private JLabel[][] labelGrid = new JLabel[ROWS][COLS];
    private Color turn = Color.RED; // whose turn is it?

    static {
        // create our colored image icons
        int w = DIAMETER;
        int h = DIAMETER;
        int imgType = BufferedImage.TYPE_INT_ARGB;
        for (Color color : COLORS) {
            BufferedImage img = new BufferedImage(w, h, imgType);
            Graphics2D g2 = img.createGraphics();
            // smooth drawing
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            // draw the color
            g2.setColor(color);
            g2.fillOval(GAP, GAP, w - 2 * GAP, h - 2 * GAP);
            // draw a black border
            g2.setStroke(new BasicStroke(3f));
            g2.setColor(Color.black);
            g2.drawOval(GAP, GAP, w - 2 * GAP, h - 2 * GAP);
            g2.dispose();
            // create ImageIcon and put in iconMap, mapped to color
            iconMap.put(color, new ImageIcon(img));
        }
    }

    public ConnectGrid() {
        // JPanel to hold grid of JLabels
        JPanel gridPanel = new JPanel(new GridLayout(ROWS, COLS, GAP, GAP));
        // create grid of JLabels, add to gridPanel JPanel
        // fill labels with blank icon, add MouseListener
        for (int row = 0; row < labelGrid.length; row++) {
            for (int col = 0; col < labelGrid[row].length; col++) {
                // must swap the row numbers since 0th row is on the bottom
                labelGrid[ROWS - row - 1][col] = new JLabel(
                        iconMap.get(BLANK_COLOR));
                gridPanel.add(labelGrid[ROWS - row - 1][col]);
                labelGrid[ROWS - row - 1][col].addMouseListener(new MyMouse(
                        ROWS - row - 1, col));
            }
        }

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(new JButton(new ResetAction("Reset")));

        setLayout(new BorderLayout());
        add(gridPanel, BorderLayout.CENTER);
        add(buttonPanel, BorderLayout.PAGE_END);
    }

    private class MyMouse extends MouseAdapter {
        private int row;
        private int col;

        public MyMouse(int row, int col) {
            this.row = row;
            this.col = col;
        }

        @Override
        public void mousePressed(MouseEvent e) {
            JLabel label = (JLabel) e.getSource();
            Icon icon = label.getIcon();
            if (icon != iconMap.get(BLANK_COLOR)) {
                // if label already has a colored icon, ignore mouse press
                return;
            }
            // if not at bottom row
            if (row != 0
            // and label below has a blank icon
                    && labelGrid[row - 1][col].getIcon() == iconMap
                            .get(BLANK_COLOR)) {
                // ignore mouse press
                return;
            }
            // get color for this turn
            icon = iconMap.get(turn);
            // set label's icon
            label.setIcon(icon);
            // toggle the value of turn
            // TODO: check for win here
            turn = (turn == COLORS[1]) ? COLORS[2] : COLORS[1];
        }
    }

    private class ResetAction extends AbstractAction {
        public ResetAction(String name) {
            super(name);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            for (JLabel[] labelRow : labelGrid) {
                for (JLabel label : labelRow) {
                    label.setIcon(iconMap.get(BLANK_COLOR));
                }
            }
        }
    }

    private static void createAndShowGui() {
        ConnectGrid mainPanel = new ConnectGrid();

        JFrame frame = new JFrame("ConnectGrid");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}
 类似资料:
  • 本文向大家介绍把对象转换到数字类型是如何转换的?相关面试题,主要包含被问及把对象转换到数字类型是如何转换的?时的应答技巧和注意事项,需要的朋友参考一下 1、如果对象有valueOf方法,则调用该方法,并返回相应的结果; 2、当调用valueOf返回的依然不是数字,则会调用对象的toString方法,并返回相应的结果; 3、否则抛出异常。

  • 问题内容: 我试图理解Java的多态性,但是我有一个关于向下转换对象的问题。假设在此示例中,我有两个子类Dog和Cat,它们从超类Animal继承 据我了解,向下转换对象的唯一方法是,如果该对象已经是好类型,如下所示: 这样行吗? 但是,如果我想创建一个普通的动物而又不知道它会是什么,然后在知道时将其投放,该怎么办? 这会在运行时抛出ClassCastException吗? 我发现这样做的唯一方法

  • 问题内容: 如何将java对象转换为InputStream? 问题答案: 您可以使用ObjectOutputStream 您将对象(以下代码中的obj)写入ObjectOutputStream,要转换为输入流的对象必须实现Serializable。

  • 问题内容: 如何在Java中将对象转换为int? 问题答案: 如果您确定该对象是: 或者,从Java 7开始,您可以等效地编写: 当心,它可以抛出一个,如果你的对象是不是和你要的对象是。 这样,您就假定对象是一个整数(包装的int),然后将其拆箱为一个int。 是基元,因此不能将其存储为,唯一的方法是将考虑/装箱为,然后存储为。 如果您的对象是,则可以使用方法将其转换为简单的int: 如果您的对象

  • 我试图将一个可绘制资源转换为位图,但每个代码段和每个自己的尝试都返回null或空字符串。 我尝试了一些基本的方法,比如Bitmapfactory。decodeResource(在这里,我尝试了活动上下文、应用程序上下文等,以及各种可绘制资源(png、vector、xml),我尝试了转换中的不同代码段,它总是返回null或“”。我还尝试更改可绘制文件夹而不是可绘制文件夹-24我尝试了基本的可绘制文件

  • 本文向大家介绍把对象转换到字符串类型是如何转换的?相关面试题,主要包含被问及把对象转换到字符串类型是如何转换的?时的应答技巧和注意事项,需要的朋友参考一下 #2928 (comment) 首先会查找对象是否实现了方法。 一般来说方法决定了和的调用顺序,该方法接受一个参数 ,当 为时,则调用方法;为时,则调用方法。 例: