2010-03-17 119 views
1

我正面臨令人沮喪的問題。我有一個應用程序的滾輪不能在JDialog窗口中工作(但工作在JFrame中)。鼠標滾輪不在JDialog中滾動,但在JFrame中工作

下面的代碼:

import javax.swing.*; 
import java.awt.event.*; 

public class Failtest extends JFrame { 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Failtest();    
     } 
    }); 

} 

public Failtest() { 
    super(); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    setTitle("FRAME"); 
    JScrollPane sp1 = new JScrollPane(getNewList()); 
    add(sp1); 
    setSize(150, 150); 
     setVisible(true); 


    JDialog d = new JDialog(this, false);// NOT WORKING 
     //JDialog d = new JDialog((JFrame)null, false); // NOT WORKING 
     //JDialog d = new JDialog((JDialog)null, false);// WORKING - WHY? 

    d.setTitle("DIALOG"); 
     d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
    JScrollPane sp = new JScrollPane(getNewList()); 

    d.add(sp); 
    d.setSize(150, 150); 
    d.setVisible(true); 
} 

public JList getNewList() { 
    String objs[] = new String[30]; 
    for(int i=0; i<objs.length; i++) { 
    objs[i] = "Item "+i; 
} 
JList l = new JList(objs); 
    return l; 
} 
} 

我發現了一個解決方案,其存在作爲Java代碼的註釋 - 構造接收(的JDialog)null參數。

有人能夠啓發我嗎? 我認爲這是一個java錯誤。

測試在Windows XP-SP3與1 JDK和2周的JRE:

D:\Program Files\Java\jdk1.6.0_17\bin>javac -version 
javac 1.6.0_17 

D:\Program Files\Java\jdk1.6.0_17\bin>java -version 
java version "1.6.0_17" 
Java(TM) SE Runtime Environment (build 1.6.0_17-b04) 
Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing) 

D:\Program Files\Java\jdk1.6.0_17\bin>cd .. 

D:\Program Files\Java\jdk1.6.0_17>java -version 
java version "1.6.0_18" 
Java(TM) SE Runtime Environment (build 1.6.0_18-b07) 
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing) 

謝謝你在前進,

尤利安Şerbănoiu

PS:這個問題是不是新的 - 代碼從一個論壇(here),其中也提到了這個問題 - 但沒有解決它(但)

後編輯: 問題與JRE/jdk_1.6.0_10仍然存在,也1.6.0_16

稍後編輯2: 回到家裏,在Linux上測試(Ubuntu的 - 清醒/猞猁) - 都與OpenJDK的和Sun的Java從分配回購和它的作品(我使用Windows上編譯的.class文件)! - 所以我相信我正面臨着某些Windows配置上發生的JRE錯誤。

+0

請不要給我們提問2合1。 – 2010-03-17 22:50:28

+0

請您詳細說明一下嗎?我只是說這在某些配置(XP SP3我的情況)下不適用於JDialog,如果可能,我想知道一個解決方法。我現在知道,在某些配置(具有相同JRE的事件)上,它的工作原理是 – INS 2010-03-18 11:52:12

回答

0

你的java安裝有些奇怪:你的默認版本不是你向我們展示的1.6.0_17,而是更新的1.6.0_18。

無論如何,Windows XP上使用我的(只是一個年紀大一點的)1.6.0_16版,我無法重現您的問題,讓我覺得這可能是J A錯誤

+0

看看命令行。對於開發我使用JDK 1.6.0_17(其中也包含JRE具有相同的版本),但系統(當我移出bin目錄時)有一個更新的JRE(1.6.0_18) – INS 2010-03-17 09:55:18

+0

當然是的,但我個人傾向於爲了一致性,使用systelm默認使用的JDK進行開發。無論如何,我無法在JDK 1.6.0_16中重現您的行爲,這很奇怪。 – Riduidel 2010-03-17 10:16:20

+0

的確 - 我正在下載JDK 1.6.0_16並檢查結果。感謝提示 – INS 2010-03-17 10:24:08

1

它不是一個錯誤,使用時:

JDialog d = new JDialog(this, false); 
JDialog d = new JDialog((JFrame)null, false); 

要調用與Frame構造函數中的第一個參數

但使用

JDialog d = new JDialog((JDialog)null, false); 

您呼叫的時候構造函數與JDialog在第一個pa rameter

可能會令人困惑,因爲兩者都是null但即使如此,你應該指定你想要的構造函數。

UPDATE
您的評論後,我才意識到什麼問題:),即時通訊無法雖然重現。鼠標同時在對話框和框架中滾動。我在Snow Leopard上使用Java 1.6

+0

那麼爲什麼滾動僅在「(JDialog)null」情況下起作用?這是真正的問題。我實際上需要一個解釋 - 這個解決方案對我來說只是*一個黑客 – INS 2010-03-17 09:38:11

1

我一直無法重現這在我的系統上(Windows 7上的Java 6u18)。但是,我懷疑這是一個焦點問題,當您使用JDialog構造函數的JFrame版本時,滾動窗格未收到鼠標事件,但在使用JDialog版本時卻收到它們。

一些東西,你可以試一下:

  1. 您可以嘗試點擊對話框和/或對話框的滾動條上,看看鼠標的滾動功能影響你點擊它後滾動條。
  2. 您可以通過調用requestFocusInWindow()以編程方式請求滾動窗格的焦點。
  3. 如果requestFocusInWindow()失敗,請嘗試requestFocus()。 (requestFocus()由於其行爲的特定於平臺的變化而不鼓勵,但您似乎有一個特定於平臺的問題。)
  4. 您可以將FocusListener添加到您的滾動窗格以跟蹤它何時獲得並失去焦點,這應該可以幫助您確認這個問題是否與焦點有關。
  5. 您可以將MouseWheelListener添加到您的滾動窗格中,以查看滾動窗格是否正在接收每個MouseWheelEvent

就像我說過的,我無法在我的系統上重現這個問題,但是如果我正在解決像描述的那樣的問題,這些都是我會嘗試的。

1

我知道這不太可能是答案,但是您能否請我們招待我們並修正您的錯誤代碼,以便在EDT上創建框架(按照Sun的規範)?

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Failtest();    
     } 
    }); 
} 

直到你做完了,我不確定你可以排除任何事情。

我在JRE 1.6.0_20上使用Windows Vista的「適合我」。

+0

您是對的 - 這不是答案,但我根據您的建議修改了代碼。 +1。謝謝 – INS 2010-04-21 08:20:26