如何向JFileChooser添加右键单击上下文菜单,同时对外观和外观不可知。感觉?

时间:2015-12-23 16:09:54

标签: java contextmenu jfilechooser right-click

这是一个添加右键单击上下文菜单的示例,当您在JFileChooser窗口中右键单击某个项目时,它将选择它并显示右键单击上下文菜单,其中包含所选文件:

https://community.oracle.com/thread/1350166?start=0&tstart=0

import darrylbu.util.SwingUtils;
import java.awt.Container;
import java.awt.Point;
import java.awt.event.*;
import javax.swing.*;

public class FileChooserDeleteMenu {

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

      @Override
      public void run() {
        new FileChooserDeleteMenu().makeUI();
      }
    });
  }

  public void makeUI() {
    final JFileChooser chooser = new JFileChooser();
    final JList list = SwingUtils.getDescendantOfType(JList.class, chooser, "Enabled", true);
    JPopupMenu popup = list.getComponentPopupMenu();
    JMenuItem item = new JMenuItem("Delete");
    item.addActionListener(new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent e) {
        if (chooser.getSelectedFile() != null) {
          JOptionPane.showConfirmDialog(chooser,
                  "Delete " + chooser.getSelectedFile().getAbsolutePath() + "?",
                  "Confirm delete",
                  JOptionPane.YES_NO_OPTION,
                  JOptionPane.QUESTION_MESSAGE);
        }
      }
    });
    popup.add(item);

    final MouseListener listener = new MouseAdapter() {

      @Override
      public void mousePressed(MouseEvent e) {
        Point p = e.getPoint();
        if (e.getSource() == list) {
          list.setSelectedIndex(list.locationToIndex(p));
        } else {
          JTable table = (JTable) e.getSource();
          if (table.columnAtPoint(p) == 0) {
            int row = table.rowAtPoint(p);
            table.getSelectionModel().setSelectionInterval(row, row);
          }
        }
      }
    };
    list.addMouseListener(listener);

    final Container filePane = SwingUtilities.getAncestorOfClass(sun.swing.FilePane.class, list);

    filePane.addContainerListener(new ContainerAdapter() {

      @Override
      public void componentAdded(ContainerEvent e) {
        JTable table = SwingUtils.getDescendantOfType(JTable.class, chooser, "Enabled", true);
        if (table != null) {
          for (MouseListener l : table.getMouseListeners()) {
            if (l == listener) {
              return;
            }
          }
          table.addMouseListener(listener);
        }
      }
    });
    chooser.showOpenDialog(null);
    System.exit(0);
  }

如果我们稍后更改应用程序的外观,这段代码会中断吗?

如果这个实现依赖于L& F,我想知道是否有一种方法可以做到这一点,同时对应用程序选择的L& F不可知。

感谢。

0 个答案:

没有答案