●開啟新專案與Android Studio基本說明
1.專案名稱的第一個英文字母要大寫
2.選擇開發版本,通常用4開頭的測,ok在寫一個5的,因為怕用6很多手機不能用,wear=>穿戴裝置
3.android會有兩個檔案
layout=>網頁擴充:.xml
activity=>寫程式:.java
 
4.檔案管理:
程式檔=>java/第一個資料夾/MainActivity
介面檔=>java/res/layout/activity_main.xml
*Gradle Scripts函式庫連結檔
*values基本設定值
*drawable放圖片
 
5.設定 file=>settings
appearance,改變整個操作面板的字型=>override default fonts
 
改變程式碼編輯區的字型=>Editor=>Font=>要另存一個設定檔(Save As...)才能改字型和其他設定
android studio啟動後的執行程式是oncreate,就像java中的main程式
 
 
6.排版有分設計模式(Design)和文字模式(text)
 
7.使用的元件會出現在左下角的樹狀元件區
 
8. android studio啟動後的執行程式是onCreate,就像java中的main程式,要執行的內容都要放進去
@override,代表onCreate是繼承AppCompatActivity的onCreate的抽象類別然後把它override
 
9.不同的檔案管理方式切換方法
 
●實作
1.用LinearLayout拖曳進畫面,component tree產生一個LinearLayout,並加入一個button
 
2.切換到text模式,點到哪一項可以在右邊預覽看
 
3.寫法=>android:屬性名稱="值"
<Button
    android:id="@+id/button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="測試"
    android:textSize="20sp"
    android:textColor="#193283"/>
 
 
4.如果換顏色,可以先輸入顏色碼#000000,直接點左邊的色盤選顏色
 
5.android 手機開啟開發人員選項
=>點版本號碼直到出現你已成為開發人員,然後進到開發人員選項,啟動usb偵錯
*要安裝手機usb驅動程式
 
6.按鈕寬度設定=>fill_parent(全部填滿)
android:layout_width="fill_parent"
 
*android的一個xml(頁面)都有一個activity(專屬的程式檔案)
*android的全部元件一定都會先給ID=>位址序號,這些全部寫在一個檔案R.java
 R.java:記錄所有ID元件、drawable.... (用內部類別/static紀錄=>所以可以直接寫成R.id)
  =>所有的ID元件都記錄在class R下的class ID中,存在同一個檔案中,所以即使不同頁面,ID也不能重複
 
文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

● 接續昨日-java連資料庫
Connection=>連線"jdbc"
DriverManager=> 連線"jdbc"
PreparedStatement=>寫入資料庫
=>輸入資料時,是用 PreparedStatement寫入,然後再透過 Connection連接資料庫,經由 DriverManager把輸入的資料丟到資料庫裡,這就是串接
 
Statement=>搭配已讀取資料庫
ResultSet=>搭配已讀取資料庫
 
● 讓使用者輸入的資料可以送至資料庫
 private void okMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  int ID=Integer.parseInt(id.getText());
  int CHI=Integer.parseInt(chi.getText());
  int ENG=Integer.parseInt(eng.getText());
  String NAME=name.getText();
  String sql="insert into student(id,name,chi,eng) values(?,?,?,?)";
 
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  PreparedStatement ps=conn.prepareStatement(sql);
  ps.setInt(1, ID);
  ps.setString(2, NAME);
  ps.setInt(3, CHI);
  ps.setInt(4, ENG);
  ps.executeUpdate();
  System.out.print("ok");
 
  ps.close();
  conn.close();
  }catch(SQLException e){
  System.out.print("no");
  }
  }
**說明:
1.有些連線會寫在建構式,為了不要占用server資源,執行完就做斷線: ps.close(); conn.close();
2.url的說明
jdbc:mysql:=>確認是否有載入java msyql的驅動程式
//localhost:3306=>主機名稱:port
/school=>資料庫名稱
 
● 沒有輸入資料,空白送出,會出現Exception:數字無法格式化
  private void okMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  String sql="insert into student(id,name,chi,eng) values(?,?,?,?)";
 
  try{
  int ID=Integer.parseInt(id.getText());
  int CHI=Integer.parseInt(chi.getText());
  int ENG=Integer.parseInt(eng.getText());
  String NAME=name.getText();
  Connection conn=DriverManager.getConnection(url, user, password);
  PreparedStatement ps=conn.prepareStatement(sql);
  ps.setInt(1, ID);
  ps.setString(2, NAME);
  ps.setInt(3, CHI);
  ps.setInt(4, ENG);
  ps.executeUpdate();
  System.out.print("ok");
 
  ps.close();
  conn.close();
 
  }catch(SQLException e){
  msg.setText("編號不可重複");
  }catch(NumberFormatException e){
  msg.setText("資料不可為空白");
  }
  }
 
