繁体   English   中英

使用 JPanel、2D 图形和 MouseListener 时遇到问题

[英]Having troubles with JPanel, 2D Graphics, and MouseListener

我在尝试为最终项目制作 21 点游戏时遇到代码问题,我的棋盘都是用 2D 图形制作的,图像可以正常工作,但是当我尝试添加诸如键盘监听器或鼠标监听器之类的控件时,甚至 JButtons,它们似乎都不起作用。 目前我正在尝试使用 mouseListener 所以我可以点击它说要击中的区域,但它似乎不想工作。 我假设它与阻止 mouseListener 功能的图形或未正确订购有关。

我尝试使用 JPanels 和 contentPanes,但我永远无法让它们相互配合。

CardValue()只是从数组中随机确定一张卡片,而油漆就是油漆。

我还在底部添加了我的 MouseListener 类,它是与 Blackjack 不同的类

如果有人能帮助我理解为什么 MouseListener 无法处理图形或解决我的问题,那将是惊人的,因为我对编码很陌生并且不完全理解图形

import java.util.Random;
import java.util.Stack;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.io.File;
import javax.imageio.ImageIO;

@SuppressWarnings("unused")
public class Blackjack extends Canvas {

    //Declaring Variables for images, Strings, and other things
    //Image Cards, cardback1, cardback2, dealer, you;

    static String blah;
    static int dealerstotal = 0;

    public static Stack <Integer> cards = new Stack<Integer>();

    //An array that prints out a random card and gives me the value of the cards, along with the name
    //so i can match it up with an image of the card with a match name
    public static void CardValue() {

        for (int i = 1; i<53; i++) {
            cards.add(i);
        }

        String suit1 ="", number1="";

        Random r = new Random();
        int suit = r.nextInt(4);

        switch (suit) {
        case 0: suit1 = "c"; break;
        case 1: suit1 = "d"; break;
        case 2: suit1 = "h"; break;
        case 3: suit1 = "s"; break;
        }

        int number = r.nextInt(13)+1;

        switch (number) {
        case 1: number1 = "1"; break;
        case 2: number1 = "2"; break;
        case 3: number1 = "3"; break;
        case 4: number1 = "4"; break;
        case 5: number1 = "5"; break;
        case 6: number1 = "6"; break;
        case 7: number1 = "7"; break;
        case 8: number1 = "8"; break;
        case 9: number1 = "9"; break;
        case 10: number1 = "10"; break;
        case 11: number1 = "11"; break;
        case 12: number1 = "12"; break;
        case 13: number1 = "13"; break;
        }

        blah = suit1+number1;

        if (number>=10) {
            number = 10;
        }

        if (number == 1) {

        }

        dealerstotal+=number;

        int newcard = (suit*13)+number;
        System.out.println(blah);
        cards.remove(newcard);

    }

    public Blackjack() throws Exception
    {

        //Declaring images, I //'d all these out because I didn't include the downloads for these images

        //Cards = ImageIO.read( new File(blah+ ".png") );
        //dealer = ImageIO.read( new File("dealer.jpg") );
        //you = ImageIO.read( new File("you.jpg") );
        //cardback1 = ImageIO.read(new File("redback.png"));
        //cardback2 = ImageIO.read(new File("blackback.png"));
    }

