简体   繁体   中英

need help on java GUI

I'm creating a three card poker game on Java. I'm basically done with coding now, but I meet some problems with GUI stuff. Here's my code for the graphics part:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.Scanner;

import javax.*;

public class Board extends dealer{
    final static boolean shouldFill = true;
    final static boolean shouldWeightX = true;
    final static boolean RIGHT_TO_LEFT = false;
    public static Image cardback;
    public static Image comp1;
    public static Image comp2;
    public static Image comp3;
    public static Image play1;
    public static Image play2;
    public static Image play3;
    public static int x,y;
    public static int numgames;
    public static int bet;
    public static int wlt=7;
    public static int dealorfold=1;
    public static int showcard=1;
    static int playermoney;
    static int compmoney; 
    protected static hand player;
    protected static hand computer;
    static class deal implements ActionListener{
        public void actionPerformed(ActionEvent e){
            dealorfold=2;
        }
    }

    static class fold implements ActionListener{
        public void actionPerformed(ActionEvent e){
            dealorfold=3;
        }
    }

    static class allin implements ActionListener{
        public void actionPerformed(ActionEvent e){
            bet=playermoney;
        }
    }

    static class ten implements ActionListener{
        public void actionPerformed(ActionEvent e){
            if(playermoney<10)
                wlt=9;          
            else
                bet=10;
        }
    }

    static class fifty implements ActionListener{
        public void actionPerformed(ActionEvent e){
            if(playermoney<50)
                wlt=9;          
            else
                bet=50;
        }
    }

    static class hundred implements ActionListener{
        public void actionPerformed(ActionEvent e){
            if(playermoney<100)
                wlt=9;          
            else
                bet=100;
        }
    }

    static class fivehund implements ActionListener{
        public void actionPerformed(ActionEvent e){
            if(playermoney<500)
                wlt=9;          
            else
                bet=500;
        }
    }

    static class thaud implements ActionListener{
        public void actionPerformed(ActionEvent e){
            if(playermoney<1000)
                wlt=9;          
            else
                bet=1000;
        }
    }

    static class fivethaud implements ActionListener{
        public void actionPerformed(ActionEvent e){
            if(playermoney<5000)
                wlt=9;          
            else
                bet=5000;
        }
    }

    static class tenthaud implements ActionListener{
        public void actionPerformed(ActionEvent e){
            if(playermoney<10000)
                wlt=9;          
            else
                bet=10000;
        }
    }   

    private static void createAndShowGUI() {
        setcards();
        JFrame frame = new JFrame("Three Card Poker");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(1366,768));
        addComponentsToPane(frame.getContentPane());
        frame.pack();
        frame.setVisible(true);

