JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 想請問有關JComboBox及JList的換頁問題
aptiva1128

燒起來了...



發文: 41
積分: 1
於 2004-01-08 22:51 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
標示"1"的元件是一個JomboBox...
標示"2"的元件是一個JList
標示"3"的元件是一個JTable...

我希望在"1"選擇一項後...
接著在"2"的地方顯示出該項所擁有的內容資料

接著在"2"再選擇一項...
又可以在"3"的地方顯示出該項所擁有的內容資料...

想請問這樣子該怎麼實作呢...?
感覺沒什麼頭緒....
只能說有點像超連結的感覺...
因為我也才剛學JAVA不久...所以如果問了很笨的問題..
煩請多見諒...非常謝謝....Blush


aptiva1128 edited on 2004-01-08 22:57
reply to postreply to post
作者 Re:想請問有關JComboBox及JList的換頁問題 [Re:aptiva1128]
TAHO

可愛吧∼∼

版主

發文: 271
積分: 7
於 2004-01-08 23:45 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
從 AWT/SWing 來入門 Java 不是一個好的入門方式

這牽涉到 Listener Event 機制

首先這需要在 1 跟 2 的元件上先註冊 Listener 型別的物件
當這些元件被點選時,他們會主動呼叫有向他們註冊的 Listener 物件
並送出一個 Event 當作引數

為了要產生有 Listener 型別的物件
你必須撰寫一個實作 Listener 的類別,並實作出該 Listener 規定要實作的 method
在那 method 中寫入你要再接收到 Event 之後要程式做出的反應

至於要實作哪一類的 Listener,就要看你想收到那一類的動作
查詢一下該類別的 Java API document 可以找到他們可以註冊哪一類的 Listener

如 JComboBox 你可以找到
addActionListener() , addItemListener() , addPopupMenuListener
以及他的父類別 JComponent 還有
addAncestorListener() , addPropertyChangeListener() , addVetoableChangeListener()
再上去的父類別 Container 還有
addContainerListener()
在上去的父類別 Component 還有
addComponentListener() , addFocusListener() , addHierarchyBoundsListener() ,
addHierachyListener() , addInputMethodListener() , addKeyListener() , addMouseListener() ,
addMouseMouseMotionListener() , addMouseWheelListener()

每一個 Listener 負責監聽不一樣的事件∼∼∼
好好研究一下吧∼∼∼


reply to postreply to post
作者 Re:想請問有關JComboBox及JList的換頁問題 [Re:TAHO]
TAHO

可愛吧∼∼

版主

發文: 271
積分: 7
於 2004-01-09 00:08 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
想想還是給你一個簡單範例好了

比如說我想監聽有人動了 JComboBox 物件時做出反應
所以我先做出一個實作 ActionListener 介面的類別
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MyActionListener implements java.awt.event.ActionListener {
 
    // 實作 ActionListener 介面  必須實作出這個 method
    public void actionPerformed(java.awt.event.ActionEvent actionEvent){
        Object obj = actionEvent.getSource();
        if ( obj instanceof javax.swing.JComboxBox)
        {
            javax.swing.JComboBox comboBox = (javax.swing.JComboBox) obj;
            int index = comboBox.getSelectedIndex();
            // 下面這一行    因為這邊沒寫其它元件  所以姑且用之
            System.out.println("第 " + index + " 個元件被選擇了。");
        }
    }
}


然後在那個 JComboBox 上註冊
1
2
3
4
javax.swing.JComboBox box = new javax.swing.JComboBox();
.......
.......
box.addActionListener(new MyActionListener());


當然,大多的程式實作上可能會用一些內部類別,匿名類別,或其它的技巧
不過概念就是這樣∼∼

看完之後『請回饋』您的想法


TAHO edited on 2004-01-09 00:10
reply to postreply to post
作者 Re:想請問有關JComboBox及JList的換頁問題 [Re:aptiva1128]
aptiva1128

燒起來了...



