java圖形界面寫個小桌面,內置簡單小軟件

1、作個這樣的效果,雙擊圖標打開相應的應用java

2、主界面類,使用JavaSwing的JDesktopPane類建立這個桌面shell

package com.swing;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;

import com.swing.plane.PanelGame;
import com.swing.sunModel.SunModel;
/**
 * 獲取文件的圖標
    FileSystemView fileSystemView = FileSystemView.getFileSystemView();
    ImageIcon icon = (ImageIcon) fileSystemView.getSystemIcon(file);
    BufferedImage i = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
    i.getGraphics().drawImage(icon.getImage(), 0, 0, null);
    File out = new File("src/lib/hello.png");
    try {
        ImageIO.write(i, "png", out);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 * @author may
 *
 */
public class Desktop extends JFrame {
    
    
    private static final long serialVersionUID = 3899092629742973479L;
    
    private JDesktopPane desktop = null;//定義桌面面板
    private JLabel backgroundImage = null;//定義桌面背景
    private MouseOption mouseOption = new MouseOption();//鼠標監聽對象

    public Desktop(String title) {
        super(title);
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        //獲得系統屏幕的大小
        Dimension dimension = toolkit.getScreenSize();
        //設置佈局管理爲BorderLayout
        this.setLayout(new BorderLayout());
        int width = (int)dimension.getWidth();
        int height = (int)dimension.getHeight() - 100;
        this.setSize(width, height);
        desktop = new JDesktopPane();
        backgroundImage = new JLabel();
        //建立一個空的的圖片
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        BufferedImage ad = null;
        try {
            //讀取背景圖
            ad = ImageIO.read(this.getClass().getResource("/lib/rapeFlower.jpg"));
        } catch (IOException e) {
            
            e.printStackTrace();
        }
        //將背景圖按比例縮放從新畫到以前建立的空圖片
        g.drawImage(ad, 0, 0, width, height, null);
        //轉化爲Icon類圖片
        ImageIcon img = new ImageIcon(image);
        backgroundImage.setIcon(img);
        //設置存放背景圖的背景標籤的位置和大小
        backgroundImage.setBounds(new Rectangle(0, 0, width, height));
        
        //建立按鈕
        JButton myCompute = new JButton();
        myCompute.setIcon(new ImageIcon(this.getClass().getResource("/lib/computer.png")));
        myCompute.setBounds(20, 20, 48, 48);
        //設置按鈕爲透明
        myCompute.setContentAreaFilled(false);
        //除去邊框
        myCompute.setBorderPainted(false);
        //添加事件監聽
        myCompute.addMouseListener(mouseOption );
        //設置它的文本標識
        myCompute.setText("compute");
        //添加到桌面,而且比設置它的層次,比背景圖更高一個層次,否側會被背景圖遮住,看不見
        desktop.add(myCompute, Integer.MIN_VALUE + 1);
        
        JButton myNotebook= new JButton();
        myNotebook.setIcon(new ImageIcon(this.getClass().getResource("/lib/notebook.png")));
        myNotebook.setBounds(20, 88, 48, 48);
        myNotebook.setContentAreaFilled(false);
        myNotebook.setBorderPainted(false);
        myNotebook.addMouseListener(mouseOption);
        myNotebook.setText("notebook");
        desktop.add(myNotebook, Integer.MIN_VALUE + 1);
        
        
        JButton myPanel= new JButton();
        myPanel.setIcon(new ImageIcon(this.getClass().getResource("/lib/paper_plane.png")));
        myPanel.setBounds(20, 156, 48, 48);
        myPanel.setContentAreaFilled(false);
        myPanel.setBorderPainted(false);
        myPanel.addMouseListener(mouseOption);
        myPanel.setText("panel");
        desktop.add(myPanel, Integer.MIN_VALUE + 1);
        
        JButton mySunModel = new JButton();
        mySunModel.setIcon(new ImageIcon(this.getClass().getResource("/lib/earth.net.png")));
        mySunModel.setBounds(20, 224, 48, 48);
        mySunModel.setContentAreaFilled(false);
        mySunModel.setBorderPainted(false);
        mySunModel.addMouseListener(mouseOption);
        mySunModel.setText("sunModel");
        desktop.add(mySunModel, Integer.MIN_VALUE + 1);
        
                
        desktop.add(backgroundImage, new Integer(Integer.MIN_VALUE));
        
        
        this.getContentPane().add(desktop, BorderLayout.CENTER);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        
    }
    
    private class MouseOption extends MouseAdapter {
        private int count;
        private Timer timer = new Timer();
        private String str = null;
        
        private class MyTimerTask extends TimerTask {
            JButton button = null;
            
            
            public MyTimerTask(JButton button) {
                this.button = button;
                
            }
            
            