        int p1 = checkpattern(player);
        int c1 = checkpattern(computer);
        while(dealorfold==1){
            if(dealorfold==2){
                if(p1>c1){
                    compmoney = compmoney - bet;
                    playermoney = playermoney + bet;
                    showcard=2;
                    wlt=1;
                }
                else if (p1<c1){
                    compmoney = compmoney + bet;
                    playermoney = playermoney - bet;
                    showcard=2;
                    wlt=2;
                }
                else if(p1==0 && c1==0){
                    if(checkhighercardinhand(player, computer)==0){
                        compmoney = compmoney - bet;
                        playermoney = playermoney + bet;
                        showcard=2;
                        wlt=1;

                    }
                    else if(checkhighercardinhand(player, computer)==1){
                        compmoney = compmoney + bet;
                        playermoney = playermoney - bet;
                        showcard=2;
                        wlt=2;
                    }
                    else if(checkhighercardinhand(player, computer)==2){
                        showcard=2;
                        wlt=3;
                    }
                }
                else if(p1==1 && c1==1){
                    if(checkhigherpair(player, computer)==0){
                        compmoney = compmoney - bet;
                        playermoney = playermoney + bet;
                        showcard=2;
                        wlt=1;
                    }
                    else if(checkhigherpair(player, computer)==1){
                        compmoney = compmoney + bet;
                        playermoney = playermoney - bet;
                        showcard=2;
                        wlt=2;
                    }
                    else if(checkhigherpair(player, computer)==2){
                        showcard=2;
                        wlt=3;
                    }
                }
                else if(p1 == c1 && p1 >= 3){
                    int check = checkhigherthanstraight(player, computer);

                    if(check == 0){
                        compmoney = compmoney - bet;
                        playermoney = playermoney + bet;
                        showcard=2;
                        wlt=1;
                    }
                    else if (check == 1){
                        compmoney = compmoney + bet;
                        playermoney = playermoney - bet;
                        showcard=2;
                        wlt=2;
                    }
                    else{
                        showcard=2;
                        wlt=3;
                    }
                }
                else if(p1 == c1 && p1 == 2){
                    showcard=2;
                    wlt=3;
                }
            }

            else{
                playermoney=playermoney-50;
                showcard=2;
                wlt=4;
            }                   
        }
    }

    public static void addComponentsToPane(Container pane) {
        if (RIGHT_TO_LEFT) {
            pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        }

        pane.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        JLabel comp = new JLabel("Computer:");
        if (shouldWeightX) {
            c.weightx = 0.5;
        }
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 0;
        c.insets=new Insets(0,0,100,0);
        pane.add(comp, c);

        JLabel c1 = new JLabel(computer.get(0)+"");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 1;
        c.gridy = 0;
        pane.add(c1, c);

        JLabel c2 = new JLabel(computer.get(1)+"");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 2;
        c.gridy = 0;
        pane.add(c2, c);

        JLabel  c3= new JLabel(computer.get(2)+"");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 3;
        c.gridy = 0;
        pane.add(c3, c);

        JLabel compcash=new JLabel("Dealer has: "+compmoney);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 6;
        c.gridy = 1;
        pane.add(compcash, c);

        JLabel player1 = new JLabel("Player:");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx=.5;
        c.gridx = 0;
        c.gridy = 2;
        pane.add(player1, c);

        JLabel p1 = new JLabel(player.get(0)+"");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 1;
        c.gridy = 2;
        pane.add(p1, c);

        JLabel p2 = new JLabel(player.get(1)+"");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 2;
        c.gridy = 2;
        pane.add(p2, c);

        JLabel p3 = new JLabel(player.get(2)+"");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 3;
        c.gridy = 2;
        pane.add(p3, c);

        JLabel playcash=new JLabel("You have: "+playermoney);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 6;
        c.gridy = 2;
        pane.add(playcash, c);

        JLabel pattern=new JLabel("Your hand is: ");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 6;
        c.gridy = 3;
        pane.add(pattern, c);

        JButton deal = new JButton("Deal");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 0;
        c.gridy = 5;
        pane.add(deal, c);
        deal.addActionListener(new deal());

        JButton fold = new JButton("Fold(Penalty: minus $50)");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 1;
        c.gridy = 5;
        pane.add(fold, c);
        fold.addActionListener(new fold());

        JLabel bet = new JLabel("             Bet:");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 2;
        c.gridy = 5;
        pane.add(bet, c);

        JButton allin = new JButton("All IN");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 3;
        c.gridy = 5;
        pane.add(allin, c);
        allin.addActionListener(new allin());

        JButton ten= new JButton("10");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 4;
        c.gridy = 5;
        pane.add(ten, c);
        ten.addActionListener(new ten());

        JButton fifty = new JButton("50");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 5;
        c.gridy = 5;
        pane.add(fifty, c);
        fifty.addActionListener(new fifty());

        JButton hundred = new JButton("100");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 6;
        c.gridy = 5;
        pane.add(hundred, c);
        hundred.addActionListener(new hundred());

        JButton fivehund = new JButton("500");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 7;
        c.gridy = 5;
        pane.add(fivehund, c);
        fivehund.addActionListener(new fivehund());

        JButton thaud = new JButton("1000");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 8;
        c.gridy = 5;
        pane.add(thaud, c);
        thaud.addActionListener(new thaud());

        JButton fivethaud = new JButton("5000");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 9;
        c.gridy = 5;
        pane.add(fivethaud, c);
        fivethaud.addActionListener(new fivethaud());

        JButton tenthaud = new JButton("10000");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 10;
        c.gridy = 5;
        pane.add(tenthaud, c);
        tenthaud.addActionListener(new tenthaud());

        String mess;
        if(wlt==1)
            mess="You Win The Round!";
        else if(wlt==2)
            mess="Dealer Wins The Round!";
        else if(wlt==3)
            mess="You And Dealer Tie The Round";
        else if(wlt==4)
            mess="You Folded. You Recieve Penalty of Minus $50";
        else if(wlt==5)
            mess="Dealer Loses All Of Its Money, YOU WIN THE WHOLE GAME!";
        else if(wlt==6)
            mess="You Lose All Of You Money, You Lose The Whole Game!";
        else if(wlt==7)
            mess="Please Click Deal Or Fold";
        else if(wlt==8)
            mess="Please Place Your Bet";
        else
            mess="Please Select Another Bet.";

        JLabel message = new JLabel(mess);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0;
        c.gridx = 6;
        c.gridy = 4;
        pane.add(message, c);

        JLabel label = new JLabel("");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.ipady = 40;
        c.weightx = 0.0;
        c.gridwidth = 3;
        c.gridx = 0;
        c.gridy = 2;
        pane.add(label, c);

        label = new JLabel("");
        c.fill = GridBagConstraints.HORIZONTAL;
        c.ipady = 0;       
        c.weighty = 1.0;   
        c.anchor = GridBagConstraints.PAGE_END; 
        c.insets = new Insets(10,0,0,0);  
        c.gridx = 1;       
        c.gridwidth = 2;   
        c.gridy = 2;      
        pane.add(label, c);
    }

    public static void setmoney(){
        compmoney=10000000;
        playermoney=10000000;   
    }

    public static void setcards(){
        player = new hand();
        computer= new hand();
        player.addCard(new cards());
        player.addCard(new cards());
        player.addCard(new cards());
        computer.addCard(new cards());
        computer.addCard(new cards());
        computer.addCard(new cards());
        cardswoprob.correctduplicates(player, computer);
    }

    public static void play(){
        for(int index=0;compmoney>=10&&playermoney>=10;index++){
            wlt=7;
            int p1 = checkpattern(player);
            int c1 = checkpattern(computer);
            while(dealorfold==1){
                if(dealorfold==2){
                    if(p1>c1){
                        compmoney = compmoney - bet;
                        playermoney = playermoney + bet;
                        showcard=2;
                        wlt=1;
                    }
                    else if (p1<c1){
                        compmoney = compmoney + bet;
                        playermoney = playermoney - bet;
                        showcard=2;
                        wlt=2;
                    }
                    else if(p1==0 && c1==0){
                        if(checkhighercardinhand(player, computer)==0){
                            compmoney = compmoney - bet;
                            playermoney = playermoney + bet;
                            showcard=2;
                            wlt=1;

                        }
                        else if(checkhighercardinhand(player, computer)==1){
                            compmoney = compmoney + bet;
                            playermoney = playermoney - bet;
                            showcard=2;
                            wlt=2;
                        }
                        else if(checkhighercardinhand(player, computer)==2){
                            showcard=2;
                            wlt=3;
                        }
                    }
                    else if(p1==1 && c1==1){
                        if(checkhigherpair(player, computer)==0){
                            compmoney = compmoney - bet;
                            playermoney = playermoney + bet;
                            showcard=2;
                            wlt=1;
                        }
                        else if(checkhigherpair(player, computer)==1){
                            compmoney = compmoney + bet;
                            playermoney = playermoney - bet;
                            showcard=2;
                            wlt=2;
                        }
                        else if(checkhigherpair(player, computer)==2){
                            showcard=2;
                            wlt=3;
                        }
                    }
                    else if(p1 == c1 && p1 >= 3){
                        int check = checkhigherthanstraight(player, computer);

                        if(check == 0){
                            compmoney = compmoney - bet;
                            playermoney = playermoney + bet;
                            showcard=2;
                            wlt=1;
                        }
                        else if (check == 1){
                            compmoney = compmoney + bet;
                            playermoney = playermoney - bet;
                            showcard=2;
                            wlt=2;
                        }
                        else{
                            showcard=2;
                            wlt=3;
                        }
                    }
                    else if(p1 == c1 && p1 == 2){
                        showcard=2;
                        wlt=3;
                    }
                }

                else{
                    playermoney=playermoney-50;
                    showcard=2;
                    wlt=4;
                }                   
            }
        }
        if(playermoney > compmoney)
            wlt=5;
        else
            wlt=6;
    }

    public static void main(String[] args) {
        setmoney();
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                while(compmoney>=10&&playermoney>=10)
                createAndShowGUI();
                if(playermoney > compmoney)
                    wlt=5;
                else
                    wlt=6;
            }
        });
    }
}

