我做了一个Restart的JComboBox,点了以后会再调一遍init函数重新生成新的雷区。
函数如下: private void init()
{
container=getContentPane();
container.setLayout(new BorderLayout());
labelPanel = new JPanel();
labelPanel.setLayout( new FlowLayout() ); remainingMines = new JLabel ( "Mines remaining: "+ minenum);
select=new JComboBox(names);
//select.setMaximumRowCount(6);
labelPanel.add( select );
labelPanel.add( remainingMines );
container.add( BorderLayout.NORTH, labelPanel );
buttonPanel = new JPanel();
buttonPanel.setLayout( new GridLayout(vandr,vandr) );
mines= new MineButton [vandr+2][vandr+2];
flag=minenum;
for (i = 0; i < vandr+2; i++ ){
for(j = 0; j < vandr+2; j++ )
{
mines[i][j] = new MineButton();
//mines[i][j].setBackground(Color.yellow);
//mines[i][j].show();
}
}
for (i = 1; i < vandr+1; i++ ){
for(j = 1; j < vandr+1; j++ )
{
mines[i][j].sequence=i*vandr+j;
buttonPanel.add( mines[i][j] );
}
} container.add(BorderLayout.CENTER,buttonPanel); setSize (676,560);
setVisible (true);
for(int c=0;c<minenum;c++)
{
Random random = new Random();
int u=Math.abs(random.nextInt())%vandr+1;
int v=Math.abs(random.nextInt())%vandr+1;
if(mines[u][v].value!=1)
{
mines[u][v].value=1;
}
else if(mines[u][v].value==1)
{
c--;
}
}
for (i = 1; i < vandr+1; i++ ){
for(j = 1; j < vandr+1; j++ ){
if(mines[i-1][j-1].value==1)
mines[i][j].round++;
if(mines[i-1][j].value==1)
mines[i][j].round++;
if(mines[i-1][j+1].value==1)
mines[i][j].round++;
if(mines[i][j-1].value==1)
mines[i][j].round++;
if(mines[i][j+1].value==1)
mines[i][j].round++;
if(mines[i+1][j-1].value==1)
mines[i][j].round++;
if(mines[i+1][j].value==1)
mines[i][j].round++;
if(mines[i+1][j+1].value==1)
mines[i][j].round++;
}
}
ButtonHandler handlerbutton=new ButtonHandler();
select.addItemListener( new CheckBoxListener());
for ( i = 1; i < vandr+1; i++ ){
for( j = 1; j < vandr+1; j++ )
{
mines[i][j].addMouseListener(handlerbutton);
}
}
this.doLayout();
repaint();
}这是我写的下拉菜单处理事件(我刚学Java,写的很烂)
private class CheckBoxListener implements ItemListener
{
public void itemStateChanged( ItemEvent event )
{
JComboBox JB=(JComboBox)event.getSource();
if(event.getStateChange()==ItemEvent.SELECTED)
{
if(JB.getSelectedIndex()==1)
{
buttonPanel.removeAll();
labelPanel.removeAll();
//remove(buttonPanel);
//remove(labelPanel);
init();
}
if(JB.getSelectedIndex()==2)
{
buttonPanel.removeAll();
labelPanel.removeAll();
vandr=10;
minenum=10;
init();
}
if(JB.getSelectedIndex()==3)
{
buttonPanel.removeAll();
labelPanel.removeAll();
vandr=15;
minenum=30;
init();
}
if(JB.getSelectedIndex()==4)
{
buttonPanel.removeAll();
labelPanel.removeAll();
vandr=20;
minenum=40;
init();
}
if(JB.getSelectedIndex()==5)
{
buttonPanel.removeAll();
labelPanel.removeAll();
enter();
init();
}
}
}
}
函数如下: private void init()
{
container=getContentPane();
container.setLayout(new BorderLayout());
labelPanel = new JPanel();
labelPanel.setLayout( new FlowLayout() ); remainingMines = new JLabel ( "Mines remaining: "+ minenum);
select=new JComboBox(names);
//select.setMaximumRowCount(6);
labelPanel.add( select );
labelPanel.add( remainingMines );
container.add( BorderLayout.NORTH, labelPanel );
buttonPanel = new JPanel();
buttonPanel.setLayout( new GridLayout(vandr,vandr) );
mines= new MineButton [vandr+2][vandr+2];
flag=minenum;
for (i = 0; i < vandr+2; i++ ){
for(j = 0; j < vandr+2; j++ )
{
mines[i][j] = new MineButton();
//mines[i][j].setBackground(Color.yellow);
//mines[i][j].show();
}
}
for (i = 1; i < vandr+1; i++ ){
for(j = 1; j < vandr+1; j++ )
{
mines[i][j].sequence=i*vandr+j;
buttonPanel.add( mines[i][j] );
}
} container.add(BorderLayout.CENTER,buttonPanel); setSize (676,560);
setVisible (true);
for(int c=0;c<minenum;c++)
{
Random random = new Random();
int u=Math.abs(random.nextInt())%vandr+1;
int v=Math.abs(random.nextInt())%vandr+1;
if(mines[u][v].value!=1)
{
mines[u][v].value=1;
}
else if(mines[u][v].value==1)
{
c--;
}
}
for (i = 1; i < vandr+1; i++ ){
for(j = 1; j < vandr+1; j++ ){
if(mines[i-1][j-1].value==1)
mines[i][j].round++;
if(mines[i-1][j].value==1)
mines[i][j].round++;
if(mines[i-1][j+1].value==1)
mines[i][j].round++;
if(mines[i][j-1].value==1)
mines[i][j].round++;
if(mines[i][j+1].value==1)
mines[i][j].round++;
if(mines[i+1][j-1].value==1)
mines[i][j].round++;
if(mines[i+1][j].value==1)
mines[i][j].round++;
if(mines[i+1][j+1].value==1)
mines[i][j].round++;
}
}
ButtonHandler handlerbutton=new ButtonHandler();
select.addItemListener( new CheckBoxListener());
for ( i = 1; i < vandr+1; i++ ){
for( j = 1; j < vandr+1; j++ )
{
mines[i][j].addMouseListener(handlerbutton);
}
}
this.doLayout();
repaint();
}这是我写的下拉菜单处理事件(我刚学Java,写的很烂)
private class CheckBoxListener implements ItemListener
{
public void itemStateChanged( ItemEvent event )
{
JComboBox JB=(JComboBox)event.getSource();
if(event.getStateChange()==ItemEvent.SELECTED)
{
if(JB.getSelectedIndex()==1)
{
buttonPanel.removeAll();
labelPanel.removeAll();
//remove(buttonPanel);
//remove(labelPanel);
init();
}
if(JB.getSelectedIndex()==2)
{
buttonPanel.removeAll();
labelPanel.removeAll();
vandr=10;
minenum=10;
init();
}
if(JB.getSelectedIndex()==3)
{
buttonPanel.removeAll();
labelPanel.removeAll();
vandr=15;
minenum=30;
init();
}
if(JB.getSelectedIndex()==4)
{
buttonPanel.removeAll();
labelPanel.removeAll();
vandr=20;
minenum=40;
init();
}
if(JB.getSelectedIndex()==5)
{
buttonPanel.removeAll();
labelPanel.removeAll();
enter();
init();
}
}
}
}
每次点击之后都会调用,就可以了
如果你在paint方法中用if语句限制一下,在重新开始游戏时不重划!可能不会出现这样的刷新问题!