iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 28
0
自我挑戰組

學習 Android Kotlin 隨筆系列 第 28

[ Day 28 ] Java 專案 - Java.Swing ViewGroup 的觸發事件問題

前言

前一篇談了一些 Java 的元件介紹,這篇會針對 mouse 的事件多加說明自己踩過的坑。

View Pager 父母管得多 這篇文章就有提到了,那時遇到的問題是對螢幕的 event 到底是觸發在子?還是父母?這問題不會影響程式的正確性,但是對使用者體驗來講是個很大的差異!

而這幾天在寫 Java 的元件時,也同樣遇到了這樣的問題,那麼下面就來看看到底如何解決的吧!

元件 (component)

我在一個 Scrollpane 裡面加入了一層 JPanel,這層 JPanel 裡面又有 JTable,當我的滑鼠滾動 (mouseWheel) 滾在這個 JTable 上面的時候,背景的 ScrollPane 不會滾動,但是碰在 JPanel 上面,又會正常執行,啊~~~好惱人啊!!

解法

首先,先拆解一張 JTable 的組成

上面的灰色的部分是 Header,下面是 data。宣告一個 JTable 出來之後,只會看到下面白色的 data 的部分,把這個 JTable 放入 ScrollPane 裡面,才會看到上面灰色的 title 部分。

接著,因為 JTable 並沒有滑鼠滑動的 event,所以我需要去新增一個 MouseWheelListener ,並且因為我想要的是後面的 ScrollPane 做滾動,所以我把這個滾動的訊息跟 ScrollPane 講,講說 “我現在碰在 JTable 身上,後面的 ScrollPane 要滾動了!”,程式碼如下

table.addMouseWheelListener(new MouseWheelListener() {
    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        CalculatorFrame.scroller.dispatchEvent(e);
    }
});

這一解法嘗試了好多次才找到 ...

這樣,就完成了 80% 了,當滑鼠在白色的 data 部分做滾動的時候,整個 ScrollPane 也會跟著滾動,但是放在灰色的 Header 部分時,仍然沒有反應,所以我就繼續的試 ... 才發現灰色部分的 event 是作用在包裝子 JTableScrollPane ,但是 ScrollPane 本身是有 MouseWheelListener ,所以我需要先把他給移除掉,再新增一個傳到背景 ScrollPane 的 listner,程式碼如下:

scrollPane.removeMouseWheelListener(scrollPane.getMouseWheelListeners()[0]);
scrollPane.addMouseWheelListener(new MouseWheelListener() {
    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        CalculatorFrame.scroller.dispatchEvent(e);
    }
});

上一篇
[ Day 27 ] Google Drive 自動化上傳資料庫檔案(小筆記)
下一篇
[ Day 29 ] Java 專案 - 整理 code 之怎麼還是不太乾淨!
系列文
學習 Android Kotlin 隨筆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言