基本上我用的都是swing的组件,用awt的效果是不是会好一些我没有去试.
使用了一个Box布局,里面有一个使用了GridLayout布局的JPanel是用来填满按钮用的.**问题一:
windows的扫雷大家一定都见识了吧,它雷区中的按钮都是很小巧的,可是JButton定义出来的按钮在默认或者指定较小象素值的长宽后始终都显得较大,要是这样的话,玩高级扫雷一横行就30个格,我怕屏幕着不开哈,不知道有什么好办法没有.**问题二:
我觉得"扫雷"里面响应鼠标点击事件的确很有意思,不管你在哪里点下,到时鼠标抬起的地方才真正响应了单击事件,不晓得要怎么实现它,也许有什么方法我没有见过的.**问题三
"扫雷"有初级,中级,高级和自定义,就算是四个级别吧,每次点选不同的选项似乎都会初始化窗口大小,雷区大小以及其它的一些信息,我不晓得要怎么能够实现这种"初始化",好像可以单单将载有雷区的JPanel消除并重新生成新的JPanel.
可是我的所有包括按钮和布雷信息都写在了Myframe类(继承自JFrame)的构造函数中了,难道还能调用构造函数吗?头晕了,不知道怎么办好了....暂时就这么多吧,恳请诸位帮忙,俺在这儿谢过了先!

