Java 为什么我必须在第一次运行时超鼠标才能看到JButtons?

Java 为什么我必须在第一次运行时超鼠标才能看到JButtons?,java,swing,jbutton,Java,Swing,Jbutton,im构建2d棋盘游戏,当我运行主类时,框架打开正常,但JButtons不可见,只有当我用鼠标点击按钮时,它们才会变为可见。有什么想法吗 鼠标悬停图像之前: 鼠标悬停图像后: 编辑:现在我发现,如果我最小化窗口,所有的按钮都会再次消失,希望这能对你们有所启示 PanelTest.java: import java.awt.*; import java.awt.event.*; import java.io.*; import javax.imageio.*; import javax.swi

im构建2d棋盘游戏,当我运行主类时,框架打开正常,但JButtons不可见,只有当我用鼠标点击按钮时,它们才会变为可见。有什么想法吗

鼠标悬停图像之前:

鼠标悬停图像后:

编辑:现在我发现,如果我最小化窗口,所有的按钮都会再次消失,希望这能对你们有所启示

PanelTest.java:

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

import javax.imageio.*;
import javax.swing.*;

import sun.audio.*;

public class PanelTest
{  


    public static void main(String[] args)
    {  
        ImageFrame frame = new ImageFrame();
        frame.setResizable(false);

    }
}

class ImageFrame extends JFrame
{

    public ImageFrame()
    {   
        super();
        setTitle("Jumping Beans");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        Container C=getContentPane();
        C.setLayout(new BorderLayout());
        ImagePanel panel = new ImagePanel();
        panel.setPreferredSize(new Dimension(650, 650));
        C.add(panel,BorderLayout.CENTER);
        panel.whoStart();

        JPanel sideBar = new JPanel();
        sideBar.setPreferredSize(new Dimension(200, 650));
        panel.setAlignmentX(Component.CENTER_ALIGNMENT);
        JButton exit=new JButton("exit");
        exit.addActionListener(new ActionListener() 
        {   
            @Override
            public void actionPerformed(ActionEvent e) 
            {
                System.exit(DISPOSE_ON_CLOSE);
            }
        });
        JButton MusicStart=new JButton("play music");
        MusicStart.addActionListener(new ActionListener() 
        {   

            @Override
            public void actionPerformed(ActionEvent e) 
            {
                panel.music();

            }
        });

        sideBar.setBackground(Color.lightGray);
        sideBar.add(exit);
        sideBar.add(MusicStart);
        C.add(sideBar, BorderLayout.EAST);

        JPanel bottom = new JPanel();
        bottom.setBackground(Color.lightGray);
        panel.turn = new JLabel();
        bottom.add(panel.turn);
        C.add(bottom, BorderLayout.SOUTH);  

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel.changeLabel();
        this.setVisible(true);



    }

    public static final int DEFAULT_WIDTH = 850;
    public static final int DEFAULT_HEIGHT = 650; 
}