發文: 41
積分: 1
於 2004-01-09 01:29 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
真是不好意思...勞煩您這麼多...
也提供非常多的實作方法.....非常謝謝...

我的想法是:
1.會去針對每個元件使用actionlistener...再去實作裡面的方法...
(針對不同的元件作不同的行為)

ps:其實我一直有個問題,要實作這樣的動作...
其實可以使用action類別...或是像這種addactionlistener的方式...
歐萊禮JSwing進階篇裡常是混著用...因為因應不同程式用不同類型方法
來處理,都可以得到最佳效能...
那麼...實作上,比較常使用哪種方式呢?

action類別的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
         jm1 = new JMenu("主選單");   
         MenuAction1 AddSite = new MenuAction1("訂閱"); 
         JMenuItem item1 = new JMenuItem(); 
         item1 = jm1.add(AddSite);
         
         ..........................
 
         class MenuAction1 extends AbstractAction 
   {
       public MenuAction1(String text) 
     {
         super(text);
     }
 
       public void actionPerformed(ActionEvent e1) 
     {
         try 
       {   
          System.out.println("^^!");
        } catch (Exception ex) {;} 
     }
   }


需要內部類別(使用滑鼠adapter):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
         jb1.addMouseListener( new B1Mouse() );   
         
         ...............................
 
         class B1Mouse extends MouseAdapter
       {    
          public void mouseClicked(MouseEvent e)
         {              
              if(e.getSource() == jb1)
             { 
                dispose();
             }
         }     //inner class B1Mouse end
       }
 



1
使用匿名類別(是這樣說的嗎?) 如下:

1
2
3
4
5
6
7
8
         jb3.addActionListener(new ActionListener() 
      {
         public void actionPerformed(ActionEvent ev) 
        {
          NV.jm1.setEnabled(true);  
          dispose();
        }
      });  


2.應該說我主要是卡在...JList和JTable是使用MVC很明顯的例子...
JList有DefaultListModel類別和DefaultListSelectionModel...
當我選擇元件"1"時....因應元件中不同的選項...產生不同的元件"2"...
這時候我應該產生一個新的JList嗎?我在想...是不是作法上應該要產生一個
新的ListModel類別配合舊的ListSelectionModel。再去實作出一個新的JList
元件。(前提,大概要把舊的JList給砍掉,因為是在同一個地方出現,
我又沒在那邊使用JDeskPane()去實作layer)
而且我們還必須針對新產生出來的JList或JTable作addactionlistener的動作...
這個地方也是我很頭痛的地方...
必須設法在run time的時候去add...

JTable則有三個,JTable.JTableColumModel,JTableModel,
基本問題應該跟上面一樣...

比較想請教的是,除了這樣的想法,是否還有更好的作法呢?
我會馬上去實作我的想法的...

其實還有個問題:在JSplitpane()裡面是否也能實作出"layer"的概念?
我有一個JInternalFrame塞在JSplitpane裡面,因為裡面沒有JDeskPane()
所以只要一實作"最小化"的功能...就會發生很有趣的事....
跑出原來的Button.....而JInternalFrame塞不回去...^^.....
(JSplitPane兩邊只要沒裝東西...預設是兩個button...)

一樣我會趕緊實作看看的...

其實也不是我想拿Swing入門JAVA...
只是剛好因應課業需要....分組分到這一項...
硬著頭皮也得試試看.......XD......

不過對一個以前沒寫過什麼程式的人...
其實swing是一種很具體的東西........:p

除此之外...非常謝謝您的大力相助......


aptiva1128 edited on 2004-01-09 01:43
reply to postreply to post
作者 Re:想請問有關JComboBox及JList的換頁問題 [Re:aptiva1128]
TAHO

可愛吧∼∼

版主

發文: 271
積分: 7
於 2004-01-09 02:10 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
aptiva1128 wrote:
真是不好意思...勞煩您這麼多...
也提供非常多的實作方法.....非常謝謝...

我的想法是:
1.會去針對每個元件使用actionlistener...再去實作裡面的方法...
(針對不同的元件作不同的行為)