**說明:
1.要用catch去捕捉Exception
2.在介面上新增一個label位置(variable name),先不顯示文字
3.將錯誤訊息資料用setText()顯示到介面上
4.因為是在輸入時錯誤,所以getText()都要放到try裡面
5.因為 SQLException只檢查連線到資料庫是否成功和輸入的資料和資料庫設定的規則是否衝突,所以測試連線成功後,後面的catch捕捉到的一定是規則衝突,我們這邊只設定編號不能重複,所以內容可以改為 msg.setText("編號不可重複");
 
●抓資料
1.先做介面,一個顯示button (variable name:show) 和一個顯示文字區域(variable name:ans)
 
2.建立連線,和抓Exception,測試連線ok
  private void showMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  System.out.print("ok");
  }
  catch(SQLException e){
  }
  }
 
 
3.匯入Statement和ResultSet,透過Connection下的 createStatement()物件來和Statement連接,測試ok
  import java.sql.Statement;
  import java.sql.ResultSet; 
 
  private void showMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  String sql="select id,name,chi,eng from student";
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  Statement st=conn.createStatement();
  System.out.print("ok");
  }
  catch(SQLException e){
  }
**說明:
String sql="select id,name,chi,eng from student";
=> select 欄位名稱 from 資料表名稱(因為已經連上資料庫,所以可以省略資料庫名稱)
 
4.找資料和抓資料
  private void showMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  String sql="select id,name,chi,eng from student";
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  Statement st=conn.createStatement();
  ResultSet rs=st.executeQuery(sql);
  rs.next();
  System.out.println("編號:"+rs.getInt("id")+"\t名字:"+
  rs.getString("name")+"\t國文:"+rs.getInt("chi")+"\t英文:"+rs.getInt("eng"));
  System.out.print("ok");
  }
  catch(SQLException e){
  }
  }
**說明:
1.Statement中有一個executQuery(String sql),可以放入sql語法來找資料庫的資料,
但抓出來的資料類型為ResultSet,因為Statement沒有提供顯示的動作,所以要透過ResultSet 中的getxxxx方法來抓資料出來顯示,這樣一個傳給一個就是串接的概念
2. ResultSet 中的next()是用來判斷目前連線是否有資料,有資料會回true,才會跑下面get方法,如果沒有做這個動作就會有Exception
3.getInt(String columLable),代表()內要放欄位名稱且為字串 ex: rs.getInt("id")
4.先用System.out.println在主控台測試輸出一筆資料,目前只能一次輸出一筆資料
 
5.要一次能輸出全部資料
  private void showMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  String sql="select id,name,chi,eng from student";
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  Statement st=conn.createStatement();
  ResultSet rs=st.executeQuery(sql);
  while(rs.next()){
  System.out.println("編號:"+rs.getInt("id")+
  "\t名字:"+rs.getString("name")+
  "\t國文:"+rs.getInt("chi")+
  "\t英文:"+rs.getInt("eng"));
  }
  System.out.print("ok");
  }
  catch(SQLException e){
  }
  }
**說明:
第四步驟的做法每次都只能輸出同一筆資料,原因在於判斷哪一筆資料是由rs.next()在做,當此時這筆資料判斷有收到就會執行下一步驟,可是沒有再去判斷下一筆是否有資料,就會一直停留在第一筆,所以變成每執行一次println就要再run一次rs.next(),所以可以用while迴圈來解決這個問題
 
6.改為顯示到使用者介面
while(rs.next()){
  ans.setText("編號:"+rs.getInt("id")+
  "\t名字:"+rs.getString("name")+
  "\t國文:"+rs.getInt("chi")+
  "\t英文:"+rs.getInt("eng"));
  }
**說明:
如果直接這樣改,會只顯示最後一筆,因為每撈出一筆資料就會把上一筆資料給覆蓋過去
 
要做成
 
  import java.util.ArrayList;
 
  private void showMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  String sql="select id,name,chi,eng from student";
 
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  Statement st=conn.createStatement();
  ResultSet rs=st.executeQuery(sql);
  ArrayList<String> x=new ArrayList<String>();
  while(rs.next()){
  x.add("編號:"+rs.getInt("id")+
  "\t名字:"+rs.getString("name")+
  "\t國文:"+rs.getInt("chi")+
  "\t英文:"+rs.getInt("eng")+"\n");
  }
  ans.setText(x.toString());
  System.out.print("ok");
  rs.close();
  st.close();
  conn.close();
 
  }
  catch(SQLException e){
  }
  }
 