class ImagePanel extends JPanel
{  
    public ImagePanel()
    {  
        super();
        this.setLayout(new GridLayout(11,11));
        AL=new ActionListener()
        {
            int numClicks =0 ;
            Slot source;
            Slot target;
            SlotButton sourceButton;
            SlotButton targetButton;

            @Override
            public void actionPerformed(ActionEvent e) 
            {

                if(numClicks==0)
                {
                    if(boardi.whoWins(boardi.getS()))
                    {
                        sourceButton=(SlotButton) e.getSource();
                        source=new Slot(sourceButton.getX(),sourceButton.getY(),sourceButton.getColor());
                        if(boardi.getTor()!=source.getColor())
                            numClicks--;
                        System.out.println("source num "+source.getRow()+","+source.getCol()+" clicked");
                        numClicks++;
                    }
                }
                else if(numClicks==1)
                {

                    targetButton=(SlotButton) e.getSource();
                    target=new Slot(targetButton.getX(),targetButton.getY(),targetButton.getColor());
                    System.out.println("target num "+target.getRow()+","+target.getCol()+" clicked");
                    if(boardi.LogiisMoving(source,target))
                    {
                        updateLogi(source,target);
                        updateGraphFromLogi(Buttons, boardi);
                        changeTor();
                        changeLabel();
                        //boardi.printBoard();


                    }
                    else if(boardi.LogiisEating(source,target))
                    {
                        System.out.println("Doing IsEating");
                        updateLogiEat(source, target);
                        updateGraphFromLogi(Buttons, boardi);
                        changeTor();
                        changeLabel();
                        if(!boardi.whoWins(boardi.getS()))
                            EndGame();
                        //boardi.printBoard();

                    }
                    else
                        if(target==source)numClicks++;
                    numClicks--;
                }


            }


        };


        try
        {
            image = ImageIO.read(new File("Images/background.png"));
            blueBean = ImageIO.read(new File("Images/blue_bean.png"));
            redBean = ImageIO.read(new File("Images/red_bean.png"));
            empty = ImageIO.read(new File("Images/Empty.png"));
            safeWall = ImageIO.read(new File("Images/safeWall.bmp"));
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        Buttons=new SlotButton[11][11];

        for(int i=0;i<11;i++)
        {
            for(int j=0;j<11;j++)
            {
                Buttons[i][j]=new SlotButton(i,j,boardi.getS()[i][j].getColor());
                Buttons[i][j].addActionListener(AL);
                this.add(Buttons[i][j]);

            }
        }
        //repaint();

    }

public SlotButton [][] getButtons() 
{
    return Buttons;
}
public void EndGame()
{
    char winner=boardi.whoWinner(boardi.getS());
    for(int i=0;i<11;i++)
        for(int j=0;j<11;j++)
            Buttons[i][j].setEnabled(false);
    WinnerLabel(winner);
}

public void updateLogi(Slot source,Slot target)
{
    boardi.getS()[target.getRow()][target.getCol()].setColor(source.getColor());
    boardi.getS()[source.getRow()][source.getCol()].setColor('e');
}

public void updateLogiEat(Slot source,Slot target)
{
    boardi.getS()[target.getRow()][target.getCol()].setColor(source.getColor());
    boardi.getS()[source.getRow()][source.getCol()].setColor('e');
    boardi.getS()[boardi.getXofMiddle(source, target)][boardi.getYofMiddle(source, target)].setColor('e');
    System.out.println("middle row= "+boardi.getS()[boardi.getXofMiddle(source, target)][boardi.getYofMiddle(source, target)].getRow()+", middle col= "+boardi.getS()[boardi.getXofMiddle(source, target)][boardi.getYofMiddle(source, target)].getCol()+",middle color= "+boardi.getS()[boardi.getXofMiddle(source, target)][boardi.getYofMiddle(source, target)].getColor());
}

public void updateGraphFromLogi(SlotButton[][] buttons,board boardi) 
{
    char color='e';
    for(int i=0;i<11;i++)
        for(int j=0;j<11;j++)
        {
            color=boardi.getS()[i][j].getColor();
            buttons[i][j].setColor(color);
        }
}


//======================until here its logi rules======================================



public void changeLabel() 
{
    char t=boardi.getTor();
    System.out.println("changeLabel="+t);
    switch(t)
    {
    case 'r': turn.setText("Its turn of red player");
    break;

    case 'b': turn.setText("Its turn of blue player");
    break;
    }
}
public void WinnerLabel(char winner) 
{
    switch(winner)
    {
    case 'r': turn.setText("Its Winning of red player!");
    break;

    case 'b': turn.setText("Its Winning of blue player!");
    break;

    case 'd': turn.setText("Its a Draw!");
    break;

    case 'o': turn.setText("You Have To Finish The Game In One Move!");
    break;

    case 'x':break;
    }
}

public void printBordi(board a)
{
    for(int i=0;i<7;i++)
    {
        System.out.printf("-----------------------------------");
        System.out.printf("\n");
        for(int j=0;j<7;j++)
            System.out.printf("| %c |",a.getS()[i][j].getColor());
        System.out.printf("\n");
    }
    System.out.printf("-----------------------------------");
}

public board getBoard()
{
    return boardi;
}
public void changeTor()
{
    char tor=boardi.getTor();
    if(tor=='b')
    {
        boardi.setTor('r');
    }

    else
        boardi.setTor('b');
    System.out.println("ChangedTor="+boardi.getTor());
}

public void whoStart()
{
    String input="";
    input=JOptionPane.showInputDialog("Enter the color of the first player, b for Blue and r for Red");
    System.out.println("input="+input);
    if((input.equals("b"))||(input.equals("B")))
        boardi.setTor('b');
    else if((input.equals("r"))||(input.equals("R")))
        boardi.setTor('r');
    System.out.println("tor="+boardi.getTor());
}

//=================================from here its finish game rules===========================


public int getTurn()
{
    return comOrHum;
}
public void setTurn(int num)
{
    this.comOrHum+=num;
}
JLabel turn;
private ActionListener AL;
private Image image;
public int comOrHum=1;
public static Image redBean;
public static Image blueBean;
public static Image empty;
public static Image safeWall;
private int numClicks=0;
private board boardi = new board();
private SlotButton[][] Buttons;

//=================Music===================
public static void music() 
{   
    AudioStream BGM=null;

    AudioPlayer  MGP = AudioPlayer.player;

    AudioData MD;

    ContinuousAudioDataStream loop = null;

    try
    {
        InputStream test = new FileInputStream("Music/gameMusic.wav");
        BGM = new AudioStream(test);
        AudioPlayer.player.start(BGM);
    }
    catch(FileNotFoundException e){
        System.out.print(e.toString());
    }
    catch(IOException error)
    {
        System.out.print(error.toString());
    }
    MGP.start(loop);

}
//============Side Bar Buttons========================================

}
import java.awt.*;
导入java.awt.event.*;
导入java.io.*;
导入javax.imageio.*;
导入javax.swing.*;
导入sun.audio.*;
公开课小组测验
{  
公共静态void main(字符串[]args)
{  
ImageFrame=新的ImageFrame();
frame.setresizeable(false);
}
}
类ImageFrame扩展了JFrame
{
公共图像帧()
{   
超级();
片名(“跳豆”);
设置大小(默认宽度、默认高度);
容器C=getContentPane();
C.setLayout(新的BorderLayout());
ImagePanel=新的ImagePanel();
面板。设置首选尺寸(新尺寸(650650));
C.添加(面板、边框布局、中心);
panel.whoStart();
JPanel侧边栏=新的JPanel();
侧边栏。设置首选尺寸(新尺寸(200650));
面板.setAlignmentX(组件.中心对齐);
JButton exit=新JButton(“exit”);
exit.addActionListener(新ActionListener()
{   
@凌驾
已执行的公共无效操作(操作事件e)
{
系统退出(在关闭时处理);
}
});
JButton MusicStart=新JButton(“播放音乐”);
MusicStart.addActionListener(新ActionListener()
{   
@凌驾
已执行的公共无效操作(操作事件e)
{
panel.music();
}
});
侧边栏。背景(颜色。浅灰色);
添加(退出);
侧边栏。添加(MusicStart);
C.添加(侧栏,边框布局。东);
JPanel bottom=新的JPanel();
底部。背景(颜色。浅灰色);
panel.turn=新的JLabel();
底部。添加(面板。旋转);
C.添加(底部,边界布局,南部);
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.changelab();
此.setVisible(true);
}
公共静态最终整数默认值_宽度=850;
公共静态最终int默认值_高度=650;
}
类ImagePanel扩展了JPanel
{  
公众影像小组()
{  
超级();
这个.setLayout(新的GridLayout(11,11));
AL=新建ActionListener()
{
int numClicks=0;
时隙源;
时隙目标;
SlotButton源按钮;
SlotButton目标按钮;
@凌驾
已执行的公共无效操作(操作事件e)
{
如果(numClicks==0)
{
if(boardi.whoWins(boardi.get()))
{
sourceButton=(SlotButton)e.getSource();
source=新插槽(sourceButton.getX(),sourceButton.getY(),sourceButton.getColor());
if(boardi.getTor()!=source.getColor())
numClicks--;
System.out.println(“source num”+source.getRow()+,“+source.getCol()+”单击”);
numClicks++;
}
}
else if(numClicks==1)
{
targetButton=(SlotButton)e.getSource();
target=新插槽(targetButton.getX(),targetButton.getY(),targetButton.getColor());
System.out.println(“target num”+target.getRow()+,“+target.getCol()+”单击);
if(boardi.LogiisMoving(源、目标))
{
updateLogi(源、目标);
updateGraphFromLogi(按钮、boardi);
转换器();
changelab();
//boardi.printBoard();
}
else if(boardi.LogiisEating(源、目标))
{
System.out.println(“正在进行IsEating”);
updateLogiEat(源、目标);
updateGraphFromLogi(按钮、boardi);
转换器();
changelab();
如果(!boardi.whoWins(boardi.get()))
结束游戏();
//boardi.printBoard();
}
其他的
if(target==source)numClicks++;
numClicks--;
}
}
};
尝试
{
image=ImageIO.read(新文件(“Images/background.png”);
blueBean=ImageIO.read(新文件(“Images/blue_bean.png”);
redBean=ImageIO.read(新文件(“Images/red_bean.png”);
empty=ImageIO.read(新文件(“Images/empty.png”);
safeWall=ImageIO.read(新文件(“Images/safeWall.bmp”);
}
捕获(IOE异常)
{
e、 printStackTrace();
}
按钮=新的减速按钮[11][11];

对于(int i=0;i与您的问题无关,但:

  • 变量名称不应以大写字符开头。大多数名称都是正确的,但许多名称都不正确。请保持一致

  • 方法名称不应以大写字符开头。同样,大多数都是正确的,但许多都不是。没有理由不一致

  • 类名应该以大写字母开头。同样,大多数都以大写字母开头,但有些不以大写字母开头

  • setresizeable(true)
    语句应该在使框架可见之前调用。(我不确定,它甚至可能需要在setSize()方法之前调用)。在任何情况下,is都不应该是e
         import java.awt.Image;
         import java.util.ArrayList;
    
    public class board extends PanelTest
    {
    
        private Slot[][] s = new Slot[11][11];
        private char tor='b';
        public board()
        {
            super();
            for(int i=0;i<2;i++)
                for(int j=0;j<11;j++)
                    s[i][j]=new Slot(i,j,'x');
            for(int i=9;i<11;i++)
                for(int j=0;j<11;j++)
                    s[i][j]=new Slot(i,j,'x');
            for(int i=0;i<2;i++)
                for(int j=2;j<9;j++)
                    s[j][i]=new Slot(i,j,'x');
            for(int i=9;i<11;i++)
                for(int j=2;j<9;j++)
                    s[j][i]=new Slot(i,j,'x');
            for(int i=2;i<5;i++)
                for(int j=2;j<9;j++)
                    s[i][j]=new Slot(i,j,'b');
            for(int i=6;i<9;i++)
                for(int j=2;j<9;j++)
                    s[i][j]=new Slot(i,j,'r');
            for(int j=2;j<5;j++)
                s[5][j]=new Slot(5,j,'b');
            for(int j=6;j<9;j++)
                s[5][j]=new Slot(5,j,'r');
            s[5][5]=new Slot(5,5,'e');
    
        }
    
    
        public board newBoard(Slot[][] b) 
        {
    
            board f=new board();
            f.s=b;
            return f;
        }
    
    
        public Slot[][] getS() 
        {
            return s;
        }
    
        public Slot getSlot(int i,int j)
        {
            return s[i][j];
        }
    
        public void printBoard()
        {
            for(int i=0;i<11;i++)
            {
                System.out.printf("-----------------------------------");
                System.out.printf("\n");
                for(int j=0;j<11;j++)
                    System.out.printf("| %c |",s[i][j].getColor());
                System.out.printf("\n");
            }
            System.out.printf("-----------------------------------");
        }
    
        //==================================================================
    
        public boolean LogicheckMove(Slot source,Slot target)
        {
            if((source.getRow()==target.getRow())&&(source.getCol()==target.getCol())) // source and target are the same slot
                return false;       
            if((target.getColor()!='e')||(source.getColor()=='e'))
                return false;   
            System.out.println("LogicheckMove is true");
            return true;
        }
    
        public boolean LogiemptyNei(Slot source,Slot target)
        {
            int row=source.getRow();
            int col=source.getCol();
            if(row<=8)
            {
                if(s[row+1][col].getColor()=='e')
                    //if(s[row+1][col]==target)
                    return true;
            }
            if(row>=2)
            {
                if(s[row-1][col].getColor()=='e')
                    //if(s[row-1][col]==target)
                    return true;
            }
            if(col<=8)
            {
                if(s[row][col+1].getColor()=='e')
                    //if(s[row][col+1]==target)
                    return true;
            }
            if(col>=2)
            {
                if(s[row][col-1].getColor()=='e')
                    //if(s[row][col-1]==target)
                    return true;
            }
            return false;
        }
    
        public boolean LogiisMoving(Slot source,Slot target)
        {
            int row=source.getRow();
            int col=source.getCol();
            System.out.println("source x="+source.getRow()+"y="+source.getCol());
            System.out.println("target x="+target.getRow()+"y="+target.getCol());
            if(!LogicheckMove(source,target))
            {   
                System.out.println("The Move Is illigel");
                return false;
            }
            if(!LogiemptyNei(source,target))
            {   
                System.out.println("The Move Is illigel2");
                return false;
            }
            if(!distanceIsOkForMoving(source,target))
                return false;
            System.out.println("The Move Is ligel");
    
            return true;
        }
    
        public boolean distanceIsOkForMoving(Slot source,Slot target)
        {
            if((distanceOfRow(source,target)!=1)||(distanceOfCol(source,target)!=1))
                return false;
            return true;
        }
        public int distanceOfRow(Slot source, Slot target) 
        {
    
            return Math.abs(source.getRow()-target.getRow());
        }
        public int distanceOfCol(Slot source, Slot target) 
        {
    
            return Math.abs(source.getCol()-target.getCol());
        }
    
    
        public boolean LogiisEating(Slot source,Slot target)
        {
            System.out.println("Inside IsEating");
            int row=source.getRow();
            int col=source.getCol();
            if(!LogicheckMove(source,target))
            {   
                System.out.println("The Eating Is illigel");
                return false;
            }
            if(!LogirightEat(source,target))
            {
                System.out.println("Not rightEat");
                return false;
            }
    
            return true;
    
        }
        public boolean LogirightEat(Slot source, Slot target) 
        {   
    
            //not wrote yet
            return true;
        }
    
        public boolean whoWins(Slot [][] board)
        {
            int bluecount=0,redcount=0;
            for(int i=2;i<9;i++)
                for(int j=2;j<9;j++)
                    if(board[i][j].getColor()=='r')
                        redcount++;
                    else  if(board[i][j].getColor()=='b')
                        bluecount++;
            if(redcount==0)
            {
                System.out.println("Blue Wins!");
                return false;
            }
            else if(bluecount==0)
            {
                System.out.println("Red Wins!");
                return false;
            }
            else if((bluecount==1)&&(redcount==1))
            {
                Slot source=null;
                Slot target=null;
                for(int i=2;i<9;i++)
                    for(int j=2;j<9;j++)
                        if(board[i][j].getColor()=='r')
                            source=s[i][j];
                        else  if(s[i][j].getColor()=='b')
                            target=s[i][j];
                if(LogiisEating(source,target))
                {
                    System.out.println("You Have To Finish The Game In One Move!");
                }
                else
                {
                    System.out.println("Draw!");
                    return false;
                }
    
            }
            return true;
        }
    
        public char whoWinner(Slot [][] board)
        {
            int bluecount=0,redcount=0;
            for(int i=2;i<9;i++)
                for(int j=2;j<9;j++)
                    if(board[i][j].getColor()=='r')
                        redcount++;
                    else  if(board[i][j].getColor()=='b')
                        bluecount++;
            if(redcount==0)
            {
                return 'b';
            }
            else if(bluecount==0)
            {
                return 'r';
            }
            else if((bluecount==1)&&(redcount==1))
            {
                Slot source=null;
                Slot target=null;
                for(int i=2;i<9;i++)
                    for(int j=2;j<9;j++)
                        if(board[i][j].getColor()=='r')
                            source=s[i][j];
                        else  if(s[i][j].getColor()=='b')
                            target=s[i][j];
                if(LogiisEating(source,target))
                {
                    return 'o';
                }
                else
                {
                    return 'd';
                }
    
            }
            return 'x';
        }
    
    
    
        public int getXofMiddle(Slot source,Slot target)
        {
            int row=source.getRow();
            if(target.getRow()-2==row)
                return row+1;
            else if(target.getRow()+2==row)
                return row-1;
            return row;
        }
    
        public int getYofMiddle(Slot source,Slot target)
        {
            int col=source.getCol();
            if(target.getCol()-2==col)
                return col+1;
            else if(target.getCol()+2==col)
                return col-1;
            return col;
        }
    
        public char getTor() {
            return tor;
        }
    
    
        public void setTor(char tor) {
            this.tor = tor;
        }
    
    
    
        }