            @Override
            public void run() {
                //超過0.4s且點擊了一次
                if(count == 1) {
                    count = 0;
                }
                //在0.4s內點擊兩次
                if(count == 2) {
                    //JDK7.0以上支持switch字符串
                    switch(str) {
                    case "fileChooser" : 
                        JFileChooser fileChooser = new JFileChooser();
                        fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
                        fileChooser.showOpenDialog(Desktop.this);
                        File file = fileChooser.getSelectedFile();
                        if(file != null) {
                            
                            System.out.println(file.getAbsolutePath());
                            
                        }
                        break;
                    case "notebook" : 
                        //調用windows系統自帶的notepad
                        /*try {
                            Runtime.getRuntime().exec("notepad");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }*/
                        //調用自個寫的一個特簡易的記事本程序
                        Notepad notepad = new Notepad();
                        desktop.add(notepad);
                        notepad.toFront();
                        
                        break;
                    case "compute" :
                        //打開windows的文件管理器
                        try {
                            java.awt.Desktop.getDesktop().open(new File(System.getProperty("user.home")));
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        break;
                    case "panel" : 
                        //啓動飛機大戰遊戲
                        new PanelGame();
                        break;
                        
                    case "sunModel" :
                        //啓動太陽系模型,雖然沒啥用,用來裝B
                        new SunModel();
                        break;
                    }
                    
                    button.setContentAreaFilled(false);
                    count = 0;
                }
                
            }
            
            
        }
        
        /**
         * 添加鼠標點擊事件
         */
        @Override
        public void mouseClicked(MouseEvent e) {
            JButton button = (JButton) e.getSource();
            button.setContentAreaFilled(true);
            str = button.getText();
            count ++;//用於記錄點擊次數
            //定製雙擊事件,使用定時器,每次點擊後,延時0.4
            timer.schedule(new MyTimerTask(button), 400);
            
        }
        
        
        
        
        
    }
    
    public static void main(String[] args) {
        new Desktop("桌面");
    }
    

}

3、Notepad簡易小程序小程序

一、效果圖windows

二、Notepad.java的代碼數組

package com.swing;

import java.awt.Desktop;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
 * 簡易筆記本
 * @author may
 *
 */
public class Notepad extends JInternalFrame {

    private static final long serialVersionUID = -6148113299360403243L;

    private JMenuBar menuBar = null;//菜單欄
    private JTextArea textArea = null;//輸入框
    private JScrollPane scrollPane = null;//帶滾動條的面板
    private MyAction myAction = new MyAction();//事件對象
    private String dir = null;//保存打開過或者保存過文件的文件夾
    private String fileDir = null;//保存你打開文件的文件夾
    private boolean ctrlClick = false;//用於檢測當前,你是否按下了Ctrl鍵
    private boolean sClick = false;//用於檢測當前,你是否按下了s鍵

