gpt4 book ai didi

java - 如何从 Java 中的不同类调用 Action

转载 作者:行者123 更新时间:2023-12-02 04:29:07 25 4
gpt4 key购买 nike

如何从 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
}
}

其他菜单项也是操作,正如您所看到的,我当前在 CloseTabButton 类中所做的事情非常令人沮丧,而且很可能是错误的编码方式。有没有更简单的方法来完成我正在做的事情?

最佳答案

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

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" ,这不是你比较的方式String在 Java 中,你应该使用类似 "Untitled".equals(fileName) 的东西

如果您的菜单基于实际Action s,那么您可以简单地禁用 Action他们自己。这需要一些工作,但比您现在所做的“猜测”工作要少得多。

基本上,您将监视 JTabbedPane本身,监视所选选项卡的更改并更新个人的状态 Action是他们自己

有多种方法可以做到这一点,例如传递 JTabbedPane 的引用到Action这样他们就可以执行自己的监控(但我会使用某种管理界面,它可以更轻松地向 Action 提供信息,并将代码与直接对 JTabbedPane 的依赖解耦,然后您可以自由地使用 JInternalFrame 代替)。

您可以有一个“菜单管理器”来完成类似的工作,监视文档容器的更改并更改菜单的状态 Action s 基于当前状态,作为示例

已更新

如果您正在使用 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对于关闭操作,然后对 JMenuItem 使用相同的操作和JTabbedPane .

“核心”问题是如何以统一的方式识别“当前”选项卡和文档

关于java - 如何从 Java 中的不同类调用 Action,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31736888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com