    //Creating the game board
    public void paint( Graphics g )
    {
        int l = 5;
        Color table = new Color(74, 179, 0);
        Color blues = new Color(13, 38, 163);
        String title = "Welcome to Kris' Casino";
        String dealers = "Dealers Cards";
        String dealerst = "Dealers Total: "+dealerstotal;
        String your = "Your Cards";
        String yourt = "Your Total: "+l;
        String game = "The Game is Blackjack, Goodluck";
        String hit = "Press Up to Hit";
        String stand = "Press Down to Stand";

        g.setColor(table);
        g.fillRect(0,0,10000,10000);

        //Title/Pictures

        g.setColor(Color.black);
        g.fillRect(40,40,254,334);
        g.fillRect(40,420,254,334);
        //g.drawImage(dealer,50,50,this);
        //g.drawImage(you,50,430,this);

        g.setFont(new Font("Arial", Font.BOLD, 51));
        g.setColor(Color.black);
        g.drawString(title, 400, 90);
        g.setColor(Color.YELLOW);
        g.drawString(title, 403, 93);

        g.setFont(new Font("Arial", Font.BOLD, 30));
        g.setColor(Color.black);
        g.drawString(game, 450, 140);
        g.setColor(Color.YELLOW);
        g.drawString(game, 452, 142);

        g.setColor(Color.black);
        g.fillRect(400, 105, 595, 5);

        //Dealers Graphics

        //Dealers Cards
        g.drawString(dealers, 430, 240);
        g.setColor(Color.red);
        g.fillRect(450, 265, 82, 105);
        g.fillRect(550, 265, 82, 105);
        g.fillRect(650, 265, 82, 105);
        g.fillRect(750, 265, 82, 105);
        g.fillRect(850, 265, 82, 105);

        g.drawString(dealers, 432, 242);
        //g.drawImage(Cards,455,270,this);
        //g.drawImage(cardback1,555,270,this);
        //g.drawImage(cardback1,655,270,this);
        //g.drawImage(cardback1,755,270,this);
        //g.drawImage(cardback1,855,270,this);

        //Dealers Total
        g.setColor(Color.black);
        g.drawString(dealerst, 730, 240);

        g.setColor(Color.red);
        g.drawString(dealerst, 732, 242);

        //Yours Cards
        g.setColor(Color.white);
        g.drawString(your, 452, 440);
        g.setColor(blues);
        g.fillRect(450, 465, 82, 105);
        g.fillRect(550, 465, 82, 105);
        g.fillRect(650, 465, 82, 105);
        g.fillRect(750, 465, 82, 105);
        g.fillRect(850, 465, 82, 105);

        g.drawString(your, 450, 438);
        //g.drawImage(cardback2,455,470,this);
        //g.drawImage(cardback2,555,470,this);
        //g.drawImage(cardback2,655,470,this);
        //g.drawImage(cardback2,755,470,this);
        //g.drawImage(cardback2,855,470,this);

        g.setColor(Color.white);
        g.drawString(yourt, 750, 440);
        g.setColor(blues);
        g.drawString(yourt, 748, 438);

        g.setColor(Color.black);
        g.fillRect(1116, 200, 1000, 70);

        g.setColor(Color.black);
        g.fillRect(1032, 300, 1000, 70);

        g.setColor(Color.white);
        g.drawString(hit, 1134, 245);
        g.drawString(stand, 1050, 345);
    }

    //Here is where I'm having my issues, Whenever I add "frame.add(new Blackjack());" mouseListener doesnt work
    //mouseListener only works when I don't have "frame.add(new Blackjack());"
    //Im guessing this is some kind of issue to do with graphics ontop of the mouseListener/JFrame 
    //disabling it from working
    public static void Frame() throws Exception {
        JFrame frame = new JFrame("Kris' Casino");
        frame.setSize(500,500);
        frame.getContentPane().addMouseListener(new ClickListener());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.add(new Blackjack());
        frame.setVisible(true);
    }

    public static void main(String[] args) throws Exception {
        CardValue();
        Frame();
    }
}

这是 mouseListener 的第二个类

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class ClickListener extends MouseAdapter {

    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println(e.getX() + "," + e.getY());
    }
}
public static void Frame() throws Exception {
    JFrame frame = new JFrame("Kris' Casino");
    frame.setSize(500,500);
    frame.getContentPane().addMouseListener(new ClickListener());  // *** 1 ***
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.add(new Blackjack());                                    // *** 2 ***
    frame.setVisible(true);

}

请注意,您将 MouseListener 添加到*** 1 ***处的 JFrame 的 contentPane 中,然后使用*** 2 ***的 Blackjack 组件覆盖 contentPane ,因此 MouseListener 无法工作因为它正在侦听的组件已被完全覆盖,并带有一个重量级组件(一个 Canvas 对象)。

解决方法:在显示的组件中添加MouseListener,Blackjack组件

还:

  • 不要扩展 Canvas 而是扩展 JPanel
  • 覆盖 JPanel 的paintComponent 方法
  • 始终在覆盖中调用 super 的绘制方法,因此调用super.paintComponent(g); 如果你覆盖了paintComponent或super.paint(g); 如果你覆盖了paint方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM