簡體   English   中英

如何從Java中的其他類調用Action

[英]How to call an Action from a different class in Java

我如何從Java中的另一個類調用Action? 我在線獲得了一個CloseTabButton類,允許每個JTabbedPane上有一個簡單的關閉標簽按鈕,但是當關閉標簽時,我想根據信息彈出一個對話框(如果文件沒有保存,請保存,等等) 。 這是文件:

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

class CloseTabButton extends JPanel implements ActionListener {
    private JTabbedPane pane;
    public CloseTabButton(JTabbedPane pane, int index) {
        this.pane = pane;
        setOpaque(false);

        // CloseIcon class just had a button with an x painted on it
        Icon closeIcon = new CloseIcon();
        JButton close = new JButton(closeIcon);

        close.setPreferredSize(new Dimension(closeIcon.getIconWidth(), closeIcon.getIconHeight()));
        close.addActionListener(this);

        add(new JLabel(pane.getTitleAt(index), pane.getIconAt(index), JLabel.LEFT));
        add(close);

        pane.setTabComponentAt(index, this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        int i = pane.indexOfTabComponent(this);

        String fileName = pane.getToolTipTextAt(i);

        // Where I want to ask if user wants to save, etc.
        if (fileName == "Untitled") {
            // Do stuff
        }

        pane.remove(i); // Removes the tab

        // If tab count < 1, then disable the save and save as buttons on menu
        if (pane.getTabCount() < 1) {
            JFrame frame = (JFrame) pane.getParent().getParent().getParent().getParent().getParent(); // Yes, there is that many in my code to get the parent JFrame

            int menuCount = frame.getJMenuBar().getMenuCount();

            for (int a = 0; a < menuCount; a++) {
                int itemCount = frame.getJMenuBar().getMenu(a).getItemCount();

                for (int b = 0; b < itemCount; b++) {
                    Component component = frame.getJMenuBar().getMenu(a).getMenuComponent(b);

                    if (!(component instanceof JSeparator)) {
                        // Not a seperator
                        String itemName = frame.getJMenuBar().getMenu(a).getItem(b).getAccessibleContext().getAccessibleName();
                        if (itemName == "Save As..") {
                            frame.getJMenuBar().getMenu(a).getItem(b).setEnabled(false);
                        }
                    }
                }
            }
        }
    }
}

在我的主要課程中,我有如下列出的行動:

static Action Close = new AbstractAction("Close") {
    public void actionPerformed(ActionEvent e) {
        closeCurrentWindow(); // function that will close tab
    }
}

其他菜單項也是Actions,正如您所看到的,我目前在CloseTabButton類中所做的事情非常令人沮喪,而且很可能是錯誤的編碼方式。 有沒有更簡單的方法來做我正在做的事情?

我可能做的第一件事就是為CloseTabButton提供ActionListener支持,例如......

public class CloseTabButton extends JPanel {

    private JTabbedPane pane;

    public CloseTabButton(JTabbedPane pane, int index) {
        this.pane = pane;
        setOpaque(false);

        // CloseIcon class just had a button with an x painted on it
        Icon closeIcon = new CloseIcon();
        JButton close = new JButton(closeIcon);

        close.setPreferredSize(new Dimension(closeIcon.getIconWidth(), closeIcon.getIconHeight()));
        close.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                fireActionPerformed();
            }

        });

        add(new JLabel(pane.getTitleAt(index), pane.getIconAt(index), JLabel.LEFT));
        add(close);

        pane.setTabComponentAt(index, this);
    }

    public void addActionListener(ActionListener listener) {
        listenerList.add(ActionListener.class, listener);
    }

    public void removeActionListener(ActionListener listener) {
        listenerList.remove(ActionListener.class, listener);
    }

    protected void fireActionPerformed() {
        ActionListener[] listeners = listenerList.getListeners(ActionListener.class);
        ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "You could provide you own action command for each tab here");
        for (ActionListener listener : listeners) {
            listener.actionPerformed(evt);
        }
    }

}

基本上,現在允許您將自己的ActionListener注冊到CloseTabButton

接下來,這個, fileName == "Untitled" ,不是你在Java中比較String的方式,你應該使用更像"Untitled".equals(fileName)

如果你的菜單是基於實際的Action ,那么你可以簡單地自己禁用Action 這需要一點點工作,但是現在你正在做的“猜測”工作要少得多。

基本上,您將監視JTabbedPane本身,監視所選選項卡的更改並更新各個Action的狀態

您可以通過多種方式執行此操作,例如將JTabbedPane的引用傳遞給Action以便它們可以執行自己的監視(但我會使用某種管理接口,可以更輕松地向Action提供信息和直接解耦代碼和對JTabbedPane的依賴,然后你可以自由地使用JInternalFrame代替)。

你可以有一個“菜單管理器”,它做了類似的工作,監視對文檔容器的更改,並根據當前狀態更改菜單Action的狀態,作為示例

更新

如果您正在使用Action API(我建議使用),那么您可以簡單地執行類似...

public class CloseTabButton extends JPanel {

    private JTabbedPane pane;

    public CloseTabButton(JTabbedPane pane, Action action, int index) {
        this.pane = pane;
        setOpaque(false);

        // CloseIcon class just had a button with an x painted on it
        Icon closeIcon = new CloseIcon();
        JButton close = new JButton(action);
        close.setIcon(closeIcon);
        close.setPreferredSize(new Dimension(closeIcon.getIconWidth(), closeIcon.getIconHeight()));

        add(new JLabel(pane.getTitleAt(index), pane.getIconAt(index), JLabel.LEFT));
        add(close);

        pane.setTabComponentAt(index, this);
    }

}

傳遞Action以進行關閉操作,然后對JMenuItemJTabbedPane使用相同的操作。

“核心”問題將是如何以統一的方式識別“當前”選項卡和文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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