**說明:
為了避免被下一筆資料蓋過,改用collection的 ArrayList,把資料收集後全部放在x中,這時x是資料集合的物件,所以不能直接 用setText() 把內容顯示出來,要透過toString()把物件轉成字串                             
 
**另一種做法
  private void showMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  String sql="select id,name,chi,eng from student";
 
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  Statement st=conn.createStatement();
  ResultSet rs=st.executeQuery(sql);
  String s="";
 
  while(rs.next()){
  String a="編號:"+rs.getInt("id")+
  "\t名字:"+rs.getString("name")+
  "\t國文:"+rs.getInt("chi")+
  "\t英文:"+rs.getInt("eng")+"\n";
  s=s+a;
  }
  ans.setText(s);
  System.out.print("ok");
  rs.close();
  st.close();
  conn.close();
  }
  catch(SQLException e){
  }   
 
**說明:
1.先預設變數s為空值
2.把所有的欄位值丟到變數a(區域變數),再把a丟給s,用setText(s)輸出所有抓出來的資料
 
 
文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

因為上課的時間是去年十月底(真的拖了好久才來複習),

即將要迎接聖誕節,老師就給了一個應景的練習題

描繪這個可愛的聖誕老公公!

是老師手繪以後再用CorelDraw畫出來的~

(要是我有這等功力就好了...)

e88196e8aa95e88081e4babaok.jpg

一、首先要把要描繪的圖檔匯入至corelDRAW:

選擇檔案下面的匯入,把圖檔匯入

snap1.png

二、如果要描繪的圖案是彩色或有背景的,可以在檢視功能下選線框模式

snap2.png

就會變成如下圖灰白黑的圖案,比較好進行描繪...

snap31.png

因為這次要用手稿描繪,匯入手稿以後,先使用物件屬性中的透明度

讓圖片更透明(corelDRAW中,透明度數值越高,圖片越透明)

snap41.png

姑且暫定透明度為80

snap51.png

三、描繪之前要記得鎖定圖層,鎖定有三種方法

1.直接在物件管理員點該圖層的鉛筆圖案鎖定之

snap61.png

2.對物件按滑鼠右鍵,選擇鎖定物件功能

snap71.png

3.直接在物件功能列上選擇鎖定=>鎖定物件

snap81.png

四、開始用貝茲曲線描繪囉!

**記得在物件與物件間一定要有重疊處,所以繪製時可以多畫一些。

**無法確定要怎麼畫的時候,節點不要拉太遠。

(corelDraw中的曲線就是illustrator中的路徑)

snap91.png

 

如果想要參考用貝茲曲線畫出來的圖,

可以用google搜尋 vector illustration就可以看到很多美圖唷!!

 

文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

這裡有兩種做法,一種是將文字轉換成曲線,一種是打散文字做個別編輯!

(一)如果想把文字某個部份改變,某些部分不變,如下圖,

就可以用"文字轉換成曲線"的方法唷!

snap101.png

首先,輸入一串文字,並選定文字物件。

(注意,此時資訊列中它們還是段落文字)

snap19.png

一樣,選取功能列中的物件=>轉換成曲線

snap20.png

 

最後,點狀工具,就可以對文字做節點編輯,

此時資訊列上已經不再是段落文字,而是曲線了!

snap21-e1555031741433.png

(二)若是只是想改變個別文字的大小位置方向,其他文字不變,只要使用打散文字就好囉。

一樣,選功能列上的物件=>打散段落文字

snap23.png

就可以對個別文字做調整,但不需要點形狀工具喔,因為這些文字都還是文字而非曲線!

snap21-e1555031741433.png

 

文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

這次要複習的是,將物件轉換成曲線的做法!!

有時候想要畫一個不規則的形狀,像是下圖的水塘,

可是又不想用手繪工具來畫,

就可以利用轉換成曲線這個功能,把固定的形狀用形狀工具來調整!

Snap1

首先,選定要進行調整的物件!

(注意,在最下方的資訊列上,目前它是一個橢圓形)

snap15.png

接著,在功能列選物件=>轉換成曲線

snap16.png

 

這時請注意資訊列,這個淺藍色橢圓已經不再是橢圓形,而是曲線囉!

