2009-12-29 14 views
4

我有一個包含JMenuBar的Java GUI項目,我只是添加了一個JToolBar。在以前的版本中,事件是在擴展JMenuBar的同一類中實現的。我發現它跛腳並將事件移到擴展AbstractAction的另一個類中。我的目標是集中所有常見事件,以使它們對不同來源(JMenuBar,JToolBar等)作出反應。但是,我遇到了JFileChooser.showOpenDialog()方法的問題。此方法將對話框的父組件作爲參數。 如果我這樣做:如何在非組件類中使用JFileChooser.showOpenDialog()?

import java.awt.*; 
import java.awt.event.*; 
import java.io.File; 

import javax.swing.*; 
import javax.swing.event.*; 

public class ActionUsuels extends AbstractAction 
{ 

    private String nameAction; 

    /** Instance de MyFileChooser pour explorer les dossiers/fichiers*/ 
    private MyFileChooser fc; 

    /** Instance d'OpenSave qui contient les algorithmes d'ouverture/sauvegarde*/ 
    private OpenSave openSave; 

    ActionUsuels(String inName, String inPathIcon) 
    { 
     nameAction = inName; 
     putValue(Action.NAME, inName); 
     putValue(Action.SMALL_ICON, new ImageIcon(inPathIcon)); 
     putValue(Action.SHORT_DESCRIPTION, inName); 

     this.fc = new MyFileChooser(); 
     this.openSave = new OpenSave(Panneau.getUnivers()); 

    } 

    public void actionPerformed(ActionEvent e) 
    { 

     // Evénement nouveau projet 
     if(nameAction == "OPEN_PROJECT") 
     { 

      fc.ContMode(); 
      fc.refresh(); 

      int returnVal = fc.showOpenDialog(ActionUsuels.this); 

      if (returnVal == MyFileChooser.APPROVE_OPTION) 
      { 
       File file = fc.getSelectedFile(); 

        openSave.OpenCont(file); 
      } 

     } 
     static ActionUsuels actionInactive; 
} 

我得到以下錯誤:

的方法showOpenDialog(組件) 在JFileChooser的類型不 適用於參數 (ActionUsuels)。

我想這是正常的,因爲ActionUsuels沒有擴展任何JComponent類。但是我怎麼能立交呢?我正在嘗試做一個壞習慣嗎?我的意圖是寫一次事件,並能夠從任何組件調用它們。

只是爲了讓你明白我在做什麼,我有這樣的菜單類:

actions = new ActionUsuels[nameActions.length]; 

for(int i = 0; i < nameActions.length; i++) 
{ 
     actions[i] = new ActionUsuels(nameActions[i], pathIcons[i]); 
} 

file_menu.add(actions[0]); 

file_menu.addSeparator(); 

file_menu.add(actions[1]); 

每個項目相關聯的動作,圖標和適當事件的名稱!

有什麼想法?

謝謝!

回答

10

通常,傳遞給JDialogs的父類是應用程序的主要JFrame。除此之外,這允許將對話框集中在應用程序的窗口中。

希望您的操作類可以訪問主框架並且可以傳遞參考。實現此目的的一種方法可能是將主框架作爲參數傳遞給ActionUsuels構造函數。

如果不成功,null也是一個有效的父規範。鑑於null,對話框在屏幕上居中,但通常工作正常。

Bonne的機會! :)

+0

非常感謝你,它工作得很好:) – 2009-12-29 14:19:36

2

這是一個壞主意:

if(nameAction == "OPEN_PROJECT") 

您需要改用此:

if("OPEN_PROJECT".equals(nameAction)) 

的==操作符只檢查是否兩個引用是相等的,而不是是否而不是他們指向的字符串是相同的。這就是String的equals方法所要做的。這就是「淺」和「深」的區別。

你可以看到它在這裏的行動:

String x = new String("foo"); // don't write code like this; just an example 
String y = new String("foo"); // x and y are different reference values 
System.out.println(x == y); // prints "false" 
System.out.println(x.equals(y)); // prints "true" 
+0

我注意!但爲什麼 ? – 2009-12-29 17:17:57

+1

因爲==和equals對於字符串是不一樣的。你應該明白這個區別,以避免一個令人討厭的驚喜。 – duffymo 2009-12-29 17:26:52

+0

啊哈!說實話,我對Java真的很陌生。我過去做過C++和C#。反正好知道!我要去調查這個問題:) – 2009-12-29 17:32:54

相關問題