![](/img/trans.png)
[英]How to use JFileChooser.showOpenDialog to open a specific file?
[英]How to use JFileChooser.showOpenDialog() in a non component class?
我有一個包含JMenuBar的Java GUI項目,我剛剛添加了一個JToolBar。 在以前的版本中,事件是在擴展JMenuBar的同一個類中實現的。 我發現它很蹩腳,並將事件移動到另一個擴展AbstractAction的類中。 我的目標是集中所有常見事件,使他們對不同的來源做出反應(JMenuBar,JToolBar等)。 但是,我遇到了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;
}
我收到以下錯誤:
JFileChooser類型中的showOpenDialog(component)方法不適用於參數(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]);
每個項目都與動作的名稱,圖標和合適的事件相關聯!
任何想法 ?
謝謝 !
通常,傳遞給JDialogs的父類是應用程序的主JFrame。 除此之外,這允許對話框在應用程序窗口的中心。
希望您的動作類可以訪問主框架並可以傳遞對它的引用。 實現此目的的一種方法可能是將主框架作為參數傳遞給ActionUsuels
構造函數。
如果不這樣做, null
也是一個有效的父規范。 如果為null
,則對話框在屏幕上居中,但無論如何通常都可以正常工作。
Bonne的機會! :)
這是一個壞主意:
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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.