<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-16  評(píng)論-50  文章-2  trackbacks-0

    首先做一道改錯(cuò)題吧。

    下面的程序是個(gè)簡(jiǎn)化的彈珠游戲。每按一下 Start 按鈕,就從左上角彈出一個(gè)球,并開(kāi)始在球框中運(yùn)動(dòng)和彈跳。界面如下:

    bounce 
    圖1

    但運(yùn)行下面的程序,你會(huì)發(fā)現(xiàn)一旦按了Start 按鈕,整個(gè)界面就像死機(jī)一樣,球不動(dòng),對(duì)界面的任何操作也無(wú)反應(yīng)。這肯定不是程序想要的效果。為什么會(huì)這樣呢?要怎么辦呢?
     

    源代碼

    下載地址:http://m.tkk7.com/Files/jeff-lau/bounce_nothread.zip

    /**
    * @(#) Bounce.java 2007-12-31
    *
    * Copyright? 2007 Jeff. 該源代碼遵循BSD開(kāi)源協(xié)議。
    */
    package joj.thread.swing.bounce.nothread;

    import javax.swing.JFrame;

    /**
    * 這是Bounce程序的啟動(dòng)類(lèi)。
    *
    * @since 5.0
    * @author Jeff
    */
    public class Bounce {

        /**
         * 程序啟動(dòng)函數(shù)。
         *
         * @param args
         *            不理睬該參數(shù)
         */
        public static void main(String[] args) {
            JFrame frame = new BounceFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }

    }

     

    /**
    * @(#) BounceFrame.java 2007-12-31
    *
    * Copyright? 2007 Jeff. 該源代碼遵循BSD開(kāi)源協(xié)議。
    */
    package joj.thread.swing.bounce.nothread;

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.HeadlessException;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;

    /**
    * Bounce程序的主窗體
    *
    * @author Jeff
    *
    */
    @SuppressWarnings("serial")
    public class BounceFrame extends JFrame {

        private static final int DEFAULT_HEIGHT = 300;
        private static final int DEFAULT_WIDTH = 400;

        private BallPanel ballPanel;

        public BounceFrame() throws HeadlessException {
            setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
            add(getBallPanel(), BorderLayout.CENTER);
            add(getButtonPanel(), BorderLayout.SOUTH);
        }

        private Component getBallPanel() {
            if (ballPanel == null) {
                ballPanel = new BallPanel();
            }
            return ballPanel;
        }

        private Component getButtonPanel() {
            JPanel buttonPanel = new JPanel();
            buttonPanel.add(getStartButton());
            buttonPanel.add(getCloseButton());
            return buttonPanel;
        }

        private Component getStartButton() {
            JButton startButton = new JButton("Start");

            startButton.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    addBall();
                }
            });

            return startButton;
        }

        private Component getCloseButton() {
            JButton closeButton = new JButton("Close");

            closeButton.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }

            });

            return closeButton;
        }

        private void addBall() {
            Ball ball = ballPanel.addBall();

            try {
                for (int i = 0; i < 1000; i++) {
                    ball.move(ballPanel.getBounds());
                    ballPanel.paintComponent(ballPanel.getGraphics());
                    Thread.sleep(3);
                }
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
    }

    /**
    * @(#) BallPanel.java 2007-12-31
    *
    * Copyright? 2007 Jeff.
    * 該源代碼遵循BSD開(kāi)源協(xié)議。
    */
    package joj.thread.swing.bounce.nothread;

    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.util.ArrayList;
    import java.util.List;

    import javax.swing.JPanel;

    @SuppressWarnings("serial")
    public class BallPanel extends JPanel {

        private List balls = new ArrayList();

        public Ball addBall() {
            Ball ball = new Ball();
            balls.add(ball);
            return ball;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            for (Ball ball : balls) {
                g2.fill(ball.getShape());
            }
        }

    }


    /**
    * @(#) Ball.java 2007-12-31
    *
    * Copyright? 2007 Jeff. 該源代碼遵循BSD開(kāi)源協(xié)議。
    */
    package joj.thread.swing.bounce.nothread;

    import java.awt.Shape;
    import java.awt.geom.Ellipse2D;
    import java.awt.geom.Rectangle2D;

    public class Ball {
       
        private double left = 0;
        private double top = 0;
        private double width = 15;
        private double height = 15;
        private double dx = 5;
        private double dy = 5;

        public Shape getShape() {
            return new Ellipse2D.Double(left, top, width, height);
        }

        public void move(Rectangle2D bounds) {
            left += dx;
            top += dy;

            if (left < bounds.getMinX()) {
                left = bounds.getMinX();
                dx = -dx;
            }
           
            if (left + width > bounds.getMaxX()) {
                left = bounds.getMaxX() - width;
                dx = -dx;
            }       

            if (top < bounds.getMinY()) {
                top = bounds.getMinY();
                dy = -dy;
            }

            if (top + height > bounds.getMaxY()) {
                top = bounds.getMaxY() - height;
                dy = -dy;
            }

        }
    }
    posted on 2007-12-31 22:00 Jeff Lau 閱讀(374) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 跟老劉學(xué)Java

    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产亚洲成在线播放va| 一级毛片aaaaaa免费看| 久久亚洲精品人成综合网| 亚洲成a人片在线观看天堂无码 | 一个人看www在线高清免费看| 免费无码国产在线观国内自拍中文字幕| 久久久亚洲欧洲日产国码aⅴ| 亚洲人成网站观看在线播放| 亚洲一区二区三区免费观看| 国产裸模视频免费区无码| 亚欧色视频在线观看免费| 亚洲熟妇丰满xxxxx| 亚洲国产成人影院播放| a成人毛片免费观看| 黄色毛片视频免费| 亚洲欧美国产欧美色欲| 精品亚洲视频在线观看| 日本xxxx色视频在线观看免费| 成人嫩草影院免费观看| 国产精品亚洲专区无码WEB| 亚洲日韩中文字幕在线播放| 免费看一级做a爰片久久| 在线观看免费为成年视频| 亚洲日韩在线中文字幕综合 | 亚洲精品色在线网站| 亚洲 欧洲 自拍 另类 校园| 亚洲综合视频在线观看| 久久久久亚洲精品无码蜜桃| 久久精品国产亚洲香蕉| 国产A在亚洲线播放| 国产亚洲无线码一区二区 | 男男gay做爽爽的视频免费| 中文字幕无码亚洲欧洲日韩| 国产成人精品日本亚洲网址| 亚洲日韩VA无码中文字幕| 午夜亚洲av永久无码精品| 外国成人网在线观看免费视频 | 国产亚洲人成网站在线观看不卡| 亚洲人成网站在线观看青青| 亚洲一级特黄大片在线观看 | 91免费在线视频|