import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ImageExpert {
public static void cropImage(String location, String x, String y, String h, String w){
try {
BufferedImage img = ImageIO.read(new File(location));
Dimension size = new Dimension(Integer.valueOf(w), Integer.valueOf(h));
Rectangle clip = null;
if ((size.width + Integer.valueOf(x)) <= img.getWidth()
&& (size.height + Integer.valueOf(y)) <= img.getHeight()) {
clip = new Rectangle(size);
} else {
if ((size.width + Integer.valueOf(x)) > img.getWidth()){
size.width = img.getWidth() - Integer.valueOf(x);
}
if ((size.height + Integer.valueOf(y)) > img.getHeight()){
size.height = img.getHeight() - Integer.valueOf(y);
}
clip = new Rectangle(size);
}
clip.x = Integer.valueOf(x);
clip.y = Integer.valueOf(y);
BufferedImage clipped = img.getSubimage(clip.x, clip.y, clip.height, clip.width);
File outputfile = new File(location);
ImageIO.write(clipped, getImageType(location), outputfile);
} catch (IOException e) {
e.printStackTrace();
}
}
private static String getImageType(String locationOrName){
return locationOrName.substring((locationOrName.lastIndexOf(".")+1));
}
}
2014年6月24日 星期二
【Java】圖像裁切
呼叫 ImageExpert 的 cropImage method
傳入圖片的所在路徑,以及要裁切位置的 x 與 y 軸,和要裁切的長度與高度
2014年6月21日 星期六
2011年12月6日 星期二
設計模式 - Builder
關於 Design Pattern 的 Builder(生成器)模式,有以下幾個特點
1. 將物件的複雜建立過程封裝起來,不讓Client知道
2. 能將複雜的組件建立與組件的操作分開
3. 每個 Builder 都是各自獨立,維護方便
4. 使用相同的建造過程但是產生不同的物件
底下用一個 Java 範例來呈現 Builder 模式 的範例
首先一個電腦 (AbstractComputer) 會由很多組件(AbstractComputerItem)所組成
這些組件例如以下
處理器(AbstractCpu)
螢幕(AbstractMonitor)
應用程式(AbstractApp)
硬碟(AbstractDisk)
鍵盤(AbstractKeyboard)
1. 將物件的複雜建立過程封裝起來,不讓Client知道
2. 能將複雜的組件建立與組件的操作分開
3. 每個 Builder 都是各自獨立,維護方便
4. 使用相同的建造過程但是產生不同的物件
底下用一個 Java 範例來呈現 Builder 模式 的範例
首先一個電腦 (AbstractComputer) 會由很多組件(AbstractComputerItem)所組成
這些組件例如以下
處理器(AbstractCpu)
螢幕(AbstractMonitor)
應用程式(AbstractApp)
硬碟(AbstractDisk)
鍵盤(AbstractKeyboard)
2011年10月18日 星期二
Java 產生 Excel 檔
這裡分享一段程式碼 運用 Java Excel 建立一份 Excel 檔案
而 Java Excel API 並不侷限在 Windows 的環境下
以下是簡單的範例程式
而 Java Excel API 並不侷限在 Windows 的環境下
以下是簡單的範例程式
int row=0;
File execlFile = new File(EXCEL_PATH); //建立Excel的檔案路徑
WritableWorkbook workbook = Workbook.createWorkbook(execlFile); //建立檔案
WritableSheet sheet = workbook.createSheet("class info", 0); //新增一個 Sheet
Label label = new Label(0, row, "課程編號"); //新增一個 label 表示 title
sheet.addCell(label);
label = new Label(1, row, "課程名稱"); //新增一個 label 表示 title
sheet.addCell(label);
row++;
for(Iterator it = classvos.iterator(); it.hasNext();row++){
ClassVO classvo = it.next();
label = new Label(0, row, classvo.getClass_no());
sheet.addCell(label);
label = new Label(1, row, classvo.getClass_name());
sheet.addCell(label);
}
workbook.write();
workbook.close();
2011年9月24日 星期六
【iText】建立 PDF 表格
這裡介紹一下如何運用 iText 這個套件來建立 PDF 檔中的表格
首先要先去下載 iText
目錄下有兩個 folder 一個是 iText 的 library 另一個是額外會用到的
在 extrajars 目錄下可以下載 iTextAsin 這個 JAR 檔 他能夠用來解決中文問題
完成配置之後就可以來建立一個簡單的 PDF 且內涵表格
也順帶說明如何解決中文文字的問題
首先要先去下載 iText
目錄下有兩個 folder 一個是 iText 的 library 另一個是額外會用到的
在 extrajars 目錄下可以下載 iTextAsin 這個 JAR 檔 他能夠用來解決中文問題
完成配置之後就可以來建立一個簡單的 PDF 且內涵表格
也順帶說明如何解決中文文字的問題
//設定 PDF 大小為 A4 樣式
Document document = new Document(PageSize.A4);
// PDF_PATH 為你的 PDF 檔的輸出路徑/
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(PDF_PATH));
PdfPTable table = new PdfPTable(2); //建立一個只有兩個欄位的表格
table.setWidthPercentage(100f); //設定表格寬
table.setWidths(new float[]{0.20f, 0.90f}); //課定這兩個欄位的比例大小
//中文字的解決
BaseFont bfChinese = BaseFont.createFont("c:\\windows\\fonts\\kaiu.ttf", "Identity-H", BaseFont.NOT_EMBEDDED);
Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);
PdfPCell cell = new PdfPCell(); //建立一個儲存格
//透過 Paragraph 物件增加元素及指定編碼, 也可以直接存入字串
cell.addElement(new Paragraph("課程代碼", FontChinese));
table.addCell(cell);
cell = new PdfPCell();
cell.addElement(new Paragraph("課程名稱", FontChinese));
table.addCell(cell);
document.add(table); //將表格加入 PDF 檔案裡
document.close();
2011年8月8日 星期一
Java 網路程式 - HttpClient 實現 Get 請求
以下透過 org.apache.commons.httpclient 來模擬一個 GET 請求
httpclient 提供了一些簡單的 API 讓程式設計師可以使用一些簡單的HTTP溝通
底下透過一個範例來介紹 Get 請求的作法
httpclient 提供了一些簡單的 API 讓程式設計師可以使用一些簡單的HTTP溝通
底下透過一個範例來介紹 Get 請求的作法
//.....
String targetUrl = "http://localhost:8080/test/LoginAction.do" //請求路徑
HttpClient client = new HttpClient(); //建立一個 HttpClient 物件
HttpMethod method = new GetMethod(targetUrl ); //建立一個 Get Http method
NameValuePair param1 = new NameValuePair("account","tester1"); //加入請求參數
NameValuePair param2 = new NameValuePair("password","123456") //加入請求參數
method.setQueryString(new NameValuePair[]{param1 ,param2}); //設定所有請求參數
int statusCode = client.executeMethod(method); //發出 Request,並返回 Http 狀態碼
System.out.println("Http status : " + HttpStatus.getStatusText(statusCode));
method.getResponseBodyAsString(); //取得回應內容 為String
// or
method,getResponseBodyAsStream(); // 取得回應的輸入串流
method.releaseConnection();
2011年8月6日 星期六
【JACOB】Office 轉 HTM、MHT
本篇來介紹一下 MS Office 的轉檔案例,以下會說明要如何將 word、ppt、excel
透過 JACOB 操作 Office 進行轉檔的過程,而最終產出結果為 HTM 檔
接著就以一個 Word 操作的 Sample 來介紹
透過 JACOB 操作 Office 進行轉檔的過程,而最終產出結果為 HTM 檔
接著就以一個 Word 操作的 Sample 來介紹
//.....
String officeFilePath = "C:\\abc.doc"; //word 檔
String HtmFilePath = "C:\\abc.htm"; //轉出檔
//初始化 Wrod
ActiveXComponent activeX_App = new ActiveXComponent("Word.Application");
try{
//將操作 office 的過程設定為背景執行
activeX_App.setProperty("Visible", new Variant(false));
// 取得 該 Word 的Dispatch 物件,透過設置Property 為 "Documents"
Dispatch prop = activeX_App.getProperty("Documents").toDispatch();
//載入 word 檔案並開啟 運用 Dispatch.invoke(...).toDispatch() 返回一個 Dispatch 物件
Dispatch office = Dispatch.invoke(
prop,
"Open",
Dispatch.Method,
new Object[] {officeFilePath, new Variant(false),
new Variant(true) },
new int[1]).toDispatch();
//將 word 文件另存成 HTM 檔
Dispatch.invoke(office,
"SaveAs",
Dispatch.Method,
new Object[] {mhtFilePath, new Variant(8)}, //WORD 轉 HTM 的代碼為 8
new int[0]);
Dispatch.call(office, "Close"); //關閉 Word
}catch(Exception e){
e.printStackTrace();
}finally{
activeX_App.invoke("Quit");
}
2011年8月5日 星期五
【JACOB】Java-COM Bridge 介紹
在說到 JACOB 之前先來談談 Java 特性
首先 大家都知道的 Java 優點中 其中一項即是 "跨平台"
Java 將程式設計師與底層的作業系統隔開 讓 Java 程式能夠在不同的平台上開發、運行
說到這個優點,也就因為如此導致 Java 與底層的作業系統變的毫無關係
這樣的情況讓 Java 需要透過底層的作業系統操作或運用某些函式庫是格外困難
例如最近遇到的需求,我們需要將 MS office 的檔案轉檔成 HTM
如果 AP 存在於 Window OS 下,要如何透過 Java 實現?有幾種方法
其中一個的解決方案可以透過 JNI 另外一種可以考慮一下 JACOB
JACOB 是透過 C 語言寫成的,並提供一個 Java bridge 讓你的 Java 程式可以呼叫
執行環境需要在 Window OS 下,在 Linux 是不 work 的
因為在使用 JACOB 時,除了導入相關的 JAR 以外,還需將 jacob.dll
首先 大家都知道的 Java 優點中 其中一項即是 "跨平台"
Java 將程式設計師與底層的作業系統隔開 讓 Java 程式能夠在不同的平台上開發、運行
說到這個優點,也就因為如此導致 Java 與底層的作業系統變的毫無關係
這樣的情況讓 Java 需要透過底層的作業系統操作或運用某些函式庫是格外困難
例如最近遇到的需求,我們需要將 MS office 的檔案轉檔成 HTM
如果 AP 存在於 Window OS 下,要如何透過 Java 實現?有幾種方法
其中一個的解決方案可以透過 JNI 另外一種可以考慮一下 JACOB
JACOB 是透過 C 語言寫成的,並提供一個 Java bridge 讓你的 Java 程式可以呼叫
執行環境需要在 Window OS 下,在 Linux 是不 work 的
因為在使用 JACOB 時,除了導入相關的 JAR 以外,還需將 jacob.dll
2011年5月17日 星期二
【Java】Object 的 clone 運用
Java 中 java.lang.Object 複製(Clone),提供了複製一個物件的新做法
通常在複製物件的時候,大多數直覺都是直接把一個物件 assign 給另外一個物件
譬如以下範例:
以上程式用很直覺的方法複製了一個物件,之後book2 Console 出來的值,即會同 book1
如果要採用 Object 的 clone() 方法複製物件的話,需如以下指定的步驟
1.在欲被複製的類別中實作 Cloneable 介面
通常在複製物件的時候,大多數直覺都是直接把一個物件 assign 給另外一個物件
譬如以下範例:
//....
Book book1 = new Book();
book1.setId(1);
book1.setBookName("Java Study");
/*以下複製一個新的Book物件*/
Book book2 = book1;
System.out.println("Id " + book2.getId() + "Name : " + book2.getName());
//....
以上程式用很直覺的方法複製了一個物件,之後book2 Console 出來的值,即會同 book1
如果要採用 Object 的 clone() 方法複製物件的話,需如以下指定的步驟
1.在欲被複製的類別中實作 Cloneable 介面
public class Book implements Cloneable{
//.....
}
2011年5月14日 星期六
iBatis 教學 - CRUD 基礎操作
針對 iBatis 對資料的基本四大操作中,看看他們的映射文件是如何撰寫的
先來看看本篇用的實體物件 Book
首先先來看 "Create",以下是一個在映射檔中的簡單 INSERT 寫法
先來看看本篇用的實體物件 Book
import org.pojo.Book
public class Book{
private int id;
private String bookName;
private String bookPrice;
private String category
//other getter and setter...
}
首先先來看 "Create",以下是一個在映射檔中的簡單 INSERT 寫法
<insert id="insertBook" parameterClass="org.pojo.Book">
INSERT INTO
t_book (ID, BOOK_NAME, BOOK_PRICE, BOOK_CATE)
VALUES (#id#, #bookName#, #bookPrice#, #category#)
</insert>
2011年5月12日 星期四
iBatis 教學 - Eclipse 配置與範例
iBatis 是 Apache Software Foundation 中的一項 ORM 的解決方案
說到 iBatis 的話,其主要是能夠大量減少操作資料庫的繁複程式碼
而 iBatis 也是透過類似 Hibernate 的映射文件的XML格式來做 Javabean 和 SQL 的語句轉換
但這也是它和 Hibernate 不太一樣的地方。我的解釋是 Hibernate 主要是將物件或物件彼此之間的關係透過映射文件對應到資料庫
通常這些物件都是 Entity Type 也有些許是 Value Type。例如將一個 User 的實體類別映射到某 table
甚至是連帶的關聯關係和繼承的等等都能透過 Hibernate 的映射文件映射到資料庫
而 iBatis 則是將Javabean 透過 XML 的設定來和SQL做轉換
2011年4月2日 星期六
Java 程式 - 分禮物
每年的耶誕節,都會有交換禮物的活動。現在有一群人,要交換彼此的禮物,但是每個人都不能拿到自己準備的禮物,且每個都只有會拿到一件禮物,請問共有幾種情形,並把所有可能情形印出來。
輸入說明:
第一列輸入一個正整數n (<20)。其後有n列,每一列代表每個人,每一列之資料依序為人名、禮物名。請注意人名與禮物名為英文字母。
輸出說明:
第一列顯示出可以有k種資料,其後顯示1組解列,其資料按照原本人名輸入的順序排列,即人名和禮物名視為同一組,一列中會有很多組,組與組間用逗號區分,用人名與禮物名用空白分隔。
範例:
| Sample Input: | Sample Output: |
| A1 GIFT1 B1 GIFT2 C1 GIFT3 | 2 A1 GIFT2,B1 GIFT3,C1 GIFT1 A1 GIFT3,B1 GIFT1,C1 GIFT2 |
2011年4月1日 星期五
Java 程式 - 螺旋三角形的邊長問題
問題描述:
螺旋圖形由小至大的正三角形依序排列而成,如圖所示
圖中的每個正三角形中的數字代表其邊長
三角形的排列方式為由內到外螺旋排列而成
每個三角形其邊長為鄰近三角形邊長之和
三角形的邊長與三角形的螺旋排序(由內到外),其序列編號與所對應的三角形邊長如下所示:
序列編號 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
邊長 | 1 | 1 | 1 | 2 | 2 | 3 | 4 | 5 | 7 | 9 | 12 | 16 |
請寫出程式,求出任意序列編號時,求出對應的正三角形的邊長為多少?
輸入說明:
輸入一個小於70的三角形序列編號,例如8。
輸出說明:
輸出序列編號8對應的三角形邊長7。
2011年3月15日 星期二
Java 網路程式 - 網路對播
透過 Java Socket 的 Client/Server 的實作來達成 雙方間一對一的通訊
但是同一時間只能有一方傳送資料,且 Server 端只能同時服務一個 Client
這樣的對播較容易實作,如需服務多個 Client 實則需透過執行緒去處理
這個之後我在發文吧,先來看看以下簡易的網路對播程式 在 Server/Client 的作法都類似
透過 flag 變數去控制目前是該等待接收資料 還是 輸入傳送資料
end 變數則是控制目前對話的狀態,true 為中止。以下片斷程式以 Client 為例
while(!end)
{
while(flag == 0){ //傳送
//.....
if(message.equals("@")) //遇到 @ 時,轉換 flag
}
while(flag ==1){ //接收
//.....
if(message.equals("@")) //遇到 @ 時,轉換 flag
}
}
但是同一時間只能有一方傳送資料,且 Server 端只能同時服務一個 Client
這樣的對播較容易實作,如需服務多個 Client 實則需透過執行緒去處理
這個之後我在發文吧,先來看看以下簡易的網路對播程式 在 Server/Client 的作法都類似
透過 flag 變數去控制目前是該等待接收資料 還是 輸入傳送資料
end 變數則是控制目前對話的狀態,true 為中止。以下片斷程式以 Client 為例
while(!end)
{
while(flag == 0){ //傳送
//.....
if(message.equals("@")) //遇到 @ 時,轉換 flag
}
while(flag ==1){ //接收
//.....
if(message.equals("@")) //遇到 @ 時,轉換 flag
}
}
2011年3月4日 星期五
Java 網路程式 - Client/Server 通訊實作
本篇介紹以 Java Socket 實做 Client/Server 的簡單通訊實做
主要以 Socket 實現一個Server 端來接收 Client 的連線 往後在介紹更多的 Client/Server 的通訊方法
首先先說明常用於網路串流的 DataInputStream 和 DataOutputStream
不過你也是可以利用其他的串流類別,如: PrintWriter
通常再某一端(Client) 如要讀取Server的資料或是傳送資料給Server 時
都需要取得串流在能夠讀取或是寫入,而都是以
java.net.Socket 的 getInputStream() 和 getOutputStream() 這兩個方法來取得串流
並加載於 DataInputStream 或是 DataOutputStream 上,例如以下所示
DataInputStream datain = new DataInputStream(socket.getInputStream());
主要以 Socket 實現一個Server 端來接收 Client 的連線 往後在介紹更多的 Client/Server 的通訊方法
首先先說明常用於網路串流的 DataInputStream 和 DataOutputStream
不過你也是可以利用其他的串流類別,如: PrintWriter
通常再某一端(Client) 如要讀取Server的資料或是傳送資料給Server 時
都需要取得串流在能夠讀取或是寫入,而都是以
java.net.Socket 的 getInputStream() 和 getOutputStream() 這兩個方法來取得串流
並加載於 DataInputStream 或是 DataOutputStream 上,例如以下所示
DataInputStream datain = new DataInputStream(socket.getInputStream());
2011年2月6日 星期日
【Java XML】JDOM 介紹
再 JAVA 的開發環境裏如果要生成 XML 檔或是針對 XML 檔作分析時
最直接的方法可以直接針對 XML 的格式輸出或是轉成 String 型態來擷取想要的資訊
但往往這樣做複雜且也容易出錯,因此可以使用 JDOM 來解析 XML
首先先到 http://www.jdom.org 下載 JDOM 的類別庫,目前最新版為 1.1.1
下載完並解壓縮後在 jdom 目錄下的 build 會有一個 jdom.jar,將它加到你的路徑中
就可以用 JDOM 來開發 XML 了,以下先介紹 JDOM 是如何解析 XML 的
org.jdom.input.SAXBuilder 類別:
當要讀取 XML 時,要使用 org.jdom.input 下的 SAXBuilder 搭配輸入串流來建構 XML 檔
org.jdom.Document 類別:
代表了你這份 XML 的物件
最直接的方法可以直接針對 XML 的格式輸出或是轉成 String 型態來擷取想要的資訊
但往往這樣做複雜且也容易出錯,因此可以使用 JDOM 來解析 XML
首先先到 http://www.jdom.org 下載 JDOM 的類別庫,目前最新版為 1.1.1
下載完並解壓縮後在 jdom 目錄下的 build 會有一個 jdom.jar,將它加到你的路徑中
就可以用 JDOM 來開發 XML 了,以下先介紹 JDOM 是如何解析 XML 的
org.jdom.input.SAXBuilder 類別:
當要讀取 XML 時,要使用 org.jdom.input 下的 SAXBuilder 搭配輸入串流來建構 XML 檔
org.jdom.Document 類別:
代表了你這份 XML 的物件
2011年1月29日 星期六
【Java Web】DAO 簡介
DAO 主要是讓處理及操作資料庫更為方便,用來封裝資料庫持久層的操作
即可將很多複雜的資料操作語法和業務邏輯分開
探討其思想其實也是一種 ORM 的概念,以下簡介其基本組成
通常會有一個 DAO 的介面以及一個 DAO 的實現類別
以下以一個用戶註冊或登錄的過程做介紹,首先先來看一下 DAO Interface
即可將很多複雜的資料操作語法和業務邏輯分開
探討其思想其實也是一種 ORM 的概念,以下簡介其基本組成
通常會有一個 DAO 的介面以及一個 DAO 的實現類別
以下以一個用戶註冊或登錄的過程做介紹,首先先來看一下 DAO Interface
package fsc.regLog.dao
public interface UserDao
{
//登入時,如果成功即回傳一個封裝後的 User 物件,
public User login(String username, String password);
//註冊
public void register(User u);
//檢查 User 是否存在
public boolean checkUser(User u);
}
2011年1月16日 星期日
JSP 教學 - JFreeChart 製作及中文亂碼問題
JFreeChart 唯一個能運用 JAVA 程式來繪製出各種多樣化的報表圖型,如圓餅圖,長條圖等
此為它的官網,http://www.jfree.org/jfreechart/ 先將壓縮檔下載下來後解壓縮
我是下載 jfreechart-1.0.13 版的,解壓縮後在目錄下的 lib 目錄中的所有JAR複製到WEB專案
路徑下的 /WEB-INF/lib 中,其實只要兩個就夠用啦 jcommon-1.0.16.jar jfreechart-1.0.13.jar
佈置完成後先可以用個 JSP 來測試一下,在 JSP 中寫入 img 標籤
<img src='/vote/showJFreeChart' alt='投票統計'/> //vote為我的 WEB 專案的名稱
接著可以建置一個 Servlet 來動態產生圖形 showJFreeChart.java
以下來介紹一下最常見的圓餅圖:
此為它的官網,http://www.jfree.org/jfreechart/ 先將壓縮檔下載下來後解壓縮
我是下載 jfreechart-1.0.13 版的,解壓縮後在目錄下的 lib 目錄中的所有JAR複製到WEB專案
路徑下的 /WEB-INF/lib 中,其實只要兩個就夠用啦 jcommon-1.0.16.jar jfreechart-1.0.13.jar
佈置完成後先可以用個 JSP 來測試一下,在 JSP 中寫入 img 標籤
<img src='/vote/showJFreeChart' alt='投票統計'/> //vote為我的 WEB 專案的名稱
接著可以建置一個 Servlet 來動態產生圖形 showJFreeChart.java
以下來介紹一下最常見的圓餅圖:
2010年12月15日 星期三
2010年12月11日 星期六
Java 程式 - 螺旋矩陣
訂閱:
文章 (Atom)



