Java 按键时显示图像,并将其保留在屏幕上,直到线程停止

Java 按键时显示图像,并将其保留在屏幕上,直到线程停止,java,image,background,while-loop,key,Java,Image,Background,While Loop,Key,我想做一个零和交叉的游戏,所以你用你的鼠标选择一个框,然后在键盘上的X或O输入答案。我已经尽可能地让选择框工作,但似乎无法让x和o工作。我的代码可能不是最好的,因为这是我制作的第一个游戏 这是我的主要课程: package com; import javax.swing.*; import java.awt.event.*; import java.awt.*; public class Board extends JPanel implements ActionListener, Mou

我想做一个零和交叉的游戏,所以你用你的鼠标选择一个框,然后在键盘上的X或O输入答案。我已经尽可能地让选择框工作,但似乎无法让x和o工作。我的代码可能不是最好的,因为这是我制作的第一个游戏

这是我的主要课程:

package com;

import javax.swing.*;

import java.awt.event.*;
import java.awt.*;

public class Board extends JPanel implements ActionListener, MouseListener,
        KeyListener {

    public int box = 1;
    public int x, y;
    public int cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4, cx5, cy5;

    public boolean player1 = true;
    public boolean player2 = false;
    public boolean box1 = false;
    public boolean box2 = false;
    public boolean box3 = false;
    public boolean box4 = false;
    public boolean box5 = false;
    public boolean box6 = false;
    public boolean box7 = false;
    public boolean box8 = false;
    public boolean box9 = false;
    public boolean xpress = false;
    public boolean cross1 = false;
    public boolean cross2 = false;
    public boolean cross3 = false;
    public boolean cross4 = false;
    public boolean cross5 = false;

    public Thread t;
    Timer time;

    JButton cross, naught;

    Image Board, Select, Cross, Cross2, Cross3, Cross4, Cross5, Naught;

    Board() {
        super();
        x = 0;
        y = 60;

        t = new Thread();
        time = new Timer(5, this);
        time.start();
        t.start();
        setFocusable(true);

        addMouseListener(this);
        addKeyListener(this);

        ImageIcon i = new ImageIcon(getClass().getResource(
                "/images/Board_N+C.png"));
        Board = i.getImage();
        ImageIcon i1 = new ImageIcon(getClass().getResource(
                "/images/Select_N+C.png"));
        Select = i1.getImage();
        ImageIcon i2 = new ImageIcon(getClass().getResource(
                "/images/Cross_N+C.png"));
        Cross = i2.getImage();
        Cross2 = i2.getImage();
        Cross3 = i2.getImage();
        Cross4 = i2.getImage();
        Cross5 = i2.getImage();

        ImageIcon i3 = new ImageIcon(getClass().getResource(
                "/images/Naught_N+C.png"));
        Naught = i3.getImage();

    }

    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;

        g2d.drawImage(Board, 0, 60, null);
        if (cross1) {

        }

        if (x < 170 && y < 230 && !xpress) {
            g2d.drawImage(Select, 0, 60, null);

            repaint();
        } else if (x < 340 && x > 170 && y < 230 && !xpress) {
            g2d.drawImage(Select, 170, 60, null);
            repaint();

        } else if (x < 510 && x > 340 && y < 230 && !xpress) {
            g2d.drawImage(Select, 340, 60, null);
            repaint();

        } else if (x < 170 && y < 400 && y > 230 && !xpress) {
            g2d.drawImage(Select, 0, 230, null);
            repaint();

        } else if (x < 340 && x > 170 && y < 400 && y > 230 && !xpress) {
            g2d.drawImage(Select, 170, 230, null);
            repaint();

        } else if (x < 510 && x > 340 && y < 400 && y > 230 && !xpress) {
            g2d.drawImage(Select, 340, 230, null);
            repaint();

        } else if (x < 170 && y < 570 && y > 400 && !xpress) {
            g2d.drawImage(Select, 0, 400, null);
            repaint();

        } else if (x < 340 && x > 170 && y < 570 && y > 400 && !xpress) {
            g2d.drawImage(Select, 170, 400, null);
            repaint();

        } else if (x < 510 && x > 340 && y < 570 && y > 400 && !xpress) {
            g2d.drawImage(Select, 340, 400, null);
            repaint();
        }
        if (xpress && !player2) {
            if (x < 170 && y < 230) {
                cross1 = true;
                while (cross1) {
                    g2d.drawImage(Cross, 0, 60, null);
                    System.out.println("Cross");

                }repaint();
                xpress = false;
            } else if (x < 340 && x > 170 && y < 230) {
                repaint();

            } else if (x < 510 && x > 340 && y < 230) {
                repaint();

            } else if (x < 170 && y < 400 && y > 230) {
                repaint();

            } else if (x < 340 && x > 170 && y < 400 && y > 230) {
                repaint();

            } else if (x < 510 && x > 340 && y < 400 && y > 230) {
                repaint();

            } else if (x < 170 && y < 570 && y > 400) {
                repaint();

            } else if (x < 340 && x > 170 && y < 570 && y > 400) {
                repaint();

            } else if (x < 510 && x > 340 && y < 570 && y > 400) {
                repaint();
            }
        }
    }

    public void mouseClicked(MouseEvent me) {

        x = me.getX();
        y = me.getY();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    }

    public void mouseEntered(MouseEvent arg0) {
    }

    public void mouseExited(MouseEvent arg0) {
    }

    public void mousePressed(MouseEvent arg0) {
    }

    public void mouseReleased(MouseEvent arg0) {
    }

    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if (key == e.VK_X) {
            if (player1) {
                xpress = true;
                player1 = false;
                player2 = true;
            }
        }

    }

    public void keyReleased(KeyEvent e) {

    }

    public void keyTyped(KeyEvent e) {

    }

}
package-com;
导入javax.swing.*;
导入java.awt.event.*;
导入java.awt.*;
公共类板扩展JPanel实现ActionListener、MouseListener、,
键盘监听器{
公共整数框=1;
公共整数x,y;
公共int cx1、cy1、cx2、cy2、cx3、cy3、cx4、cy4、cx5、cy5;
公共布尔值player1=true;
公共布尔player2=false;
公共布尔框1=false;
公共布尔框2=false;
公共布尔框3=false;
公共布尔框4=false;
公共布尔框5=false;
public boolean box6=false;
public boolean box7=false;
公共布尔框8=false;
公共布尔框9=false;
公共布尔表达式=false;
公共布尔交叉1=假;
公共布尔交叉2=假;
公共布尔交叉3=假;
公共布尔交叉4=假;
公共布尔交叉5=假;
公共线程t;
定时器时间;
吉布顿十字,无;
图像板,选择,交叉,交叉2,交叉3,交叉4,交叉5,无;
董事会(){
超级();
x=0;
y=60;
t=新螺纹();
时间=新计时器(5,此);
time.start();
t、 start();
设置聚焦(真);
addMouseListener(这个);
addKeyListener(此);
ImageIcon i=新的ImageIcon(getClass().getResource(
“/images/Board_N+C.png”);
Board=i.getImage();
ImageIcon i1=新的ImageIcon(getClass().getResource(
“/images/Select_N+C.png”);
Select=i1.getImage();
ImageIcon i2=新的ImageIcon(getClass().getResource(
“/images/Cross_N+C.png”);
Cross=i2.getImage();
Cross2=i2.getImage();
Cross3=i2.getImage();
Cross4=i2.getImage();
Cross5=i2.getImage();
ImageIcon i3=新的ImageIcon(getClass().getResource(
“/images/nott_N+C.png”);
NOUT=i3.getImage();
}
公共空间涂料(图g){
超级油漆(g);
Graphics2D g2d=(Graphics2D)g;
g2d.drawImage(板,0,60,空);
如果(交叉1){
}
如果(x<170&&y<230&&xpress){
g2d.drawImage(Select,0,60,null);
重新油漆();
}否则如果(x<340&&x>170&&y<230&&&xpress){
g2d.drawImage(选择,170,60,空);
重新油漆();
}否则如果(x<510&&x>340&&y<230&&&xpress){
g2d.drawImage(选择,340,60,空);
重新油漆();
}否则如果(x<170&&y<400&&y>230&&&xpress){
g2d.drawImage(选择,0,230,空);
重新油漆();
}否则如果(x<340&&x>170&&y<400&&y>230&&xpress){
g2d.drawImage(选择,170,230,空);
重新油漆();
}否则如果(x<510&&x>340&&y<400&&y>230&&&xpress){
g2d.drawImage(选择,340230,空);
重新油漆();
}否则如果(x<170&&y<570&&y>400&&xpress){
g2d.drawImage(Select,0400,null);
重新油漆();
}否则如果(x<340&&x>170&&y<570&&y>400&&xpress){
g2d.drawImage(Select,170400,null);
重新油漆();
}否则如果(x<510&&x>340&&y<570&&y>400&&xpress){
g2d.drawImage(Select,340400,null);
重新油漆();
}
如果(xpress&&!player2){
如果(x<170和y<230){
cross1=真;
while(cross1){
g2d.drawImage(交叉,0,60,空);
系统输出打印项次(“交叉”);
}重新油漆();
xpress=假;
}否则如果(x<340&&x>170&&y<230){
重新油漆();
}否则,如果(x<510&&x>340&&y<230){
重新油漆();
}否则如果(x<170&&y<400&&y>230){
重新油漆();
}否则如果(x<340&&x>170&&y<400&&y>230){
重新油漆();
}否则如果(x<510&&x>340&&y<400&&y>230){
重新油漆();
}否则如果(x<170&&y<570&&y>400){
重新油漆();
}否则如果(x<340&&x>170&&y<570&&y>400){
重新油漆();
}否则如果(x<510&&x>340&&y<570&&y>400){
重新油漆();
}
}
}
公共无效mouseClicked(MouseEvent me){
x=me.getX();
y=me.getY();
}
@凌驾
已执行的公共无效操作(操作事件e){
}
公共无效鼠标事件(鼠标事件arg0){
}
public void mouseexitted(MouseEvent arg0){
}
public void mousePressed(MouseEvent arg0){
}
公共无效MouseEvent arg0{
}
按下公共无效键(按键事件e){
int key=e.getKeyCode();
if(key==e.VK_X){
如果(播放者1){
xpress=真;
player1=假;
player2=true;
}
}
}
公共无效密钥已释放(密钥事件e){
}
public void keyTyped(KeyEvent e){
}
}
如何在按键时显示图像,并使其保持在屏幕上直到线程停止


希望有人能帮忙。如果您需要更多信息,请询问。

您显然不知道线程在Java中是如何工作的

t = new Thread();
time = new Timer(5, this);
time.start();
t.start();
首先,创建
线程
将不起任何作用(否则线程将启动并立即死亡,因为它不起任何作用)

其次,你最好
public class PopShowAndFadeImage {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        JFrame test = new JFrame("Test");
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        test.setSize(700, 1000);
        test.setLocationRelativeTo(null);
        test.setLayout(new BorderLayout());
        test.add(new ImagePane());
        test.setVisible(true);

    }

    protected static class ImagePane extends JPanel {

        private BufferedImage background;

        private Image image;
        private Timer timeOut;

        public ImagePane() {

            timeOut = new Timer(1000, new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {

                    image = null;
                    repaint();

                }
            });
            timeOut.setRepeats(false);
            timeOut.setCoalesce(true);

            setFocusable(true);

            InputMap im = getInputMap(WHEN_FOCUSED);
            ActionMap am = getActionMap();

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "HitMe");
            am.put("HitMe", new AbstractAction() {

                @Override
                public void actionPerformed(ActionEvent e) {

                    if (background == null) {
                        try {
                            background = ImageIO.read(getClass().getResource("/MT011.gif"));
                        } catch (IOException exp) {
                            exp.printStackTrace();;
                        }
                    }

                    image = background;

                    repaint();

                    timeOut.restart();

                }
            });

        }

        @Override
        protected void paintComponent(Graphics g) {

            super.paintComponent(g);

            if (image != null) {

                int width = getWidth() - 1;
                int height = getHeight() - 1;

                Graphics2D g2d = (Graphics2D) g;
                int x = (width - image.getWidth(this)) / 2;
                int y = (height - image.getHeight(this)) / 2;

                g2d.drawImage(image, x, y, this);

            }

        }

    }

}