Проблемы с JPanel, 2D-графикой и MouseListener - PullRequest
0 голосов
/ 18 января 2020

У меня проблемы с моим кодом, когда я пытаюсь сделать игру в блэкджек для финального проекта, у меня есть доска, на которой все сделано с 2D-графикой, и изображения работают, но когда я пытаюсь добавить такие элементы управления, как keyboardListener или mouseListener, или даже 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());
    }
}

1 Ответ

1 голос
/ 18 января 2020
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 в область содержимого JFrame на *** 1 ***, а затем вы закрываете панель содержимого компонентом Blackjack на *** 2 *** и поэтому MouseListener не может работать, поскольку компонент, который он прослушивает, полностью покрыт тяжелым компонентом (объектом Canvas).

Решение: добавьте MouseListener к отображаемому компоненту, компоненту Blackjack

Также:

  • Не расширяйте Canvas, а скорее JPanel
  • Переопределите метод JPCanel paintComponent
  • Всегда вызывайте метод рисования супер в пределах переопределения, таким образом, вызовите super.paintComponent(g);, если вы переопределите paintComponent, или super.paint(g);, если вы переопределите метод рисования.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...