如何解决错误?摆动按钮重绘

时间:2014-11-04 01:59:59

标签: java swing menu jframe

我正在使用菜单尝试更改按钮编号。 但这不应该刷新。 我该如何解决这个问题? 我想'文件 - >修改 - >按钮10x10 - > 20x20更改。 “ 要测试和修改下面的源代码。请...

请给我更改来源。 TT

package com.test;

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class MineMain extends JFrame {

    private GridLayout grid;
    private JPanel jp;
    private int rownum, colnum;
    private JButton[][] btn = null;

    public MineMain(){
        super("MINE");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Menu_Init();
//      grid = new GridLayout();
//      jp = new JPanel();
        rownum = 10;
        colnum = 10;

        Init(200, 250);
    }

    private void setBtn(int row, int col){
        btn = new JButton[row][col];
    }

    public void Init(int w, int h){
        if(jp != null)
            jp.removeAll();
        else
            jp = null;

        btn = null;
        jp = null;
//      jp.removeAll();

        grid = new GridLayout(rownum, colnum, 0, 0);
        jp = new JPanel(grid);

        setBtn(rownum, colnum);

        for(int i=0;i<btn.length;i++){
            for(int j=0;j<btn[i].length;j++){
                btn[i][j] = new JButton();  
                jp.add(btn[i][j]);
            }
        }

//      jp.revalidate();
//      jp.repaint();

        this.add(jp);

        this.setSize(w, h);
        this.setLocation(200, 200);
        this.setVisible(true);
        this.setResizable(false);

    }

    public void Menu_Init(){
        JMenuBar bar = new JMenuBar();
        setJMenuBar(bar);

        JMenu filemenu = new JMenu("File(F)");
        filemenu.setMnemonic('F');

        JMenuItem startmenu = new JMenuItem("New Game(N)");
        startmenu.setMnemonic('N');
        startmenu.setActionCommand("NEW START");
        startmenu.addActionListener(new MenuActionListener());
        filemenu.add(startmenu);

        JMenuItem minecntmenu = new JMenuItem("MINE MODIFY(M)");
        minecntmenu.setMnemonic('M');
        minecntmenu.setActionCommand("MODIFY");
        minecntmenu.addActionListener(new MenuActionListener());
        filemenu.add(minecntmenu);

        JMenuItem close = new JMenuItem("CLOSE(C)");
        close.setMnemonic('C');
        filemenu.add(close);
        bar.add(filemenu); //JMenuBar에 JMenu 부착

    }

    private class MenuActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e){
            if(e.getActionCommand().equals("START")){
                JOptionPane.showMessageDialog(null, "NEW GAME", "MINE", JOptionPane.YES_NO_OPTION);
            } else if(e.getActionCommand().equals("MODIFY")){
                modify(2);
            }
        }
    }

    private void modify(int lvl){
        rownum = 20;
        colnum = 20;

        Init(400, 500);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new MineMain();
    }

}

1 个答案:

答案 0 :(得分:3)

我发现您在Init()上再次呼叫modify()

Init()内,我假设您正在使用

if(jp != null)
  jp.removeAll();
else
  jp = null;

清除JPanel?

您希望在继续此处之前从JFrame(即jp)中移除现有的JPanel(即this)。

因此,您可以将代码更改为

if(jp != null) {
  // JPanel already exists. so, remove JPanel jp from the JFrame
  this.remove(jp);
  jp.removeAll();
} else
  jp = null;