snap17.png

接著,點形狀工具,就可以對這個物件進行節點編輯,

做成自己想要的形狀囉!

snap18-e1555031357134.png

snap15.png

超級簡單又好用的功能喔!

 

文章標籤

muchone 發表在 痞客邦 留言(2) 人氣()

I prepared the English question paper for my son to review for his midterm exam yesterday.

Then, I found preparing the English question paper was actually interesting.

However, when I showed off the test paper to my son, he said "You thought you were good, but I thought you were annoying" .

 

*prepared  the question paper:出考卷

*midterm exam:期中考

*review for the exam:複習考試

 

文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

*JAVA與MYSQL實作
1.先建立新的資料庫=>new schema(產生新的資料庫名稱)
 
2.完成後會在左下角看的到資料庫名稱
 
3.新建table
 
4.設定欄位
PK(primary key):主索引
NN:必填欄位,不可空白
VARCHAR:字元,預設最大45個字元,可調
=>欄位大小寫沒有影響
 
5.設定完成後點左下角的table名稱可以看到欄位標題顯示
 
6.用netbeans建立專案school、student class、做介面
 
7.jDBC
java.SQL.*(和database有關的api都放在這)
Connection=>連線用
DriverManager=>連線用
PrepareStatement
*Connection是interface,不能new,要透過 DriverManager的getConnection把連線丟給 Connection
 
=>import三個class
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
 
8.連mysql的語法如下,但這樣寫完發現會出現exception,所以要加上try...catch
且import java.sql.SQLException;
private void okMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school"; 
  String user="root";
  String password="123456789";
 
  Connection conn=DriverManager.getConnection(url, user, password);
  }
 
 
加上try...catch來檢查資料庫連線是否成功,但還是失敗,因為需要匯入mySQL的驅動程式Connector J,不同程式語言要下載不同的驅動程式
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;  
 
  private void okMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  System.out.print("ok");
  }catch(SQLException e){
  System.out.print("no");
  }
 
  }     
 
匯入驅動程式jar檔
 
匯入後再測試OK,紅色訊息是資料庫的回應,不用管
 
9.建立資料,先設定一個sql語法的變數,insert into 資料表名稱(欄位名,欄位名,...) values(欄位內容,欄位內容,...),這邊?代表先不給之後再輸入,代表任意字元
 String sql="insert into student(id,name,chi,eng) values(?,?,?,?)";
 
10.傳資料給資料庫要用 PreparedStatement,透過connection把資料轉成同樣為 PreparedStatement 類型
新增資料時要用 PreparedStatement下的method(setInt(),setString()),第一個參數代表欄位的位置,第二個參數代表要輸入的內容
  private void okMouseClicked(java.awt.event.MouseEvent evt) {
  String url="jdbc:mysql://localhost:3306/school";
  String user="root";
  String password="123456789";
  String sql="insert into student(id,name,chi,eng) values(?,?,?,?)";
 
  try{
  Connection conn=DriverManager.getConnection(url, user, password);
  PreparedStatement ps=conn.prepareStatement(sql);
  ps.setInt(1, 1);
  ps.setString(2, "kelly");
  ps.setInt(3, 78);
  ps.setInt(4, 65);
 
  System.out.print("ok");
  }catch(SQLException e){
  System.out.print("no");
  }
  }  
 
11.輸入完成後去執行,按ok button在資料庫會查不到資料,因為還要加上 ps.executeUpdate();,把資料庫內容更新
,之後去資料庫看資料表內容,要記得重新整理,就可以看到輸入的資料
文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

Generics(泛型)&Collection(集合;收集)=>在java.util
 
●collection=>List-ArrayList( 和陣列一模一樣 )
                            -LinkedList
                  =>Set-HashSet(雜湊)
                           -sort(介面)-TreeSet
**說明
1.List是有順序的,有索引碼,先key先排,可重複資料
2.Set是亂數排序,不允許重複
3.collection、List、Set都是interface
4.sort提供順序
5.Treeset=>資料不允許重複,但有順序
 
(一)Generics(泛型)
1.不定類型
2.<T,E,....>
=>T,E=> 任意英文代號
3.限定使用"WRAPPER"類別與"class"
4.可以用在field、建構式、method
(當要讓使用者在新增時才決定類別時使用)
class Book<T>{
String bookname;
T bookprice;
 
Book(String bookname, T bookprice){
this.bookname=bookname;
this.bookprice=bookprice;
}
 
void show(){
System.out.println("書名:"+bookname+"\t價格:"+bookprice);
}
}
**說明:
1.如果使用者希望價格有時候可以輸入double有時候可以輸入int,改用泛型
2.new的時候由使用者自己定義類型
3.在class name後面寫<任意英文>,要使用泛型的地方都要放一樣的代號
 