    public Notepad() {
        super("notepad");
        this.setSize(600, 500);//窗口的大小
        menuBar = new JMenuBar();//建立菜單欄
        JMenu menu1 = new JMenu("文件");//建立菜單
        JMenuItem menuItem2 = new JMenuItem("打開");//建立菜單項
        JMenuItem menuItem4 = new JMenuItem("保存");//建立菜單項
        menuItem4.addActionListener(myAction);//綁定事件
        menuItem2.addActionListener(myAction);//綁定事件
        JMenuItem menuItem3 = new JMenuItem("打開文件所在目錄");
        menuItem3.addActionListener(myAction);
        menu1.add(menuItem2);
        menu1.add(menuItem3);
        menu1.add(menuItem4);

        JMenu menu2 = new JMenu("版本信息");
        menu2.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                //定義彈窗後的按鈕的文字
                String[] options = {"肯定"};
                //建立一個彈窗
                JOptionPane.showOptionDialog(Notepad.this, "version:0.1-snapshoot", "關於", JOptionPane.OK_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, "肯定");
            }
            
            
        });
        menuBar.add(menu1);
        menuBar.add(menu2);
        this.setJMenuBar(menuBar);
        textArea = new JTextArea();
        //添加鍵盤檢測事件
        textArea.addKeyListener(new keyOption());
        // this.getContentPane().add(menuBar, BorderLayout.NORTH);
        //設置字體
        textArea.setFont(new Font("微軟雅黑", Font.PLAIN, 18));
        scrollPane = new JScrollPane(textArea);
        //當文本水平溢出時出現滾動條
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        //當文本垂直溢出時出現滾動條
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        this.getContentPane().add(scrollPane);
        //居中顯示
        //this.setLocationRelativeTo(null);
        //最小化
        this.setIconifiable(true);
        //可關閉
        this.setClosable(true);
        //可改變大小
        this.setResizable(true);
        //銷燬窗口
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.setVisible(true);

    }

    /**
     * 打開文件選擇和保存對話框
     * @param flag
     */
    public void openChooseDialog(String flag) {
        BufferedReader reader = null;
        JFileChooser fileChooser = new JFileChooser();
        if(dir != null) {
            //定位上次打開和保存過文件的位置
            fileChooser.setCurrentDirectory(new File(dir));
        }
        
            switch(flag) {
            case "打開" :
                //指定它的父窗口
                fileChooser.showOpenDialog(Notepad.this);
                //定義文件選擇模式
                fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                
                File file = fileChooser.getSelectedFile();
                if(file != null) {
                    try {
                        //獲得選擇文件的路徑
                        dir = file.getAbsolutePath();
                        fileDir = dir;
                        dir = dir.substring(0, dir.lastIndexOf("\\") + 1);
                        reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "utf-8"));
                        String str = reader.readLine();
                        textArea.setText("");
                        //讀取文件內容
                        while(str != null) {
                            textArea.append(str + "\n");
                            str = reader.readLine();
                            
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    } finally {
                        if(reader != null) {
                            try {
                                reader.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        
                    }
                }
                
                break;
            case "保存" :
                //打開保存文件的對話框
                fileChooser.showSaveDialog(Notepad.this);
                //獲得保存文件後的文件對象
                File saveFile = fileChooser.getSelectedFile();
                if(saveFile != null) {
                    //獲得保存文件的路徑
                    String absolutePath = saveFile.getAbsolutePath();
                    fileDir = absolutePath;
                    FileOutputStream out = null;
                    BufferedWriter buffOut = null;
                    
                    dir = absolutePath.substring(0, absolutePath.lastIndexOf("\\") + 1);
                    //保存文件
                    try {
                        out = new FileOutputStream(absolutePath);
                        buffOut = new BufferedWriter(new OutputStreamWriter(out));
                        String text = textArea.getText();
                        if(text != null) {
                            buffOut.write(text);
                            
                        }
                        buffOut.flush();
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            if(out != null)  {
                                out.close();
                                
                            }
                            if(buffOut != null) {
                                buffOut.close();
                            }
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                    }
                    
                }
                
                break;
            case "打開文件所在目錄":
                if(dir != null) {
                    try {
                        //打開文件目錄
                        Desktop.getDesktop().open(new File(dir));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                break;
            }

    }
    
    /**
     * 事件監聽類
     * @author may
     *
     */
    private class MyAction implements ActionListener {
        

        @Override
        public void actionPerformed(ActionEvent e) {
            JMenuItem item = (JMenuItem) e.getSource();
            String flag = item.getText();
            switch (flag) {
            case "打開":
                openChooseDialog(flag);
                break;
            case "保存":
                openChooseDialog(flag);
                break;
            case "打開文件所在目錄":
                openChooseDialog(flag);
                break;
            }

        }

    }
    /**
     * 鍵盤監聽內部類
     * @author may
     *
     */
    private class keyOption extends KeyAdapter {
        

        @Override
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            if(17 == keyCode) {
                ctrlClick = true;
            } else if(83 == keyCode) {
                sClick = true;
                
            }
            //判斷Ctrl與s鍵是否按下,按下就開始保存
            if(ctrlClick && sClick) {
                FileOutputStream out = null;
                BufferedWriter buffOut = null;
                
                try {
                    if(fileDir != null) {
                        out = new FileOutputStream(fileDir);
                        buffOut = new BufferedWriter(new OutputStreamWriter(out));
                        String text = textArea.getText();
                        if(text != null) {
                            buffOut.write(text);
                            
                            
                        }
                        buffOut.flush();
                    } else {
                        openChooseDialog("保存");
                        
                    }
                } catch (Exception ex) {
                        ex.printStackTrace();
                } finally {
                    try {
                        if(out != null)  {
                            out.close();
                            
                        }
                        if(buffOut != null) {
                            buffOut.close();
                        }
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }
                    
                    
            }
        }

        @Override
        public void keyReleased(KeyEvent e) {
            int keyCode = e.getKeyCode();
            if(17 == keyCode) {
                ctrlClick = false;
            } else if(83 == keyCode) {
                sClick = false;
                
            }
        }
        
        
        
        
    } 
    

}

4、飛機大戰簡易小遊戲app

一、效果圖dom

 

 

 二、代碼ide

(1)主類PanelGame.java佈局

package com.swing.plane;

import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import com.swing.util.ImageLoadUtil;

/**
 * 主類
 * @author may
 *
 */
public class PanelGame extends Frame {

    private static final long serialVersionUID = 6719627071124599012L;
    //我方飛機場
    private List<Panel> Goodpanels = new ArrayList<Panel>();
    //敵軍飛機場
    private List<Panel> panels = new ArrayList<Panel>();
    //公共的子彈工廠
    private List<Shell> shells = new ArrayList<Shell>(); 
    //隨機
    private Random random = new Random();
    //戰場背景
    private static Image image = ImageLoadUtil.loadImage("/lib/bg.jpg");
    //緩衝圖
    private BufferedImage buffImage = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);    
    //爆炸
    private List<Explode> explodes = new ArrayList<Explode>();
    //殺敵數
    public int killEnemyCount = 0;
    //死亡次數
    public int deadCount = 0;
    
    public PanelGame() {
        this.setSize(500,500);
        this.setLocation(300, 100);
        this.addWindowListener(new WindowAdapter() {
            
            @Override
            public void windowClosing(WindowEvent e) {
                PanelGame.this.dispose();
            }
            
        });
        //在顯示(畫窗口前new出來,不然會報空指針異常)
        //panel = new Panel(100,100, false);
        this.addKeyListener(new keyCtrl());
        this.createGoodPanels(1);
        this.setVisible(true);
        new Thread(new MyThread()).start();
        
    }
    
    
    
    public void createPanels(int num) {
        for(int i = 0; i < num; i++) {
            panels.add(new Panel(this, true));
        }
        
    }
    
    public void createGoodPanels(int num) {
        if(Goodpanels.size() <= 0) {
            
            for(int i = 0; i < num; i++) {
                Goodpanels.add(new Panel(452, 250, false, this));
            }
            
        }
    }
    
    
    
    public List<Explode> getExplodes() {
        return explodes;
    }



    public List<Shell> getShells() {
        return shells;
    }



    public List<Panel> getPanels() {
        return panels;
    }
    
    
    

    public List<Panel> getGoodpanels() {
        return Goodpanels;
    }



    @Override
    public void paint(Graphics g) {
        g.drawImage(buffImage, 0, 0, null);
    }
    
    @Override
    public void update(Graphics g) {
        Graphics warG = buffImage.getGraphics();
        warG.fillRect(0, 0, 500, 500);
        warG.drawImage(image, 0, 0, 500, 500, null);
        Color c = warG.getColor();
        warG.setColor(Color.gray);
        warG.setFont(new Font("微軟雅黑", Font.PLAIN, 18));
        warG.drawString("擊毀敵機:" + killEnemyCount, 10, 50);
        warG.drawString("死亡次數:" + deadCount, 10, 80);
        
        for(int i = 0; i < Goodpanels.size(); i++) {
            Goodpanels.get(i).draw(warG);
            warG.drawString("生命值:" + Goodpanels.get(i).lifeValue, 10, (i+1)*30 + 80);
        }
        warG.setColor(c);
        for(int i = 0; i < panels.size(); i++) {
            panels.get(i).draw(warG);
        }
        for(int i = 0; i < shells.size(); i++) {
            shells.get(i).draw(warG);
        }
        for(int i = 0; i < explodes.size(); i++) {
            explodes.get(i).draw(warG);
        }
        paint(g);
        warG.setColor(c);
        if(this.getPanels().size() < 3) {
            this.createPanels(random.nextInt(6) + 1);
            
        }
    }
    
    
    
    
    public List<Panel> getPanel() {
        return Goodpanels;
    }



    public static void main(String[] args) {
        new PanelGame();
    }
    
    private class keyCtrl extends KeyAdapter {

        @Override
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            if(keyCode == KeyEvent.VK_F1) {
                createGoodPanels(1);
                
            }
            
            for(int i = 0; i < Goodpanels.size(); i++) {
                
                Goodpanels.get(i).keyPressed(e);
            }
            
        }

        @Override
        public void keyReleased(KeyEvent e) {
            for(int i = 0; i < Goodpanels.size(); i++) {
                
                Goodpanels.get(i).keyReleased(e);
            }
        }
        
        
        
    }
    
    private class MyThread implements Runnable {

        @Override
        public void run() {
            while(true) {
                repaint();
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            
        }
        
    }
    
}

(2)Panel.java字體

package com.swing.plane;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.util.List;
import java.util.Random;

import com.swing.util.ImageLoadUtil;
/**
 * 飛機類
 * @author may
 *
 */
public class Panel {
    
    private int x;//位置
    private int y;//位置
    private static final int WIDTH = 48;//飛機的大小
    private static final int HEIGHT = 48;//飛機的大小
    private static final int WAR_WIDTH = 500;//遊戲窗口的大小
    private static final int WAR_HEIGHT = 500;//遊戲窗口的大小
    private boolean up = false, right = false, down = false, left = false;//飛機的移動方向
    private boolean enemy = true;//默認爲敵機
    private static Image[] images = new Image[2];//敵機與我方的飛機圖片
    private List<Shell> shells = null;//子彈容器
    private int step = 1;//移動的步數
    private boolean isLive = true;//默認飛機生存
    private int oldX = x;//記錄飛機上一次的位置
    private int oldY = y;//記錄飛機上一次的位置
    private int keep = 0;//敵機自動發射子彈的間隔
    private Random random = new Random();//定義隨機數,用於定義敵機的子彈發射的時間間隔
    private Director dir = Director.STOP;//飛機默認是不動的
    private PanelGame game;//遊戲主類
    public int lifeValue = 90;//飛機的生命值
    
    static {
        for(int i = 0; i < images.length; i++) {
            images[i] = ImageLoadUtil.loadImage("/lib/plane" + (i + 1) + ".png");
            images[i].getWidth(null);
            
        }
        
    }
    
    
    public Panel(PanelGame game, boolean enemy) {
        this.game = game;
        this.enemy = enemy;
        //若是是敵機,定義它初始位置
        if(this.enemy) {
            this.x = - random.nextInt(3 * WIDTH) ;
            this.y = random.nextInt(WAR_HEIGHT - 2 * HEIGHT) + HEIGHT;
        }
        this.shells = game.getShells();
    }    
    
    public Panel(int x, int y, boolean enemy, PanelGame game) {
        this.x = x;
        this.y = y;
        this.enemy = enemy;
        this.game = game;
        this.shells = game.getShells();
    }
    
    
    
    public void draw(Graphics g) {
        //若是飛機還活着,就畫它
        if(this.isLive) {
            
            Color c = g.getColor();
            if(enemy) {
                g.drawImage(images[1], x, y, WIDTH, HEIGHT, null);
                
            } else {
                g.drawImage(images[0], x, y, WIDTH, HEIGHT, null);
            }
            g.setColor(c);
            g.setColor(c);
            
            this.move();
            if(enemy) {
                this.hit(game);
            }
        }
        
        
    }
    
    /**
     * 建立子彈
     */
    public void createShells() {
        if(!enemy) {
            this.getShells().add(new Shell(x - 10, y + 20, this, false, game));
            
        } else {
            
            this.getShells().add(new Shell(x + 50, y + 20, this, true, game));
        }
    
    }
    
    

    public boolean isEnemy() {
        return enemy;
    }

    public int getX() {
        return x;
    }
    
    

    public List<Shell> getShells() {
        //shells = game.getShells();
        return shells;
    }
    //若是飛機被擊毀,飛機在飛機戰場上消失(主類的容器)
    public void removedeadPlane() {
        this.isLive = false;
        if(!this.isLive && this.enemy) {
            game.getPanels().remove(this);
        } 
        if(!this.isLive && !this.enemy) {
            game.getPanel().remove(this);
        } 
        
    }

    public boolean isLive() {
        return isLive;
    }
    
    public void setLive(boolean isLive) {
        this.isLive = isLive;
    }

    public int getY() {
        return y;
    }
    //肯定方向,這些方向的肯定是經過按鍵監聽來肯定
    private void directer() {
        if( left && !down && !right && !up ) {
            dir = Director.L;
        }
        
        else if( left && up && !right && !down ) {
            dir = Director.LU;    
        }
        
        else if( up && !left && !right && !down ) {
            dir = Director.U;
        }
        
        else if( up && right && !left && !down ) {
            dir = Director.RU;
        }
        
        else if( right && !up && !left && !down ) {
            dir = Director.R;
        }
        
        else if( right && down && !up && !left ) {
            dir = Director.RD;
        }
        
        else if( down && !up && !right && !left ) {
            dir = Director.D;
        }
        
        else if( left && down && !right && !up ) {
            dir = Director.LD;
        }
        
        else if( !left && !up && !right && !down ) {
            dir = Director.STOP;
        }
    }

    //根據方向的移動方法
    public void move() {
        oldX = x;
        oldY = y;
        
        switch(dir) {
        case L:
            x -= step;
            break;
        case LU:
            x -= step;
            y -= step;
            break;
        case U:
            y -= step;
            break;
        case RU:
            x += step;
            y -= step;
            break;
        case R:
            x += step;
            break;
        case RD:
            x += step;
            y += step;
            break;
        case D:
            y += step;
            break;
        case LD:
            x -= step;
            y += step;
            break;
        case STOP:
            break;
        }
        //若是不是敵機,不容許它跑出戰場
        if(!enemy) {
            
            if(x > (WAR_WIDTH - 48) || x < 0) {
                x = oldX;
                
            }
            if(y > (WAR_HEIGHT - 48) || y < 30) {
                y = oldY;
                
            }
            
        }
        //若是是敵機,肯定它的方向
        if(enemy) {
            dir = Director.R;
            //每隔50個刷新週期,發射一枚子彈
            if(keep == 0) {
                keep = 50;
                this.createShells();
            }
            keep --;
            //若是敵機逃出戰場,摧毀它
            if(x > WAR_WIDTH) {
                game.getPanels().remove(this);
                
            }
            
        }
        
    }
    
    //鍵盤按下監聽事件,由主類調用
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        switch(keyCode) {
        case KeyEvent.VK_UP  : 
            this.up = true;
            break;
        case KeyEvent.VK_RIGHT :
            this.right = true;
            break;
        case KeyEvent.VK_DOWN :
            this.down = true;
            break;
        case KeyEvent.VK_LEFT  :
            this.left = true;
            break;
        }
        this.directer();
        
    }

    //鍵盤擡起監聽事件,由主類調用
    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        switch(keyCode) {
        case KeyEvent.VK_UP : 
            this.up = false;
            break;
        case KeyEvent.VK_RIGHT :
            this.right = false;
            break;
        case KeyEvent.VK_DOWN :
            this.down = false;
            break;
        case KeyEvent.VK_LEFT :
            this.left = false;
            break;
        case KeyEvent.VK_CONTROL :
            this.createShells();
            break;
        }
        this.directer();
    }
    //矩形碰撞檢測
    public Rectangle getRectangle() {
        
        return new Rectangle(this.x, this.y, WIDTH, HEIGHT);
        
    }
    
    //撞到了就爆炸
        public void createExplode() {
            
            game.getExplodes().add(new Explode(this.x, this.y, game));
        }
    
    public void hit(PanelGame game) {
        
        if(this.enemy) {
            List<Panel> p = game.getGoodpanels();
            for(int i = 0; i < p.size(); i++) {
                if(this.getRectangle().intersects(p.get(i).getRectangle())) {
                    game.getPanels().remove(this);
                    
                    p.get(i).lifeValue -= 30;
                        
                    
                    if(p.get(i).lifeValue <= 0) {
                        
                        game.getGoodpanels().remove(p.get(i));
                        
                    } 
                    this.createExplode();
                    
                    
                }
            }
            
        } 
        
    }

}

