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