ps:其實我一直有個問題,要實作這樣的動作...
其實可以使用action類別...或是像這種addactionlistener的方式...
歐萊禮JSwing進階篇裡常是混著用...因為因應不同程式用不同類型方法
來處理,都可以得到最佳效能...
那麼...實作上,比較常使用哪種方式呢?


Listener 跟 Aciton 都可以用
通常會用 Listener 的原因是因為他是介面
直接用在主類別上 不會有多重繼承的問題
比如說
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MyFrame implements XXXListener{
 
    public MyFrame(){
        super("My Frame");
 
        .........// 產生一堆東西
          yyy.addXXXListener(this);
        .........// 其它
    }
 
    // 實作 XXXListener 的 method
    public void XXXListenerMethod(XXXEvent e){
        .......     // 實作內容
    }
 
    ...... // 其它 method
 
}


至於 Action 物件則是常用在很多地方有相同動作的例子
比如說,視窗上方的 MenuBar 有這個功能,Icon 也有這個功能,PopupMenu 也有同樣的功能
這時候只要用同一個 Action 物件放入這三個地方

另外,你舉的例子沒錯,他們各有這樣使用的原因選擇合適的就是了
內部類別通常是因為要用到外部類別的 method 或 field 的狀況
匿名類別則是只用一次,而且程式碼短的狀況

aptiva1128 wrote:
2.應該說我主要是卡在...JList和JTable是使用MVC很明顯的例子...
JList有DefaultListModel類別和DefaultListSelectionModel...
當我選擇元件"1"時....因應元件中不同的選項...產生不同的元件"2"...
這時候我應該產生一個新的JList嗎?我在想...是不是作法上應該要產生一個
新的ListModel類別配合舊的ListSelectionModel。再去實作出一個新的JList
元件。(前提,大概要把舊的JList給砍掉,因為是在同一個地方出現,
我又沒在那邊使用JDeskPane()去實作layer)
而且我們還必須針對新產生出來的JList或JTable作addactionlistener的動作...
這個地方也是我很頭痛的地方...

JTable則有三個,JTable.JTableColumModel,JTableModel,
基本問題應該跟上面一樣...

比較想請教的是,除了這樣的想法,是否還有更好的作法呢?
我會馬上去實作我的想法的...


實際上,JList 跟他的 ListModel 並沒有綁死
你不需要丟棄原來的 JList 物件,一樣能更新他的 ListModel
JTable 也一樣

new 物件是一件消耗資源的動作
在小程式中沒什麼感覺
但是養成習慣,在可能的範圍內儘量不要做多餘的 new 跟拋棄的動作
以後寫大程式時會有明顯的幫助的

aptiva1128 wrote:
其實還有個問題:在JSplitpane()裡面是否也能實作出"layer"的概念?
我有一個JInternalFrame塞在JSplitpane裡面,因為裡面沒有JDeskPane()
所以只要一實作"最小化"的功能...就會發生很有趣的事....
跑出原來的Button.....而JInternalFrame塞不回去...^^.....
(JSplitPane兩邊只要沒裝東西...預設是兩個button...)

一樣我會趕緊實作看看的...

其實也不是我想拿Swing入門JAVA...
只是剛好因應課業需要....分組分到這一項...
硬著頭皮也得試試看.......XD......

非常謝謝您的大力相助......


這個我不清楚 我不常用 Swing 的東西 只是有個概念而已
他的類別太多 每個類別的用法你得自己玩一玩 或查資料


reply to postreply to post
作者 Re:想請問有關JComboBox及JList的換頁問題 [Re:aptiva1128]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-01-09 10:54 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
aptiva1128 wrote:
2.應該說我主要是卡在...JList和JTable是使用MVC很明顯的例子...
JList有DefaultListModel類別和DefaultListSelectionModel...
當我選擇元件"1"時....因應元件中不同的選項...產生不同的元件"2"...
這時候我應該產生一個新的JList嗎?我在想...是不是作法上應該要產生一個
新的ListModel類別配合舊的ListSelectionModel。再去實作出一個新的JList
元件。(前提,大概要把舊的JList給砍掉,因為是在同一個地方出現,
我又沒在那邊使用JDeskPane()去實作layer)
而且我們還必須針對新產生出來的JList或JTable作addactionlistener的動作...
這個地方也是我很頭痛的地方...
必須設法在run time的時候去add...