(3)、Shell.java炮彈類

package com.swing.plane;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.List;
/**
 * 炮彈類
 * @author may
 *
 */
public class Shell {
    
    private int x;
    private int y;
    private static final int WIDTH = 10;
    private static final int HEIGHT = 10;
    private boolean enemy = false;
    private boolean isLive = true;
    private Panel panel;
    private PanelGame game;
    private int step =2;
    
    
    public Shell(int x, int y, Panel panel, boolean enemy, PanelGame game) {
        this.x = x;
        this.y = y;
        this.panel = panel;
        this.enemy = enemy;
        this.game = game;
    }
    
    public void draw(Graphics g) {
        
        if(this.isLive) {
            
            Color c = g.getColor();
            if(enemy) {
                
                g.setColor(Color.red);
            } else {
                
                g.setColor(Color.yellow);
            }
            g.fillOval(this.x, this.y, WIDTH, HEIGHT);
            g.setColor(c);
            move();
            this.hit(game);
        }
        
    }
    
    public Rectangle getRectangle() {
        Rectangle rectangle = new Rectangle(x, y, WIDTH, HEIGHT);
        
        return rectangle;
    }
    
    
    
    public boolean isLive() {
        return isLive;
    }

    public void setLive(boolean isLive) {
        this.isLive = isLive;
    }