解决方案 »

  1.   

    1.你用的布局不对吧
    2.你每个button添加单独的监听啊
    3.重新刷新界面,数据你总可以调用吧
      

  2.   

    import java.awt.*;
    import java.awt.event.*;import javax.swing.*;public class Test implements MouseListener {
    private JFrame frame = null;
    private JPanel pane = null, pane_1 = null, pane_2 = null;
    private GridLayout gl = null;
    private JLabel eventLabel = null;
    private JButton[] button = null;
    private JButton b_1 = null, b_2 = null, b_3 = null;

    public Test() {
    frame = new JFrame("测试窗体");
    eventLabel = new JLabel();
    pane = new JPanel();
    gl = new GridLayout();
    pane.setLayout(gl);
    this.setGameUI(5, 8);
    this.initGrade();

    frame.getContentPane().add(pane);
    pane_1 = new JPanel();
    pane_1.add(new JLabel("鼠标松开后产生的事件:"));
    pane_1.add(eventLabel);
    frame.getContentPane().add(pane_1, BorderLayout.NORTH);
    frame.getContentPane().add(pane_2, BorderLayout.SOUTH);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setSize(300, 200);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true); } /**
     * 设置游戏界面
     * @param rows  行
     * @param cols 列
     */
    public void setGameUI(int rows, int cols) {
    gl.setRows(rows);
    gl.setColumns(cols);
    button = new JButton[rows * cols];
    pane.removeAll();
    for (int i = 0; i < button.length; i++) {
    button[i] = new JButton("O");
    button[i].setName(String.valueOf(i + 1));
    button[i].setMargin(new Insets(0, 0, 0, 0)); //解决问题一
    button[i].addMouseListener(this);
    pane.add(button[i]);
    }
    } /**
     * 和级别设置有关的初始化
     */
    private void initGrade() {
    pane_2 = new JPanel();
    b_1 = new JButton("3 * 6");
    b_2 = new JButton("5 * 8");
    b_3 = new JButton("8 * 12");
    b_1.addActionListener(new ActionListener() { //解决问题三
    public void actionPerformed(ActionEvent e) {
    setGameUI(3, 6);
    pane.repaint();
    pane.validate();
    }
    });
    b_2.addActionListener(new ActionListener() { //解决问题三
    public void actionPerformed(ActionEvent e) {
    setGameUI(5, 8);
    pane.repaint();
    pane.validate();
    }
    });
    b_3.addActionListener(new ActionListener() { //解决问题三
    public void actionPerformed(ActionEvent e) {
    setGameUI(8, 12);
    pane.repaint();
    pane.validate();
    }
    });
    pane_2.add(b_1);
    pane_2.add(b_2);
    pane_2.add(b_3);
    } public static void main(String[] args) {
    new Test();
    } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { //解决问题二
    eventLabel.setText("[ " + ((JButton) e.getSource()).getName() + " ]");
    } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { }}
      

  3.   

    To aaa2003gf()
      感谢你的帮助,不好意思是我说错了,应该是"使用了一个Box的对象"
    To mq612(五斗米)
      非常感谢你的代码,条理很清楚,我也学到了不少东西.目前看来第一,第三个问题我是已经没有什么异议了.可是第二个问题嘛...单单只是一个mouseReleased我想只能对单个按钮管用吧,我的意思是:在按钮A上点下鼠标,不要松手,然后移动到按钮B上松开鼠标,这个时候响应鼠标事件的不是A而是B,或者可以移动到没有按钮的区域松开鼠标从而不会有按钮响应这个事件,你可以玩一下扫雷试试,的确是这个样子的.
      

  4.   

    想做的和Windows带的扫雷一模一样可是很麻烦的,你上面的这些要求可以实现import java.awt.*;
    import java.awt.event.*;import javax.swing.*;public class Test {
        private JFrame frame = null;
        private JPanel pane = null, pane_1 = null, pane_2 = null;
        private GridLayout gl = null;
        private JLabel eventLabel = null;
        private My_Button[] button = null;
        private JButton b_1 = null, b_2 = null, b_3 = null;
        private My_ButtonGroup group = null;    public Test() {
            group = new My_ButtonGroup();
            frame = new JFrame("测试窗体");
            eventLabel = new JLabel();
            pane = new JPanel();
            gl = new GridLayout();
            pane.setLayout(gl);
            this.setGameUI(5, 8);
            this.initGrade();        frame.getContentPane().add(pane);
            pane_1 = new JPanel();
            pane_1.add(new JLabel("鼠标松开后产生的事件:"));
            pane_1.add(eventLabel);
            frame.getContentPane().add(pane_1, BorderLayout.NORTH);
            frame.getContentPane().add(pane_2, BorderLayout.SOUTH);
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.setSize(300, 200);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);    }    /**
         * 设置游戏界面
         * @param rows  行
         * @param cols 列
         */
        public void setGameUI(int rows, int cols) {
            gl.setRows(rows);
            gl.setColumns(cols);
            button = new My_Button[rows * cols];
            pane.removeAll();
            for (int i = 0; i < button.length; i++) {
                button[i] = new My_Button("O");
                button[i].setName(String.valueOf(i + 1));
                button[i].setMargin(new Insets(0, 0, 0, 0)); //解决问题一
                button[i].setGroup(group);
                pane.add(button[i]);
            }
            group.removeAll();
            group.addButtonArray(button);
        }    /**
         * 和级别设置有关的初始化
         */
        private void initGrade() {
            pane_2 = new JPanel();
            b_1 = new JButton("3 * 6");
            b_2 = new JButton("5 * 8");
            b_3 = new JButton("8 * 12");
            b_1.addActionListener(new ActionListener() { //解决问题三
                public void actionPerformed(ActionEvent e) {
                    setGameUI(3, 6);
                    pane.repaint();
                    pane.validate();
                }
            });
            b_2.addActionListener(new ActionListener() { //解决问题三
                public void actionPerformed(ActionEvent e) {
                    setGameUI(5, 8);
                    pane.repaint();
                    pane.validate();
                }
            });
            b_3.addActionListener(new ActionListener() { //解决问题三
                public void actionPerformed(ActionEvent e) {
                    setGameUI(8, 12);
                    pane.repaint();
                    pane.validate();
                }
            });
            pane_2.add(b_1);
            pane_2.add(b_2);
            pane_2.add(b_3);
        }    public static void main(String[] args) {
            new Test();
        }}
      

  5.   

    第二个文件,按钮类import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.event.MouseEvent;
    public class My_Button extends JToggleButton implements MouseListener {
        private My_ButtonGroup group = null;    public My_Button () {
            this(null, null, false);
        }    public My_Button(Icon icon) {
            this(null, icon, false);
        }    public My_Button(Icon icon, boolean selected) {
            this(null, icon, selected);
        }    public My_Button (String text) {
            this(text, null, false);
        }    public My_Button (String text, boolean selected) {
            this(text, null, selected);
        }    public My_Button(Action a) {
            this();
            setAction(a);
        }    public My_Button(String text, Icon icon) {
            this(text, icon, false);
        }    public My_Button (String text, Icon icon, boolean selected) {
            super(text, icon, selected);
            this.myInit();
        }    public void myInit(){
            this.addMouseListener(this);
        }    public void setGroup(My_ButtonGroup group){
            this.group = group;
        }    public void mouseClicked(MouseEvent mouseEvent) {
        }    public void mousePressed(MouseEvent mouseEvent) {    }    public void mouseReleased(MouseEvent mouseEvent) {
            if(group.getNowKey() != null){
                group.getButton(group.getNowKey()).setSelected(true);
            }
        }    public void mouseEntered(MouseEvent mouseEvent) {
            if(mouseEvent.getMouseModifiersText(mouseEvent.getModifiers()).equals("Button1")) {
                group.setNowKey(((JToggleButton)mouseEvent.getSource()).getName());
            }
        }    public void mouseExited(MouseEvent mouseEvent) {
            if(mouseEvent.getMouseModifiersText(mouseEvent.getModifiers()).equals("Button1")) {
                group.setNowKey(My_ButtonGroup.KEY_NULL);
            }
        }
    }
      

  6.   

    第三个文件,集群类:import java.util.HashMap;import javax.swing.*;
    import javax.swing.JToggleButton;public class My_ButtonGroup {
        public static final String KEY_NULL = null;
        private HashMap bMap = null;
        private String key = KEY_NULL;    public My_ButtonGroup() {
            bMap = new HashMap(100);
        }    public void setNowKey(String key) {
            this.key = key;
        }    public String getNowKey() {
            return key;
        }    public JToggleButton addButton(JToggleButton button) {
            return (JToggleButton) bMap.put(button.getName(), button);
        }    public void addButtonArray(JToggleButton[] button) {
            for (int i = 0; i < button.length; i++) {
                this.addButton(button[i]);
            }
        }    public JToggleButton getButton(String key) {
            return (JToggleButton) bMap.get(key);
        }    public void removeAll() {
            bMap = null;
            bMap = new HashMap(100);
        }    /*
         //完成所需要的其它方法
         public boolean removeButton(String key){
             //......实现内容
         }
         //...... 其它方法
         */}
      

  7.   

    十分感谢mq612(五斗米)的回复,不过实在看起来有些吃力,有些东西还没有接触过,其实我想了想,我的这个要求通过重写MouseListener的几个方法可以很好的实现,代码如下:import java.awt.*;
    import java.awt.event.*;import javax.swing.*;public class Test implements MouseListener {
    private JFrame frame = null;
    private JPanel pane = null, pane_1 = null, pane_2 = null;
    private GridLayout gl = null;
    private JLabel eventLabel = null;
    private JButton[] button = null;
    private JButton b_1 = null, b_2 = null, b_3 = null;
    private JLabel label= new JLabel(),
       label_ = new JLabel();
    private JButton current = new JButton();

    public Test() {
    frame = new JFrame("测试窗体");
    eventLabel = new JLabel();
    pane = new JPanel();
    gl = new GridLayout();
    pane.setLayout(gl); this.setGameUI(5, 8);
    this.initGrade();

    frame.getContentPane().add(pane);
    pane_1 = new JPanel();
    pane_1.add( new JLabel("鼠标松开后产生的事件:") );
    pane_1.add(eventLabel);
    frame.getContentPane().add(pane_1, BorderLayout.NORTH);
    frame.getContentPane().add(pane_2, BorderLayout.SOUTH);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setSize(300, 200);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true); } /**
     * 设置游戏界面
     * @param rows  行
     * @param cols 列
     */
    public void setGameUI(int rows, int cols) {
    gl.setRows(rows);
    gl.setColumns(cols);
    button = new JButton[rows * cols];
    pane.removeAll();
    for (int i = 0; i < button.length; i++) {
    button[i] = new JButton("O");
    button[i].setName(String.valueOf(i + 1));
    button[i].setMargin(new Insets(0, 0, 0, 0)); 
    button[i].addMouseListener(this);
    pane.add(button[i]);
    }
    } /**
     * 和级别设置有关的初始化
     */
    private void initGrade() {
    pane_2 = new JPanel();
    b_1 = new JButton("3 * 6");
    b_2 = new JButton("5 * 8");
    b_3 = new JButton("8 * 12");
    b_1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) {
    setGameUI(3, 6);
    pane.repaint();
    pane.validate();
    }
    });
    b_2.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) {
    setGameUI(5, 8);
    pane.repaint();
    pane.validate();
    }
    });
    b_3.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) {
    setGameUI(8, 12);
    pane.repaint();
    pane.validate();
    }
    });
    pane_2.add(label_);
    pane_2.add(b_1);
    pane_2.add(b_2);
    pane_2.add(b_3);
    pane_2.add(label);
    } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { 
    JButton temp = (JButton) e.getSource();
    //System.out.println( "x= " + temp.getX() + "  y=" + temp.getY() );
    if( current != null )
    eventLabel.setText("[ " + current.getName() + " ]"); //只执行current对象所指按钮的点击事件
    } public void mouseEntered(MouseEvent e) {
    JButton temp = (JButton)e.getSource();
    label.setText( "button " + "[ " + temp.getName() + " ]" );
    current = temp; //返回鼠标所在区域的按钮
    } public void mouseExited(MouseEvent e) {
    current = null; //如果离开按钮则设"当前按钮"为null
    }



    public static void main(String[] args) {
    new Test();
    }}只是稍稍做了点改动,怎么样,应该没什么问题吧。