JComboBox 選擇某一項之後要切換成不同的資料顯示在 JList 裡,你只需要更換 JList 的 model 不需要整個 JList 換掉。至於不同的 list item 被點選後會有不同的執行動作,你可以把執行動作本身附著在 item object 身上(可能 item 是一種 command object or action listener 之類的類別,toString method 傳回的字串可以顯示在 JList 外觀上),這樣你就可以為 JList 元件註冊一個簡單的 ListSelectionListener,當 user 停止拖曳滑鼠點選不同的 item,listener 只管把任務 delegate 給被點選的 item 來作。


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:想請問有關JComboBox及JList的換頁問題 [Re:aptiva1128]
aptiva1128

燒起來了...



發文: 41
積分: 1
於 2004-01-10 16:45 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
有時候...真的覺得發問才能真正審視自己了解的程度...
在提出問題的同時...自己也可以去整合一下不懂的地方....

倒是我的第一篇...現在回來看看...真是連思考都沒思考就發問..

很感謝您們熱心的回應...
也讓我有機會去更深入的思考自己真正不懂的地方...
一來一往間...讓我學習去剖析自己的問題...

======

真正去實作過後...
發現像JList.JComboBox.JTable這類元件......
它們本身分成那麼多種構成元件的好處所在:
可以將外觀和內容的操作行為分開,作更精確的動作...

我也一直去細細咀嚼前兩位更新ListModel的用法...
再將它應用到JTable...
其實觀念都很相似....瞭解後..應用起來會更得心應手...
非常謝謝兩位的解惑..

======

其實也還有些問題很神奇....
在JList元件中...
假設我想要只要按下某個item就去執行我要的動作...
在這個元件的判別中...一次會得到兩個index...
比如我選第五項....它內部得到的index是4和5....
也就是...按下去...已經作一個動作....放開滑鼠...會再做一個動作...
1
2
3
4
5
6
7
8
9
10
11
  list.addListSelectionListener(new ListSelectionListener()
{
     public void valueChanged(ListSelectionEvent se) 
   {
     if ((se.getValueIsAdjusting() == true) || (se.getFirstIndex() == -1))
     return; 
 
    int selected = list.getSelectedIndex();
    System.out.println((String)list.getModel().getElementAt(selected));
    }
});


我昨天搞了好久...才發現照書上的例子加入那一行...
才不會一次印出兩個item .....
問題:
1.不曉得除了這樣的作法...還有什麼更好的方法可以解決呢?

2.我是直接在JList元件上addListSelectionListener....
不過發現就算直接加在DefaultListSelection這個類別上也無妨...
(我的JList的constructor是用這種方式建的)
1
2
3
DefaultListSelectionModel dlsm = new DefaultListSelectionModel
           JList list = new JList(dlsm)
   

我想...大概差別在以後會不會更換ListSelectionModel吧...
不更換的話...其實倒是沒差....(是這樣的嗎?)

3.我發現...當我建完ListModel時....用ListModel來建JList元件...
對JList作 list.addListSelectionListener....
在我設法去更改ListModel之前....若是我有去選取過JList裡面的item.
造成滑鼠有索引留在JList上...
之後去更改ListModel....會造成錯誤...
(假設我用一個按鍵去更改ListModel...第一次按下去...
似乎會有listener event例外跳出.....
再按第二次之後...會使得索引不見...這時候才正常...)
不知道這樣的方式該如何解決呢?
我設法去更改最後的索引值為-1...不過似乎沒什麼效用...XD...

(縮略圖,點擊圖片鏈接看原圖)


reply to postreply to post
» JWorld@TW »  Java 新手區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8