    public void move() {
        if(!enemy) {
            x -= step;
        } else {
            x += step;
        }
        
        if(x < 10 || x > 500) {
            this.setLive(false);
            panel.getShells().remove(this);
        }
        
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }
    //撞到了就爆炸
    public void createExplode() {
        
        game.getExplodes().add(new Explode(this.x, this.y, game));
    }
    //碰撞檢測方法
    public void hit(PanelGame game) {
        List<Panel> enemys = game.getPanels();
        List<Panel> goods = game.getPanel();
        for(int i = 0; i < enemys.size(); i++) {
            if(this.enemy != enemys.get(i).isEnemy()) {
                
                if(this.getRectangle().intersects(enemys.get(i).getRectangle())) {
                    this.setLive(false);
                    panel.getShells().remove(this);
                    enemys.get(i).removedeadPlane();
                    this.createExplode();
                    game.killEnemyCount ++;
                }
            }
            
        }
        
        for(int i = 0; i < goods.size(); i++) {
            if(this.enemy != goods.get(i).isEnemy()) {
                
                if(this.getRectangle().intersects(goods.get(i).getRectangle())) {
                    this.setLive(false);
                    panel.getShells().remove(this);
                    goods.get(i).lifeValue -= 30;
                    
                    if(goods.get(i).lifeValue <= 0) {
                        game.deadCount ++;
                        goods.get(i).removedeadPlane();
                        
                    } 
                    this.createExplode();
                }
            }
            
        }
        
    }
    
    

}

