發表文章

目前顯示的是 9月, 2021的文章

[Java] 利用 getInputMap、getActionMap 和 KeyStroke 從外部新增 Action

承自上一篇 javax 中 KeyListener 的遲鈍問題 解決了聽取按鍵的延遲問題,終於看懂那個 StackOverflow 的解答,試著自己把他做出來,而且更貪心地我想做成一個類別,之後都能用,就像 pygame 裡 sprite 的 update() 一樣。但是 Java 寫起來超級長而且很不自由,非常不滿意,期待之後能改良: 首先這個類別 GameObject 是繼承自 JLabel ,他是 JComponent 的子類別就有 InputMap 和 ActionMap 可以使用鍵盤功能,簡單型式(不考慮聽取鍵盤的延遲問題的話的作法)如下: GameObject.java package game; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JLabel; import javax.swing.KeyStroke; public class GameObject extends JLabel implements ActionListener{ Action goLeft; // 宣告一個 Action 準備給按下左鍵時動作,內容在下面重載 public GameObject() { goLeft = new LeftAction(); this.getInputMap().put(KeyStroke.getKeyStroke("pressed LEFT"), "leftAct"); this.getActionMap().put("leftAct", goLeft); // 用 "pressed Left" 字串會得到一個鍵值,並對應到 "leftAct" 字串 // 再用 Action...

[Java] javax 中 KeyListener 的遲鈍問題

看 GrandmaCan -我阿嬤都會(小白) 的3小時用 Pygame 做出遊戲 影片,想說自己來用 Java 做做看,在移動太空船的地方,想法大概是用 JLabel 來做太空船,在 JFrame 用 .addKeyListener(new KeyListener(){ }) 來取得鍵盤輸入,當輸入 'a' 時( code 65)將太空船的位置 x 減少就會左移,輸入 'd' 時(code 68)將 x 增加就會右移,程式碼大概如下: 基本的 KeyListener 聽取鍵盤輸入 mainStart.java public class mainStart { public static void main(String[] args) { new TestBasicKeyListener(); } } TestBasicKeyListener.java import java.awt.Color; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class TestBasicKeyListener extends JFrame{ JPanel myPanel; JLabel myLabel; public TestBasicKeyListener() { myPanel = new JPanel(); myLabel = new JLabel(); myPanel.setSize(500,600); myLabel.setSize(50,40); //設定一個長50寬40的JLabel myLabel.setBackground(Color.orange); myLabel.setOpaque(true); //背景橘色,不透明 myPanel.setLayout(null); myPanel.add(myLabel); myPan...

[Java] Hibernate CRUD

一切設定好後(有 使用 hbm.xml 對應檔案 ,和 持久化物件中使用 Annotation 兩種) Hibernate 中使用 CRUD (Create、Read、Update、Delete) import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import java.util.List; public class TestIO { private static SessionFactory factory; public static void main(String[] args) { factory = new Configuration() .configure() .buildSessionFactory(); //若使用 Annotation 則在 buildSessionFactory()之前要 .addAnnotatedClass(Obj.class) Session session = factory.openSession(); Transaction transaction = session.beginTransaction(); // Create Obj myObj1 = new Obj("data2", data3); session.save(myObj1); // 由建構子設定 myObj1 兩個值(id 由 Hibernate 決定),執行session.save() 會 // 準備將之依照對應 column 各值存入資料庫表格中 // Read 用主鍵取特定資料 Obj myObj2 = (Obj)session.get(Obj.class, 5); System.ou...

[Java] Hibernate 使用 Annotation 配置

Hibernate 安裝 好之後,若用物件內定義註釋 Annotation 的作法如下: 檔案配置 在 src / main / java 右鍵 New > Other... 搜尋 hibernate,選擇 Hibernate Configuration File (cfg.xml),點 Next 使用預設的檔名 hibernate.cfg.xml 即可(若更動檔名則後續在使用時, .configure() 要另外指定檔名) 可用他的 Wizard 來輸入完成 cfg.xml ,或直接 Finish ,在檔案右鍵 Open With > Generic Text Editor 手動輸入 如果 MySQL 的 database 叫 mydb,帳號 root,密碼 abc1234,則 hibernate.cfg.xml 範例如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</property> <property name="hibernate.connection.username...

[Java] Hibernate 使用 .hbm.xml 配置

Hibernate 安裝 好之後,若用對應檔案 .hbm.xml 的作法如下: 檔案配置 在 src / main / java 右鍵 New > Other... 搜尋 hibernate,選擇 Hibernate Configuration File (cfg.xml),點 Next 使用預設的檔名 hibernate.cfg.xml 即可(若更動檔名則後續在使用時, .configure() 要另外指定檔名) 可用他的 Wizard 來輸入完成 cfg.xml ,或直接 Finish ,在檔案右鍵 Open With > Generic Text Editor 手動輸入 如果 MySQL 的 database 叫 mydb,帳號 root,密碼 abc1234,則 hibernate.cfg.xml 範例如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</property> <property name="hibernate.connection.username"...

[Java] Hibernate 基本配置

下載安裝 Hibernate google "Hibernate Tools" 或 "JBoss Tools" 進入 JBoss Tools 選 Download ,找穩定版本(例如 JBoss Tools 4.19.1.Final) 點 Download,獲得一個 URL (例如 https://download.jboss.org/jbosstools/photon/stable/updates/) 打開 Eclipse JavaEE,選擇 Help > Install new Software... > 在 Work with 填入上述 URL 靜候片刻,清單會列出很多可以下載的東西,在 Filter 輸入 hibernate ,點選 Hibernate Tools 和 JBoss Maven Hibernate Configurator,點選 Next 後會開始下載,進度條在右下角要注意不要沒下載完就關閉 依提示同意條款和重開 Eclipse 後,File > New > Other... 在 Wizard 中搜尋 hibernate 若有 cfg.xml 和 hbm.xml 等四個選項則成功 google "Hibernate ORM" 進入 Hibernate.org 點選 ORM 標籤,選擇最新且穩定版本,下拉選 Zip Archive 下載 解開檔案(例如 hibernate-release-5.5.7.Final.zip),可以找個 Source 資料夾集中管理 Library 配置 新增 MySQL 驅動 jar 檔(例如 mysql-connector-java-8.0.26.jar)到 project/src/main/webapp/WEB-INF/lib 下 將 Hibernate ORM 解開的 /lib/required/ 下所有 jar 檔新增到 project/src/main/webapp/WEB-INF/lib 下 以上應該就會新增這些 jar 檔了,若還沒有就在 Eclipse Java EE 中 Project Explorer 樹狀圖在上述 WEB-INF/lib 右鍵 Sour...

[Java] JDBC 使用 MySQL 筆記

雖然學 Hibernate 後可能就不太會重寫 JDBC 這些繁雜的 code 還是記錄一下 如果 MySQL 的 database 叫 mydb,帳號root,密碼abc1234,對表格 mytable 做 insert 、update 和 select 動作: import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.sql.ResultSet; import java.sql.SQLException; public class JdbcSample { String driverName = "com.sql.cj.jdbc.Driver"; // Java6之前用com.sql.jdbc.Driver String connectionString = "jdbc:mysql://localhost:3306/mydb?" + "user=root&password=abc1234&useUnicode=true&characterEncoding=utf-8"; try { Class.forName(driverName); Connection conn = DriverManager.getConnection(connectionString); //獲得連線 Statement stat = conn.createStatement(); String insertString = "insert into mytable(col1, col2) values(data1, 'data2')"; int count1 = stat.executeUpdate(insertString); //對 MySQL 執行,增加一筆col1=data1、col2='data2'的資料到表格mytable中 //同時回傳一個整數給count表示此動作影響了幾個row String updateString =...

[Java] Eclipse 給 JDBC 增加 MySQL 的 driver

圖片
在 Eclipse Java SE 中輕鬆: 在 Package Explorer 中,在 project 上右鍵 選 Build Path ,選 Add External Archives... 找到 MySQL 資料夾中的 ./Connector J 8.0/ 的 mysql-connector-java-8.0.26.jar 確定 但在 Eclipse Java EE 就弄了很久,做個記錄: 在 Project Explorer 中,在 project 上右鍵 選 Build Path, 選 Configure Build Path... 切到 Source 標籤 選右邊 Link Source... Browse 找到 MySQL 放 mysql-connector-java-8.0.26.jar 檔案的資料夾 (./Connector J 8.0/ ) Apply 後回到 Project Explorer 會有 Connector J 8.0 打開會有 mysql-connector-java-8.0.26.jar 右鍵選 Build Path... 選 Add to Build Path 待增加了 Referenced Libraries 中有 mysql-connector-java-8.0.26.jar 更快更好的是把 jar 檔和專案放一起: 到 MySQL/Connector J 8.0/ 複製 mysql-connector-java-8.0.26.jar 一份到 project/src/main/webapp/WEB-INF/lib/ 在 Project Explorer 中樹狀圖找到上述 lib 資料夾,右鍵選 Source ,選 Format 展開 lib 就會看到 jar 檔出現在樹狀圖 lib 之下,再對 jar 檔右鍵 選 Build Path ,然後 Add to Build Path ,如此在 Referenced Libraries 中就有了