class add1{
public static void main(String args[]){
Book<T> b1=new Book<T>("Java",380);
}
}
**說明:
1.如果在new的時候直接在class name後面加上<T>,會出現如上錯誤
2.代表java無法判斷如何新增內容,因為不知道380在這邊應該是甚麼類型,但詳細說明要重新編譯用javac -Xlint add1.java來看,詳細內容如下
3.所以將<T>改為<int>,設定使用者要用int,卻出現錯誤訊息如下,因為需要使用reference=>代表要用class,int是基本類別只能定義變數,要使用wrapper類別(ex:Double,Integer...)才能當作reference,因為wrapper類別既代表整數又有class身分
 
 
正確做法
class add1{
public static void main(String args[]){
Book<Integer> b1=new Book<Integer>("Java",380);
Book<Double> b2=new Book<Double>("android",650);
b1.show();
b2.show();
}
**說明:
但在這邊要注意,如果使用Double這個wrapper類別,輸入時就一定要使用浮點數,不然會出現錯誤訊息,不像基本類別的double可以接受整數
class add1{
public static void main(String args[]){
Book<Integer> b1=new Book<Integer>("Java",380);
Book<Double> b2=new Book<Double>("android",650.3);
b1.show();
b2.show();
}
}
 
多個不定類型時的用法
class Book<T,E>{
String bookname;
T bookprice;
E x;
 
Book(String bookname, T bookprice, E x){
this.bookname=bookname;
this.bookprice=bookprice;
this.x=x;
}
 
void show(){
System.out.println("書名:"+bookname+"\t價格:"+bookprice);
}
}
 
class add1{
public static void main(String args[]){
Book<Integer,Double> b1=new Book<Integer,Double>("Java",380,6.2);
Book<Double,Integer> b2=new Book<Double,Integer>("android",650.3,50);
}
}
 
另外,java7以後改成前面不寫,只寫後面也可以
class add1{
public static void main(String args[]){
Book b1=new Book<Integer,Double>("Java",380,6.2);
Book b2=new Book<Double,Integer>("android",650.3,50);
}
}
 
(二) Collection
1.解決"陣列"數量無法增加的問題
2.將"資料結構"應用寫成"API"應用
3.需搭配"泛型"為"reference"
4.語法:( 收集資料的方式/集合方式要先決定 )
集合方式<類型> 集合物件=new 集合方式<類型>();
=>集合物件指動態陣列
 
a) ArrayList
import java.util.ArrayList;
class add2{
public static void main(String args[]){
ArrayList<Integer> x=new ArrayList<Integer>();
x.add(110);
x.add(20);
x.add(30);
x.add(30);
 
for(Integer o:x){
System.out.println(o);
}
System.out.println("=============");
x.add(20);
x.add(650);
for(Integer o:x){
System.out.println(o);
}
}
}
**說明:
*注意:這邊x的類型是Integer而非 ArrayList, ArrayList是收集資料的方式
1.add()這個方法是從collection繼承給下面所有不同的收集方式,所以全部都可用add()來新增資料
新增資料的方式用add(E)=>看要使用的類型來決定輸入的類型,如上述就是Integer
2.輸入的資料無限制筆數且可重複
3. ArrayList 輸出時的排列方式為,先打進去的資料會排前面
4.ArrayList不能用.length會出現錯誤訊息,所以我們要一個個顯示資料可以用foreach的方式,如果要計算陣列個數則可以用迴圈和count++來做
5.可重複,所以有兩個30
6.可事後增加數量,所以第二次的輸出多兩個內容
7.如果要查記憶體位置,要用x.iterator();這個方法,結果如下:
 
LinkedList
import java.util.ArrayList;
import java.util.LinkedList;
class add2{
public static void main(String args[]){
LinkedList<Integer> x=new LinkedList<Integer>();
x.add(110);
x.add(20);
x.add(30);
x.add(30);
 
for(Integer o:x){
System.out.println(o);
}
System.out.println("=============");
x.add(20);
x.add(650);
for(Integer o:x){
System.out.println(o);
}
System.out.println(x.iterator());
}
}
**說明:
1.要先import class進來
2.輸出結果完全一樣,只有收集資料的方式不同
3. LinkedList和ArrayList差別在於,前者除了list還有一個Queue interface,用途是為了能解省記憶體,但因為java不太管效能,所以很少用
 