(4)爆炸類Explode.java

package com.swing.plane;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

import com.swing.util.ImageLoadUtil;
/**
 * 爆炸類
 * @author may
 *
 */
public class Explode {
    
    private int x;//爆炸位置
    private int y;//爆炸位置
    private static Image[] images = new Image[10];
    private int count = 0;//當前播放到的圖片在數組中的下標
    private PanelGame game;//持有主窗口的引用
    
    //靜態加載圖片
    static {
        for(int i = 0; i < images.length; i++) {
            images[i] = ImageLoadUtil.loadImage("/lib/explode/" + (i) + ".gif");
            //避免Java的懶加載,讓它一用到就可直接用,不然可能一開始的一兩張圖將看不到
            images[i].getHeight(null);
        }
        
    }
    
    /**
     * 
     * @param x 位置
     * @param y 位置
     * @param game 遊戲主類
     */
    public Explode(int x, int y, PanelGame game) {
        this.x = x;
        this.y = y;
        this.game = game;
    }
    
    public void draw(Graphics g) {
        Color c = g.getColor();
        if(count == 3) {
            //播放完後將本身從主類容器中去掉
            game.getExplodes().remove(this);
        }
        g.drawImage(images[count ++], this.x - images[count ++].getWidth(null)/2 , this.y - images[count ++].getHeight(null)/2, 30, 30,  null);
        g.setColor(c);
    }

}

