简体   繁体   中英

JButton doesn't appear until clicked

For this program, the JButton doesn't seem to show up unless you click the area where the JButton should be; the JFrame starts up blank. The moment you click the button, the respective code runs and the button finally shows up.

How do I get the buttons to show up upon starting the program?

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
/*
The Amazing BlackJack Advisory Tool by JoshK,HieuV, and AlvinC.
Prepare to be amazed :O
 */
public class BlckJackUI {
    //main class, will contain the JFrame of the program, as well as all the buttons.
    public static void main(String args[])
    {
    //Creating the JFrame
    JFrame GUI = new JFrame("Blackjack Advisor");
    GUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GUI.setSize(1300, 900);
    GUI.setContentPane(new JLabel(new ImageIcon("C:\\Users\\Hieu Vo\\Desktop\\Green Background.png")));
    GUI.setVisible(true);
    // Because each button needs to run through the Math class.
    final Math math = new Math();
    // The Ace Button:
    ImageIcon Ace = new ImageIcon("/Users/computerscience2/Downloads/Ace.jpg");
    JButton ace = new JButton(Ace);
    ace.setSize(300, 100);
    ace.setLocation(100, 100);
    ace.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            //Automatically default the the Ace to 11, and if Bust, Ace becomes 1. 
            if (math.array.playerhandtotal <= 21)
            {
                math.cardvalue = math.cardvalue + 11;
            }
            else
            {
                math.cardvalue = math.cardvalue + 1;
            }
            math.array.clicktracker++;
            math.calcResult();
            JOptionPane.showMessageDialog(null,math.array.result);
        }
    });
    GUI.add(ace);
    ImageIcon Two = new ImageIcon("/Users/computerscience2/Downloads/2.jpg");
    JButton two = new JButton(Two);
    two.setSize(300, 100);
    two.setLocation(100, 200);
    two.addActionListener(new ActionListener ()
    {
        public void actionPerformed(ActionEvent e)
        {
            /*
                This generally repeats throughout the whole class, and the only
                thing different is the changing cardvalue. When a button is pressed,
                respective cardvalues are added into the playerhand ArrayList, and
                totaled up to form playerhandtotal, which is a major factor in 
                bringing up the advice.
             */
            math.cardvalue = math.cardvalue + 2;
            math.array.clicktracker++;
            math.calcResult();
            JOptionPane.showMessageDialog(null,math.array.result);
        }
    });
    GUI.add(two);

Et cetera, Et cetera... Just a bunch of the same stuff, more buttons coded the same exact way as JButton two, but with different value associated to them.

    JButton start = new JButton("Start/Reset");
    start.setSize(300, 100);
    start.setLocation(500,500);
    start.addActionListener(new ActionListener ()
    {
        public void actionPerformed(ActionEvent e)
        {
            /*
            The start button also acts like a reset button, and the concept is fairly
            simple. If we reset all the important values to 0 or "null," then the 
            program acts as if it was just opened.
             */
            Arrays array = new Arrays();
            array.playerhand.clear();
            array.dealer = 0;
            math.array.starttracker++;
            math.array.clicktracker = 0;
            array.playerhandtotal = 0;
            math.cardvalue = 0;
            array.result = null;
            JOptionPane.showMessageDialog(null,"Please select the card \nthat the dealer is showing :)");

        }
    });
    GUI.add(start);
    GUI.setLayout(null);

This is all in the same class, and I understand a layout would be nicer, but perhaps there's a way to fix this issue using what I have now?

The program starts blank because you are calling setVisible before you add components. Call setVisible after you add components (in the end of contructor) and it should work fine. Also, avoid absolute positioning and call of set|Preferred|Minimum|MaximumSize methods for your components. Learn how to use layout managers.

Write GUI.validate(); after you add all the components to your frame. Any time you add something to a frame you have to validate it like this. Otherwise, you will get the behavior that you have described.

No. The problem is caused by the layout. Before adding anything to a JFrame or a JPanel which you want it to have an absolute position, you have to setLayout(null). Otherwise, you'll have unexpected behaviours all the time. I just figured it out by myself after three hours of experimenting; suddenly, I connected your post with other different subject, and it worked, but this isn't well explained on the Internet yet.

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