簡體   English   中英

如何在非組件類中使用JFileChooser.showOpenDialog()?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM