分析
3.7號,我們是女生節,班級準備給女生點禮物,我的直男想法就想到了抖音那種表白小程序,感覺或許挺好玩的,就開始制作了
- 制作前先想想用什么語言寫比較好.備選項有Python,JAVA,Androidc,c++當時把情況一列我就覺得java的戲比較大.由于本人專業為軟件工程,這學期正好開始學習JAVA語言,而且前幾天的課就是搭建JAVA環境,所以用戶的環境是有的,python我們班也有編譯環境,但是據個人了解(或許有誤)需要python默認的包好像沒法實現,需要使用pygame包.而JAVAswing是默認包,無需另外配置環境了.至于剩余的C和C++個人使用較少,僅對起有一丟丟的理論了解,就不太考慮了,當然,如果忽略蘋果電腦,或許c,c++是更好的選擇,因為exe文件可直接window運行.Android好像也不錯,(其實網頁好像也可以?)這是我做完以后才想到了.
- 決定用JAVA以后,我當然沒有立刻開始寫…我選擇了百度,哈哈哈,大家應該都能找到網上那段都是一樣的代碼,我把他拿下來改進一下.一下為我改進的代碼.
import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import javax.swing.*;public class Girls extends JFrame{static int a = 0 ;static int exit = 0;static String[] str_exit = {"不要走嘛","嘗試挽留","真的要走嗎?","好吧,點1000次就給你走","騙你的,不忍心的嘻嘻","女生節快樂鴨!"};static String[] str = {"女生節不是在抵抗長大
而是在欣賞成熟的同時
依然可以保留女生的天真和活力","愿你,
喜愛甜食,也能吃得起生活的苦。愛掏網 - it200.com
","不畏懼年紀,始終保持少女心。愛掏網 - it200.com","向陽而生,被世界溫柔以待。愛掏網 - it200.com","女生節快樂鴨!!"};public void creatJFrame(String title){JFrame jf;jf=new JFrame(title);Container container=jf.getContentPane();JLabel label=newJLabel(str[a]);label.setFont(new Font("宋體", 1, 25));URL url1 = getClass().getResource("a.jpg");URL url2 = getClass().getResource("b.jpg");URL url3 = getClass().getResource("c.jpg");URL url4 = getClass().getResource("d.gif");ImageIcon image1 = new ImageIcon("a.jpg");image1.setImage(image1.getImage().getScaledInstance(100, 100,Image.SCALE_DEFAULT ));ImageIcon image2 = new ImageIcon("b.jpg");image2.setImage(image2.getImage().getScaledInstance(100, 100,Image.SCALE_DEFAULT ));ImageIcon image3 = new ImageIcon("c.jpg");image3.setImage(image3.getImage().getScaledInstance(100, 100,Image.SCALE_DEFAULT ));ImageIcon image4 = new ImageIcon("d.gif");image4.setImage(image4.getImage().getScaledInstance(100, 100,Image.SCALE_DEFAULT ));JLabel label1=new JLabel(image1);JLabel label2=new JLabel(image2);JLabel label3=new JLabel(image3);JLabel label4=new JLabel(image4);//設置標簽文字居中label.setHorizontalAlignment(SwingConstants.CENTER);JButton btnY=new JButton("接著看");JButton btnN=new JButton("不看了");//添加按鈕監聽事件btnN.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent arg0) {// TODO Auto-generated method stubif(Girls.a>=4|| Girls.exit>=13)System.exit(0);if (a5)a++;label.setText(str[a]);}});btnY.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent arg0) {// TODO Auto-generated method stubif(Girls.a>=4|| Girls.exit>=13)System.exit(0);if (a5)a++;label.setText(str[a]);}});btnN.addMouseListener(new MouseListener(){//鼠標點擊、移上、移出、松開事件@Overridepublic void mouseClicked(MouseEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent arg0) {// TODO Auto-generated method stubbtnN.setText("接著看");}@Overridepublic void mouseExited(MouseEvent arg0) {// TODO Auto-generated method stubbtnN.setText("不看了");}@Overridepublic void mousePressed(MouseEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent arg0) {// TODO Auto-generated method stub}});btnY.setBounds(120, 260, 80, 30);btnN.setBounds(380, 260, 80, 30);label1.setBounds(25,0,150,150);label2.setBounds(300,10,150,150);label3.setBounds(500,130,100,100);label4.setBounds(0,160,100,100);container.add(btnY);container.add(btnN);container.add(label1);container.add(label2);container.add(label3);container.add(label4);container.add(label);jf.setSize(600, 400);jf.setResizable(false);jf.setVisible(true);jf.setLocationRelativeTo(null);jf.setDefaultCloseOperation(EXIT_ON_CLOSE);jf.addWindowListener(new MyWindowListener());}public static void main(String[] args) {Girls a =new Girls();a.creatJFrame("18軟工");}}class MyJDialog extends JDialog{public MyJDialog(){super(new JFrame(),"18軟工",true);Container c=getContentPane();JLabel label;if(Girls.exit4)label=new JLabel(Girls.str_exit[Girls.exit]);else if(Girls.exit>=4&& Girls.exit10)label=new JLabel(1004 - Girls.exit+"");elselabel=new JLabel(Girls.str_exit[Girls.exit-7]);Girls.exit++;label.setHorizontalAlignment(SwingConstants.CENTER);JButton btnY=new JButton("接著看");JButton btnN=new JButton("不看了");//添加按鈕監聽事件btnN.addMouseListener(new MouseListener(){//鼠標點擊、移上、移出、松開事件@Overridepublic void mouseClicked(MouseEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent arg0) {// TODO Auto-generated method stubbtnN.setText("接著看");}@Overridepublic void mouseExited(MouseEvent arg0) {// TODO Auto-generated method stubbtnN.setText("不看了");}@Overridepublic void mousePressed(MouseEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent arg0) {// TODO Auto-generated method stub}});//添加按鈕監聽事件btnN.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent arg0) {// TODO Auto-generated method stubif(Girls.a>=4|| Girls.exit>=13)System.exit(0);if (Girls.a5)Girls.a++;label.setText(Girls.str[Girls.a]);}});btnY.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent arg0) {// TODO Auto-generated method stubif(Girls.a>=4|| Girls.exit>=13)System.exit(0);if (Girls.a5)Girls.a++;label.setText(Girls.str[Girls.a]);}});btnY.setBounds(30, 100, 80, 30);btnN.setBounds(158, 100, 80, 30);c.add(btnY);c.add(btnN);c.add(label);setSize(300, 200);setResizable(false);this.addWindowListener(new MyWindowListener());this.setLocationRelativeTo(null);}}
class MyWindowListener extends WindowAdapter{//窗體關閉過程中觸發函數public void windowClosing(WindowEvent e){if(Girls.a>=4|| Girls.exit>=13)System.exit(0);new MyJDialog().setVisible(true);}
}
如果覺得太長懶得看的話,直接代碼復制粘貼就可以拿去用了,當然字要改一下.講一下遇到的一些問題已經改進.
- 首先有一說一,這代碼我寫得跟屎山一樣…一切我都以能實現功能就好.大家不要寫我這么爛的代碼,重復度挺高的.
- 說正題,原來的代碼點擊關閉后,就會彈出一個彈窗,但是彈窗再關閉就全關了,達不到類似整蠱的效果,解決方案也很簡單,當點擊彈窗的關閉時再彈出一個彈窗,這樣就能無限月讀了,達到無法關閉程序的效果,然后自己再根據實際情況,設置跳出的條件,System.exit(o)即可關閉程序.
- 在label中無法\n換行,解決方案時html代碼,
即可 - 字體很丑,樣式也很丑,這是我對整個程序最不滿意的地方…但是也沒太大辦法解決,只是盡量沒那么丑
- 圖片無法顯示的問題,圖片顯示的話,咱們肯定得用相對路徑才能發給別人用,但是這個相對路徑,是應該相對.class文件,還跟包名有一定關系,而且包名對后面的編譯也會有影響,個人蠢一點的解決方案是,將圖片放在.class的路徑下,網上比較好的解決方案是url的方法,我也定義在了上面,不過至于為什么最后沒用這個,稍后再說(這里有好幾個問題待解決)
- 完成程序后,就應該想怎么發給用戶使用,盡量不使用集成開發環境會好點,所以就要手動編譯了,首先比較容易解決的是包的問題,直接把開頭的包全部刪除即可.然后編譯即可,但是多次嘗試java .class文件,始終無法找到主類,我百思不得其解,后來我通過java GIrls.java的方式編譯運行成功了.(具體原因待解)
- 運行是運行出來了…可惜中文亂碼了…而且圖片沒有顯示…中文亂碼的問題比較好想到,我的編譯器是utf-8編碼,但是系統gbk編碼,所以亂碼是肯定的…所以百度utf-8轉gbk的網站,解決√但是,實際上應該有更好的解決方案,就是通過javac 指定編碼格式,然后再java 主類這樣才是最好的解決方法…可惜不知道為什么我沒法運行.class文件,報錯找不到主類(待解決)
- 圖片不顯示的原因是因為相對路徑的原因,cmd進入文件的路徑即可.也不是很完美,實際上通過url的方法的話,就沒那么多麻煩了,但是也凌晨很晚了,腦子暈乎乎的,轉不起來了,只想著可以實現就好.
- 最后,可以通過cmd運行了以后,用bat來處理一下就更方便了,將源碼和圖片放入一個文件夾a ,寫一個bat文件,cd a java Girls.java.然后再用一個文件夾把這兩個都裝起來.這樣就可以實現點擊bat文件運行程序了
- 發上去給其他同學先試驗一下…結果第二天起床反應,找不到主類,然后通過javac 再java的方法可以正常運行…我就更加疑惑了…不過大部分人都是上面的情況,所以也以以上情況改寫一bat文件,就完工了.不過最后還是有一點小問題…可以通過關閉cmd窗口直接關閉整個程序…
總的來說,一路上磕磕碰碰的,暴露了我的很多缺點,學習java時直接跳過了手動編譯,使用集成開發環境,導致自己對整個編譯過程并不熟悉.第二就是基礎知識還是很不扎實,需要多多練習,遇到問題多查查文檔.最后感謝看完整篇博客,如果有大神肯指點一下其中遇到的一些疑惑,感激不盡.如果沒有指點…那我也還是會自己去那里解決的,嘿嘿
更新:我去嘗試修復java 和 javac的問題,重新配置了一遍環境變量解決了.如果可以直接javac的話,可以javac -encoding Utf-8 Girls.java來解決亂碼的問題,用url代替直接的相對路徑,問題很簡單很多