(5)方向枚舉常量

package com.swing.plane;

/**
 * 定義飛機運動的方向
 * @author may
 *
 */
public enum Director {
    
    U, RU, R, RD, D , LD, L, LU, STOP;
    
    
    
}

(6)圖片加載輔助類

package com.swing.util;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

public class ImageLoadUtil {

    private ImageLoadUtil() {}
    
    public static Image loadImage(String path) {
        
        BufferedImage image = null;
        
        try {
            image = ImageIO.read(ImageLoadUtil.class.getResource(path));
        } catch (IOException e) {
            e.printStackTrace();
        }

        
        return image;
        
    }
    
}

5、太陽系模型(這個是本人之前剛學java的時候看的那個尚學堂java300講視頻裏的,感受好玩就本身弄了一個)

一、效果

二、代碼

(1)定義圖形大小的一些常量類

package com.swing.sunModel;

/**
 * 常量類
 * @author may
 *
 */
public class Constant {
    
    public static final int GAME_WIDTH = 800;
    public static final int GAME_HEIGHT = 600;
    
    public static final int FIXED_WIDTH = 40;
    public static final int FIXED_HEIGHT = 35;

}

(2)Star.java接口類

package com.swing.sunModel;

import java.awt.Graphics;

/**
 * 行星的抽象類
 * @author may
 *
 */
public interface Star {
    
    public int getX();
    
    public int getY();
    
    public int getWidth();
    
    public int getHeight();
    
    public void draw(Graphics g);

}

(3)FixedStar.java恆星類

package com.swing.sunModel;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.util.ArrayList;
import java.util.List;

public class FixedStar implements Star {

    private int x;//x軸位置
    private int y;//y軸位置
    private int fixed_width;//物體的寬度
    private int fixed_height;//物體的高度
    private List<Star> planets = new ArrayList<Star>();//用於存儲行星的容器
    private static Image image = ImageLoadUtil.loadImage("/lib/Sun.png");////恆星的圖片
    
    
    public FixedStar(int fixed_width, int fixed_height) {
        //計算出xy的值,是它居中顯示
        this.x = (Constant.GAME_WIDTH - fixed_width)/2;
        this.y = (Constant.GAME_HEIGHT - fixed_height)/2;
        this.fixed_width = fixed_width;
        this.fixed_height = fixed_height;
        this.createPlanet();
        
        
    }
    /**
     * 建立圍繞它轉的全部行星
     */
    private void createPlanet() {
        Star earth= new Planet(100, 50, 30, 30, this, "/lib/earth.net.png", 0.09);
        planets.add(earth);
        planets.add(new Planet(20, 15, 15, 15, earth, "/lib/venus.png", 0.3, true));
        planets.add(new Planet(200, 100, 30, 30, this, "/lib/goog_mars.png", 0.08));
        planets.add(new Planet(250, 150, 30, 30, this, "/lib/uranus.png", 0.05));
        planets.add(new Planet(350, 200, 30, 30, this, "/lib/venus.png", 0.03));
    }
    
    /**
     * 繪畫方法
     * @param g
     */
    public void draw(Graphics g) {
        Color c = g.getColor();
        g.setColor(Color.red);
        //g.fillOval(this.x, this.y, fixed_width, fixed_height);
        g.drawImage(image, this.x, this.y, fixed_width, fixed_height, null);
        g.setColor(c);
        //畫出每一個行星
        for(int i = 0; i < this.planets.size(); i++) {
            planets.get(i).draw(g);
            
        }
    }
    
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public void setFixed_width(int fixed_width) {
        this.fixed_width = fixed_width;
    }
    public void setFixed_height(int fixed_height) {
        this.fixed_height = fixed_height;
    }
    @Override
    public int getWidth() {
        return fixed_height;
    }
    @Override
    public int getHeight() {
        return fixed_height;
    }
    
    
    
    
}

(4)父窗口類MyFrame.java

package com.swing.sunModel;

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * 定義一個父類,將經常使用的代碼寫到此處
 * @author may
 *
 */
public class MyFrame extends Frame {
    
    private static final long serialVersionUID = 8133309356114432110L;

    public MyFrame() {
        this.setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);
        this.setLocationRelativeTo(null);
        
        
        this.addWindowListener(new WindowAdapter() {
        
            @Override
            public void windowClosing(WindowEvent e) {
                MyFrame.this.dispose();
            }
        });
        this.setVisible(true);
        
    }
    

}

(5)飛機類Planet.java

package com.swing.sunModel;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.util.ArrayList;
import java.util.List;

public class Planet implements Star {

