2015-07-31 2 views
3

Как я могу вызвать действие из другого класса в Java? Я получил класс CloseTabButton в Интернете, который позволяет простую кнопку закрытия вкладок на каждом JTabbedPane, но когда вкладка закрыта, мне хотелось бы, чтобы диалог всплывал на основе информации (если файл не сохранен, попросите его сохранить и т. Д.), , Это файл:Как вызвать действие из другого класса в Java

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 довольно сложно, и, скорее всего, это неправильный способ его кодирования. Есть ли гораздо более простой способ сделать то, что я делаю?

ответ

0

Первое, что я мог бы сделать, это обеспечить поддержку 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 s на Java, вы должны использовать что-то более похожее "Untitled".equals(fileName)

Если вы меню основаны на фактических Action s, тогда вы можете просто отключить сами Action. Это потребует немного работы, но гораздо меньше «угадывания» работы, чем вы сейчас делаете.

В принципе, вы будете контролировать JTabbedPane себя, мониторинг изменений в выбранной вкладку и обновлении состояния отдельного Action S себя

Там несколько способов, вы можете сделать это, как передать ссылку из JTabbedPane до Action s, поэтому они могут выполнять собственный мониторинг (но я бы использовал какой-то интерфейс управления, который мог бы легче предоставить информацию для Action s и отделить код и зависимость от 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 для тесной операции, затем используйте одно и то же действие как для JMenuItem, так и для JTabbedPane.

«Ядро» вопрос будет, как вы бы определить «текущую вкладку» и документ единообразно

+0

Даже если Theres способ «триггер» команда меню, как если MENUITEM была нажата. Я стараюсь не слишком сильно менять свой код ха-ха. – Vince

+0

Извините, я не понимаю – MadProgrammer

+0

Я могу получить доступ к JMenuBar.Но тогда может быть способ вызвать событие щелчка меню, например ... frame.getJMenuBar.getMenu (a) .getItem (b) .click(); (Я знаю, что в Java это неверно, но в Javascript это можно сделать xD) – Vince