HashSet
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.HashSet;
class add2{
public static void main(String args[]){
HashSet<Integer> x=new HashSet<Integer>();
x.add(110);
x.add(20);
x.add(30);
x.add(30);
 
for(Integer o:x){
System.out.println(o);
}
System.out.println("=============");
x.add(20);
x.add(650);
for(Integer o:x){
System.out.println(o);
}
System.out.println(x.iterator());
}
}
**說明:
順序亂數排列,且不重複
 
TreeSet
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.HashSet;
import java.util.TreeSet;
class add2{
public static void main(String args[]){
TreeSet<Integer> x=new TreeSet<Integer>();
x.add(110);
x.add(20);
x.add(30);
x.add(30);
 
for(Integer o:x){
System.out.println(o);
}
System.out.println("=============");
x.add(20);
x.add(650);
for(Integer o:x){
System.out.println(o);
}
System.out.println(x.iterator());
}
}
**說明:
由小到大重新排列,且不重複
 
實作
這次要收集的資料類型是一整張表的資料,而非只有integer或double,所以資料類型變成student class(student類型的資料)
(一)ArrayList和 LinkedList
import java.util.ArrayList;
import java.util.LinkedList;
 
class student {  
private String name;
private int chi;
private int eng;
 
student(String name,int chi,int eng){
this.name=name;
this.chi=chi;
this.eng=eng;
}
 
void show(){
System.out.println("名字:"+name+"\t國文:"+chi+"\t英文:"+eng);
}
 
class add3{
public static void main(String args[]){
//ArrayList<student> s=new ArrayList<student>();
LinkedList<student> s=new LinkedList<student>();
 
s.add(new student("aa",85,77));
s.add(new student("aa1",85,77));
s.add(new student("aa2",86,78));
for (student o:s){
o.show();
}
}
}
 
**說明:
1.用 ArrayList和 LinkedList輸出結果相同
2. 在new的時候,這邊變成要新增一個學生物件 new student("aa",85,77) ,而非一個值
3. foreach的類型也要是student,因要和s同樣類型 因為把s指給o,所以o也是一個物件,可以直接用o.show()
 
(二)用HashSet,資料不重複
class add3{
public static void main(String args[]){
HashSet<student> s=new HashSet<student>();
s.add(new student("aa",85,77)); 
s.add(new student("aa1",87,97));
s.add(new student("aa2",83,67));
for (student o:s){
o.show();  
}
}
}
**說明:
1.用 HashSet亂數排序
2. 是否重複是看記憶體位置,只要有new就不會重複記憶體位置
 
(三)用HashSet,資料重複
class add3{
public static void main(String args[]){
HashSet<student> s=new HashSet<student>();
s.add(new student("aa",85,77)); 
s.add(new student("aa",85,77));
s.add(new student("aa",85,77));
 
for (student o:s){ 
o.show();  
}
}
}
**說明:
因為HashSet判斷是否重複是由記憶體位址來判斷,而非由輸入的值來判斷,所以還是會有三筆資料
 
(四)用TreeSet
class add3{
public static void main(String args[]){
TreeSet<student> s=new TreeSet<student>();
s.add(new student("aa",85,77)); 
s.add(new student("aa",85,77));
s.add(new student("aa",85,77));
 
for (student o:s){ 
o.show();
}
}
}
**說明:
1.改用TreeSet,可以compiler但是執行出現Exception
2.因為這邊是物件無法直接排序,要排序的話要由現有的欄位中抓一個欄位當作索引欄位(要告訴他要由哪個欄位來排順序)
 
 
正確做法:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.HashSet;
import java.util.TreeSet;
 
class student implements Comparable<student>{  
private String name;
private int chi;
private int eng;
 
student(String name,int chi,int eng){
this.name=name;
this.chi=chi;
this.eng=eng;
}
 
void show(){
System.out.println("名字:"+name+"\t國文:"+chi+"\t英文:"+eng);
}
public int compareTo(student o){
return this.chi-o.chi;
}
}
 
class add3{
public static void main(String args[]){
TreeSet<student> s=new TreeSet<student>();  
s.add(new student("aa",85,77));
s.add(new student("aa",85,77));
s.add(new student("aa",85,77));
  
for (student o:s){
o.show();
}
}
}
 
**說明:
1. 要繼承comparable interface(用implements),<>中要放要排序的類型物件,因為comparable是泛型
2.因為繼承interface的compareTo()方法,所以要override,故前面要加public和繼承的int,copareTo()裡面要放本身物件(student),和下一個物件(o)
3.return時,this是物件本身,o是指下一個物件,這邊要指定欄位用國文分數(chi),
4.語法:this-o,如果:>0由小到大排列,<0由大到小排列,=0不變
5.通常當主索引欄不會重複且可以判斷先後順序者,會用TreeSet來做
6. TreeSet排列是用指定的欄位值來判斷,這邊指定國文分數來判斷,此時三者相同,所以判斷重複,最後會輸出一筆
7.如果改為如下,就會輸出三筆並且照國文分數由小到大排列
s.add(new student("aa",86,77));
s.add(new student("aa",88,77));
s.add(new student("aa",85,77));
 
●泛型與多型應用
1.泛型
2.多型
=>陣列:數量無法增加;集合:可增加(又稱為動態陣列)
 
 
 
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.HashSet;
import java.util.TreeSet;
 
class student implements Comparable<student>{
private String name;
private int chi;
private int eng;
 
student(String name,int chi,int eng){
this.name=name;
this.chi=chi;
this.eng=eng;
}
 
void show(){
System.out.print("名字:"+name+"\t國文:"+chi+"\t英文:"+eng);
}
public int compareTo(student o){
 
return this.chi-o.chi;
}
}
 
class A extends student{
private int word;
A(String name,int chi, int eng ,int word){
super(name,chi,eng);
this.word=word;
}
void show(){
super.show();
System.out.println("\tword:"+word);
}
}
 
class B extends student{
private int excel;
B(String name,int chi, int eng ,int excel){
super(name,chi,eng);
this.excel=excel;
}
void show(){
super.show();
System.out.println("\texcel:"+excel);
}
}
 
class add3{
public static void main(String args[]){
ArrayList<student> s=new ArrayList<student>();  //定義父類別(的資料收集方法)
 
s.add(new A("aa",86,77,88));   //new子類別
s.add(new A("aa2",88,77,76));
s.add(new B("bb",85,77,87));
 
for (student o:s){
o.show();
}
System.out.println("=============");
s.add(new A("aa3",67,87,96));
s.add(new B("bb2",73,84,97));
 
for (student o:s){
o.show();
}
}
}
**說明:
1.在做輸入資料的介面時不可能鎖死資料筆數,所以要用集合不能用陣列
2.這邊只要A和student有繼承關係就能 s.add(new A("aa",86,77,88));
3. for (student o:s)=>forecach的reference還是看student,因為s的reference是student
4.和多型一樣,也是先定義父類別然後new子類別
5.做法和陣列完全一樣,只是改為集合,數量可以增加,陣列的作法為
  student s(定義父類別)={new A("aa3",67,87,96),new B("bb2",73,84,97)};(new子類別)
6.可以事後增加資料
7. 此時還沒有索引碼,所以還沒辦法直接用索引碼找資料
 
3.先用集合建立,再透過Object[]陣列=>集合toArray();  (不一定要做這個步驟)
=>轉回陣列=>製作索引碼
class add3{
public static void main(String args[]){
ArrayList<student> s=new ArrayList<student>();
 
s.add(new A("aa",86,77,88));
s.add(new A("aa2",88,77,76));
s.add(new B("bb",85,77,87));
 
Object[] x=s.toArray();
System.out.println(x[0]);  //輸出記憶體位址
//x[0].show(); //出現如下錯誤
((student)(x[0])).show();
}
}
 
**說明:
1.要把s集合的內容轉為x陣列
2.toArray()會轉成物件類型Obtect class(所有class的共同父類別)
3.如果直接用x[0].show()會找不到,因為編譯時會先去x找show()方法,但x是Object類型,會找不到
4.要把x[0]轉型為student類型(toArray一開始會先把類別拉到最上層(即所有class的父類別Object),所以要再降為目前的類型),把 x[0].show();改為((student)(x[0])).show();即可
 
文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

這次要來複習的是,一些常用的功能列的介紹。

首先是檢視的部分,老師上課最常叫我們用到的就是增強模式和線框模式。

增強模式如下圖:通常有色彩,一般狀況下使用,跟標準類似。

Snap1

線框模式如下圖:只看的到貝茲曲線,在做描繪圖片時很好用喔!

snap2-e1554946683358.jpg

還有最常用到的複製和貼上功能,
首先在功能列的編輯下面,選擇複製然後貼上,

會在同一位置COPY貼上,如下圖,

在圖層1多了一個紅色橢圓形,但位置完全沒有偏移,

另外一個做法是,直接選物件後按"+",就會在原地複製貼上囉!

snap3-e1489503520276.png

但繪圖時常常會需要同樣大小的物件,可是不想要重疊在同一位置,

這時候就可以選編輯下面的再製,

就會跳出如下圖的再製偏移選項視窗,設定要偏移的量。

snap4-e1554946918531.png

接著是最常使用的群組功能,

除了之前提過的可以直接選取要群組的所有物件以後按CTRL+G以外,

也可以使用功能列上的物件,選取群組功能下的群組物件!

snap14.png

還有一個很重要的就是物件管理員,

跟illustrator的圖層面板功能是一樣的。

1.主頁就是指所有頁面以外(工作區域以外)的區域,

所以在主頁畫了一個綠色的矩形,在所有頁面都可以看的到。

2.新增主圖層功能:即指在主頁新增一個圖層。

3.眼睛代表可不可以看的到、

鉛筆代表要不要鎖定圖層,印表機代表要不要列印該圖層。

snap13.png

接下來複習一些使用上的概念,

因為CorelDraw除了圖層之外還有頁面,

當我們想要移動畫面上物件的排列順序時,就要比較注意了!

假設要把紅色橢圓移到淺藍色橢圓前面,

應該要移到頁面的最前面還是圖層的最前面呢?

答案是:頁面的最前面,因為紅色橢圓在圖層一,淺藍色橢圓在圖層二

(要看右邊物件管理員)

如果是選移到圖層的最前面,就會跑到黃色橢圓和淺藍色橢圓的中間囉!

snap5-e1554946977536.png

另外還有一個就是工作區域內外的使用,個人覺得這真是非常貼心的設計呀!

在預設灰框內,進行編輯繪圖,這裡就是工作區域,

把物件從工作區域中拉到工作區域外,如STEP 1,會發生甚麼事情呢?

(注意目前工作的頁面是頁面1)

snap4-e1554946918531.png

snap6.png

snap10.png

來到頁面2看一下,ㄟ!紅色橢圓出現了!!本來頁面2是空白的!!

snap8.png

那如果把紅色橢圓拉到頁面2的工作區域呢?(如STEP 3)

snap9.png

再回到頁面1,發現紅色橢圓不見了,很方便耶!

這就像是一個桌面的概念,可以把東西放到工作區域外的桌面上,

有需要的頁面就可以拿去用囉!

snap10.png

 

 

文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()

上次複習了面板的使用,這次要複習一下快捷鍵和工具了!

同時學了coreldraw和iullstrator很容易把快捷鍵搞錯捏!

不過不得不說,coreldraw某些設計的真挺貼心的,使用上非常便利呀!!

常用快捷鍵:

1.ctrl+滑鼠滾輪:畫面左右移動

2.shift+滑鼠滾輪:畫面放大縮小

3.alt+滑鼠滾輪:畫面上下移動

4.繪製端正圖形(如:正圓、正方形)時,要按住ctrl鍵;

如果要從中心點開始畫則是按住shift鍵(跟illustartor不同喔!)

5.設定物件的填滿及外框顏色:選定物件後,在色盤上

--滑鼠左鍵,即可設定填滿顏色

--點滑鼠右鍵則設定外框顏色

6.ctrl+G:群組物件

7.空白鍵:切換正在使用的工具和選取工具

工具箱介紹

1.選取工具:

在物件上用滑鼠點一下,可以放大縮小物件;

(當改變物件大小時,直接用滑鼠拖曳不會改變比例唷!)

在物件上用滑鼠點兩下,可以旋轉物件。

snap4-e1554946084596.jpg

2.形狀工具:可以編輯形狀,如:可直接把矩形變成圓角矩形。

snap9.jpg

3.貝茲線繪圖:

點一下定義節點,再點一下自動連線

(若畫曲線按住左鍵不放可利用轉向把手和控制點調整弧度);

按ctrl就可以畫水平/垂直/45度角的線囉!

(貝茲畫出來的線不會因為放大縮小而影響解析度喔!

snap5.jpg

snap14.jpg

4.藝術媒體:即illustrator的筆刷。

snap6.jpg

5.文字工具:

可拉出矩形並在框內輸入文字,頭上下拉是調整行距、

箭頭左右拉是調整文字間距。

snap13.jpg

 

文章標籤

muchone 發表在 痞客邦 留言(0) 人氣()