    private int x;//行星的位置
    private int y;//行星的位置
    private int planet_width;//行星的大小
    private int planet_height;//行星的大小
    private int longXpis; //離恆星的距離,就是橢圓的長軸
    private int shortXpis;//離恆星的距離,就是橢圓的短軸
    private Star fixedStar;//恆星
    private double degree = 1;//角度
    private Image image = null;//行星的圖片,因爲每一個行星不一樣,因此定義爲非靜態的
    private double speed = 0.01;//默認的改變角度的速度
    private List<Planet> moon = new ArrayList<Planet>();//定義行星的子行星,如地球的月亮
    private boolean satellite = false;

    public Planet(int x, int y) {
        this.x = x;
        this.y = y;

    }
    /**
     * 
     * @param longXpis 長軸
     * @param shortXpis 短軸
     * @param planet_width 行星的寬度
     * @param planet_height 行星的高度
     * @param fixedStar 中心星體,即恆星
     * @param path 圖片的位置
     * @param speed 角度改變的速度
     */
    public Planet(int longXpis, int shortXpis, int planet_width, int planet_height, Star fixedStar, String path,
            double speed) {
        //定義離中心星體的初始距離
        this(fixedStar.getX() + fixedStar.getWidth() / 2 + longXpis - planet_width / 2,
                fixedStar.getY() + fixedStar.getHeight() / 2 - planet_height / 2);
        this.longXpis = longXpis;
        this.shortXpis = shortXpis;
        this.planet_height = planet_height;
        this.planet_width = planet_width;
        this.fixedStar = fixedStar;
        this.image = ImageLoadUtil.loadImage(path);
        this.speed = speed;
    }
    
    public Planet(int longXpis, int shortXpis, int planet_width, int planet_height, Star planetStar, String path,
            double speed, boolean satellite) {
        this(longXpis, shortXpis, planet_width, planet_height, planetStar, path,
                speed);
        this.satellite = satellite;
    }
    
    /**
     * 繪畫方法
     * @param g
     */
    public void draw(Graphics g) {
        Color c = g.getColor();
        g.setColor(Color.gray);
        //畫出行星圖片
        g.drawImage(image, this.x, this.y, planet_width, planet_height, null);
        //畫出行星的運行軌跡
        if(!satellite) {
            g.drawOval(fixedStar.getX() - (longXpis - this.planet_width / 2),
                    fixedStar.getY() - (shortXpis - this.planet_height / 2), this.longXpis * 2, this.shortXpis * 2);
            
        }
        g.setColor(c);
        //如下的代碼使行星作橢圓運動
        this.x = (int) (fixedStar.getX() + longXpis * Math.cos(degree));
        this.y = (int) (fixedStar.getY() + shortXpis * Math.sin(degree));
        if(degree < 2 * Math.PI) {
            degree += speed;
            
        } else {
            degree = 0;
        }
        //畫子行星
        for(int i = 0; i < moon.size(); i++) {
            moon.get(i).draw(g);
        }
    }



    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
    @Override
    public int getWidth() {
        return planet_width;
    }
    @Override
    public int getHeight() {
        return planet_height;
    }
    
    

}

(6)主類sunMode.java

package com.swing.sunModel;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

public class SunModel extends MyFrame {
    
    private static final long serialVersionUID = -5330545593499050676L;
    private static Image image = ImageLoadUtil.loadImage("/lib/star.jpg");
    //恆星對象
    private FixedStar fixedStar = new FixedStar(Constant.FIXED_WIDTH, Constant.FIXED_HEIGHT);
    //建立一個緩衝圖,用於雙緩衝,避免閃爍出現
    private BufferedImage buffImage = new BufferedImage(Constant.GAME_WIDTH, Constant.GAME_HEIGHT, BufferedImage.TYPE_INT_RGB);
    
    public SunModel() {
        super();
        this.setResizable(false);
        new Thread(new MyThread()).start();
        
    }
    
    @Override
    public void paint(Graphics g) {
        //將緩衝圖直接畫上去
        g.drawImage(buffImage, 0, 0, null);
    }
    
    //重寫update方法,進行雙緩衝,將須要顯示的物體全畫到緩衝圖上,而後一次性顯示出來
    @Override
    public void update(Graphics g) {
        Graphics sunG = buffImage.getGraphics();
        //將背景圖畫上
        sunG.drawImage(image, 0, 0, null);
        fixedStar.draw(sunG);
        paint(g);
    }

    public static void main(String[] args) {
        new SunModel();
    }
    
    private class MyThread implements Runnable {

        @Override
        public void run() {
            while(true) {
                //調用重畫方法
                repaint();
                try {
                    Thread.sleep(30);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            
        }
        
        
    }

}

(7)圖片加載輔助類ImageLoadUtil.java

package com.swing.sunModel;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

public class ImageLoadUtil {

    private ImageLoadUtil() {}
    
    public static Image loadImage(String path) {
        
        BufferedImage image = null;
        
        try {
            image = ImageIO.read(ImageLoadUtil.class.getResource(path));
        } catch (IOException e) {
            e.printStackTrace();
        }

        
        return image;
        
    }
    
}

圖片放在src下的lib文件夾下

相關文章
相關標籤/搜索