The major problem is that in createAndShowGUI() , if I put that while loop, which I tried (for loop, do loop) there, the JPanel will just show up but nothing in there. If there is no while loop in there, the JPanel will show up regularly with all the stuff on there. But I need the the code inside the while loop, for the code there is basically the game.

I tried to make a method of its own( play() ), but if I call it in main() , or anywhere, the JPanel will be white(nothing).

Here's my 2nd question: If you delete the while loop and the JPanel shows up normally, you'll see the computer's hand and player's hand, but in text form. I want to know how to substitute the text with images.

There are few things, not all of them are directly GUI related:

Lose static members , they should not be there, I assume you used them since everything is called from the main method, but this is not the way to go. Java is an object oriented programming language, create classes, instantiate them and use them, don't perform all the work in one class, which is not even instantiated.

Refactor repeating code , instead of creating different classes with the difference of one value, create more generic classes. For example, instead of 5 different classes like that:

static class ten implements ActionListener{
    public void actionPerformed(ActionEvent e){
        if(playermoney<10)
            wlt=9;          
        else
            bet=10;
    }
}

Declare one class like this:

static class ten implements ActionListener{
    int money;
    public ten(int money) {
        this.money = money
    }
    public void actionPerformed(ActionEvent e){
        if(playermoney<money)
            wlt=9;          
        else
            bet=money;
    }
}

and instantiate it with the appropriate int according to the case.

Let the application be event driven . Since the player has to interact, don't use a big while loop, instead trigger the events (eg what case happened now) from the listeners (ie user pressed a button)

Related to the previous point, don't perform long actions (like your entire program) on the UI thread, it will not let the UI be updated, perform all the work on a background thread, and when you need to alter the UI, use SwingUtilities.invokeLater(Runnable) . I think you might find this tutorial helpful.

For the GUI, you should implement Runnable and use SwingUtilities.invokeLater(Runnable) :

public class Foo implements Runnable {
    public static void main(String[] args) {
       SwingUtilities.invokeLater(new Foo());
    }

    public void run() {
        ...
    }
}

In order to use images, you should use the ImageIcon class:

ImageIcon imageIcon = new ImageIcon("<path to image>");

or alternatively if you already have an Image object:

ImageIcon imageIcon = new ImageIcon(image);

then to display it:

JLabel imageLabel = new JLabel(imageIcon);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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