顯示具有 Java 標籤的文章。 顯示所有文章
顯示具有 Java 標籤的文章。 顯示所有文章

2014年6月24日 星期二

【Java】圖像裁切

呼叫 ImageExpert 的 cropImage method 傳入圖片的所在路徑,以及要裁切位置的 x 與 y 軸,和要裁切的長度與高度

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月21日 星期六

設計模式 - Decorator

介紹一下 Decorator (裝飾者模式)


  • 在不改變一個物件本身的功能的基礎上,動態地給一個物件增加額外的職責(是物件不是整個類別),替代繼承的方式之一。其行為模式如下圖所例:












2011年12月6日 星期二

設計模式 - Builder

關於 Design Pattern 的 Builder(生成器)模式,有以下幾個特點

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 的環境下

以下是簡單的範例程式

    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 且內涵表格

也順帶說明如何解決中文文字的問題

//設定 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 請求的作法

//.....
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 來介紹

//.....
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

2011年5月17日 星期二

【Java】Object 的 clone 運用

Java 中  java.lang.Object 複製(Clone),提供了複製一個物件的新做法

通常在複製物件的時候,大多數直覺都是直接把一個物件 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

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
           }
}

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());

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 的物件


2011年1月29日 星期六

【Java Web】DAO 簡介

DAO 主要是讓處理及操作資料庫更為方便,用來封裝資料庫持久層的操作

即可將很多複雜的資料操作語法和業務邏輯分開

探討其思想其實也是一種 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

以下來介紹一下最常見的圓餅圖:

2010年12月15日 星期三

2010年12月11日 星期六

Java 程式 - 螺旋矩陣

問題描述 :
螺旋矩陣是一個短陣,其中每個cell都填滿整數,且每個整數以螺旋的方式排列。

下圖為二個size = 8的螺旋矩陣。圖(a),數字由1開始,以逆時鐘的方向,螺旋狀地往中心排列。

而圖(b)則是一個順時鐘的螺旋矩陣,和圖(a)不一樣之處在於其數字的旋轉方向為順時鐘旋轉。


輸入說明:

輸入為一行字串,包含了兩個數值,每個數值以逗點隔開。
第一個數值為size,其值介於1到30間(i.e., 1 <= size <= 30)。
第二個數值為方向,1為順時鐘方向,2為逆時鐘方向。