让右键点击按钮周围的按钮同时按下,我用循环函数实现按钮是一个个按下的,我想让它同时按下,想扫雷程序那样的效果package ccc;
import javax.swing.*; 
import java.awt.*; 
import java.util.*; 
import java.text.*; 
import java.awt.event.*;
public class test extends JFrame implements Runnable{    int main_x=15;
    int main_y=12;
int main_toleft=5;
int main_totop=5;
    int toppanel_height=40;
    int height=main_y*20+toppanel_height+68;
    int width=main_x*20+15;    
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable(){
            public void run(){
                try{
                    test frame=new test();
                    frame.setVisible(true);
                    new Thread(frame).start();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        });
    }
    public test(){
        super();
        setBounds(0,0,width,height);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        DrawPanel mainpanel=new DrawPanel();
        getContentPane().add(mainpanel,BorderLayout.CENTER);    }
    class DrawPanel extends JPanel implements MouseListener,ActionListener{ 
    final JButton btn_arr[][]=new JButton[100][100];
        public DrawPanel(){
            super();
            setLayout(null);
            setBorder(BorderFactory.createLoweredBevelBorder());
            for(int xx=0;xx<main_x;xx++){
                for(int yy=0;yy<main_y;yy++){
                    btn_arr[xx][yy]=new JButton();
                    btn_arr[xx][yy].setBounds(xx*20+5,yy*20+5,20,20);
                    add(btn_arr[xx][yy]);
                    btn_arr[xx][yy].setBackground(Color.DARK_GRAY);
                    btn_arr[xx][yy].setBorder(BorderFactory.createRaisedBevelBorder());
                    btn_arr[xx][yy].addMouseListener(this);
                    btn_arr[xx][yy].setFocusable(false);
                }
            }
        }
        public void paint(Graphics g){
            super.paint(g);
            Graphics2D g2=(Graphics2D)g;
            g2.setColor(Color.GRAY);
            g2.setStroke(new BasicStroke(2));
            for(int xx=0;xx<main_x;xx++){
                for(int yy=0;yy<main_y;yy++){
                    g2.drawLine(xx*20+5,5,xx*20+5,width-10);
                    g2.drawLine(5,yy*20+5,height-10,yy*20+5);
                }
            }
        } 
        public void actionPerformed(ActionEvent e){
            
        }
        public void mouseClicked(MouseEvent e){ 
        } 
    
        public void mouseEntered(MouseEvent e){
            this.repaint(); 
        } 
    
        public void mouseExited(MouseEvent e){ 
        } 
    
        public void mousePressed(MouseEvent e){ 
        } 
    
        public void mouseReleased(MouseEvent e){
         if(e.isPopupTrigger()){
            JButton e_btn=((JButton)e.getSource());
            int x=(e_btn.getLocation().x-main_toleft)/20;//获取按钮位置确定按钮下标X
int y=(e_btn.getLocation().y-main_totop)/20;//获取按钮位置确定按钮下标Y
            for(int loop_x=x-1;loop_x<=x+1;loop_x++){
for(int loop_y=y-1;loop_y<=y+1;loop_y++){
if((loop_x<main_x && loop_y<main_y) && (loop_x>=0 && loop_y>=0)){ //越界检查btn_arr_bln组
btn_arr[loop_x][loop_y].doClick();
}
}
}
}
        }
    }
    public void run(){
    }
}

解决方案 »

  1.   

    按钮被按下
            JButton button = new JButton("");
            button.doClick();
      

  2.   

    我知道按下时用doClick();
    我做出来的是循环按下,不是同时按下,我想要几个按钮同时按下,难道循环函数的间隔时间这么长?
      

  3.   

    不可能的~~~
    虽然看起来可以用多线程,但是 Swing 的事件只能在 Swing 的线程中调用,也就是说,同时只能有一个按钮被按下。
      

  4.   

    用doClick(0);
    试试、、、、、不过你这样写的 因为一块按下的太快、、、所以看不大到效果、、
    但是是同时被按下的、、、、、能满足你的需要
      

  5.   

    我查源码看了看、、、、、
    doClick();其实是调用的doClick(68);所以才这么慢,并不是循环函数慢的原因、、、、
    所以你可以自己调用doClick(time);
      

  6.   

    可以使用JLabel,不必使用JButton,可以参考一下下面的实现
    package test;import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;@SuppressWarnings("serial")
    public class Test extends JPanel {
        private static final int ROW_COUNT = 10;
        private static final int COLUMN_COUNT = 10;
        private JLabel[][] btns = new JLabel[ROW_COUNT][COLUMN_COUNT];
        private static final Color DEFAULT_COLOR = new Color(220, 220, 220);
        private static final Color PRESSED_COLOR = Color.GREEN;    public Test() {
            int width = 400;
            int height = 400;
            setLayout(null);
            setPreferredSize(new Dimension(width, height));        int w = width / COLUMN_COUNT;
            int h = height / ROW_COUNT;
            for (int y = 0; y < COLUMN_COUNT; ++y) {
                for (int x = 0; x < ROW_COUNT; ++x) {
                    JLabel btn = new JLabel();
                    btn.setOpaque(true);
                    btn.setBackground(DEFAULT_COLOR);
                    btn.setName(y + "," + x);
                    btn.setBorder(BorderFactory.createEtchedBorder());                btn.setBounds(y * h, x * w, w, h);
                    add(btn);
                    btns[y][x] = btn;
                    handleButtonEvent(btn);
                }
            }
        }    private void handleButtonEvent(final JLabel btn) {
            btn.addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    String[] coord = btn.getName().split(",");
                    int y = Integer.parseInt(coord[0]);
                    int x = Integer.parseInt(coord[1]);                clickButton(y, x);                clickButton(y - 1, x - 1);
                    clickButton(y - 1, x);
                    clickButton(y - 1, x + 1);                clickButton(y, x - 1);
                    clickButton(y, x + 1);                clickButton(y + 1, x - 1);
                    clickButton(y + 1, x);
                    clickButton(y + 1, x + 1);
                }            @Override
                public void mouseReleased(MouseEvent e) {
                    String[] coord = btn.getName().split(",");
                    int y = Integer.parseInt(coord[0]);
                    int x = Integer.parseInt(coord[1]);                releaseButton(y, x);                releaseButton(y - 1, x - 1);
                    releaseButton(y - 1, x);
                    releaseButton(y - 1, x + 1);                releaseButton(y, x - 1);
                    releaseButton(y, x + 1);                releaseButton(y + 1, x - 1);
                    releaseButton(y + 1, x);
                    releaseButton(y + 1, x + 1);
                }
            });
        }    private void clickButton(int y, int x) {
            if (y < 0 || y >= btns.length || x < 0 || x >= btns[0].length) { return; }
            btns[y][x].setBackground(PRESSED_COLOR);
        }    private void releaseButton(int y, int x) {
            if (y < 0 || y >= btns.length || x < 0 || x >= btns[0].length) { return; }
            btns[y][x].setBackground(DEFAULT_COLOR);
        }    private static void createGuiAndShow() {
            JFrame frame = new JFrame("");
            frame.getContentPane().add(new Test());        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setResizable(false);
            frame.setAlwaysOnTop(true);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }    public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    createGuiAndShow();
                }
            });
        }
    }
      

  7.   


    doClick(0),可以
    我只想到这样写
      

  8.   

    如果一个按钮被按下,再去模拟它周围的几个按钮被按下,这是一个死循环,如 (x, y)处被按下,则要模拟(x-1, y)被按下,当(x-1, y)被按下时,又要模拟(x-1+1, y),即(x,y)被按下,会不停的循环的。