Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Перетащите и Отбросьте и Передача данных
Высокоуровневое Отбрасывание
Домашняя страница > Создание GUI С JFC/Swing > Перетащите и Отбросьте и Передача данных

Высокоуровневое Отбрасывание

Вплоть до сих пор мы прежде всего сосредоточились на том, чтобы присоединять a TransferHandler к одному из JComponent подклассы. Но можно также установить a TransferHandler непосредственно на высокоуровневом контейнере, такой как JFrame и JDialog.

Это особенно полезно для приложений, которые импортируют файлы, такие как редакторы, IDE, отображают программы манипулирования, программы записи CD. Такое приложение обычно включает меню, панель инструментов, область для того, чтобы отредактировать документы, и вероятно список или механизм для того, чтобы переключиться между открытыми документами.

Нам записало такой пример Шенноновское Пятно, вывод команды Swing. Поскольку этот демонстрационный пример читает файлы, мы не обеспечиваем, Сеть Java Запускают версию — необходимо загрузить и скомпилировать демонстрационный пример самостоятельно.

Поскольку можно видеть в снимке экрана ниже, TopLevelTransferHandlerDemo имеет меню (пустой, за исключением подменю Demo), (нефункциональная) панель инструментов, область (слева), которая выводит на экран список открытых документов, и область (направо), которая выводит на экран контент каждого открытого документа. При запуске синяя область документа была присвоена обработчик передачи, который поддерживает импорт файла — так единственное место, которое может принять отбрасывание.

Снимок демонстрационного примера TopLevelTransferHandlerDemo.

Попробуйте это: 
  1. Скомпилируйте и работайте TopLevelTransferHandlerDemo пример, консультируйтесь, пример индексируют, если требуется загрузить файл zip, структурированный для NetBeans.
  2. Перетащите файл от своего собственного рабочего стола или файловой системы и отбросьте это на синей области документа направо. Файл открывается, и фрейм, заполненный его содержанием, появится. Область документа, a JDesktopPane, содержит обработчик передачи, который поддерживает импорт javaFileListFlavor.
  3. Перетащите другой файл и попытку отбросить это на области документа. Вы найдете, что невозможно отбросить это сверху фрейма, выводящего на экран последний файл. Также невозможно отбросить это в списке, меню, или панели инструментов. Единственное место, которое можно отбросить, является синей частью области документа или в строке меню ранее открытого фрейма. В каждом фрейме контента есть текстовый компонентный обработчик передачи, который не понимает отбрасывание файла — можно бросить текст в ту область, но не файл.
  4. Из меню выберите Демонстрационный пример-> Верхний уровень Использования TransferHandler, чтобы установить обработчик передачи на высокоуровневом контейнере — a JFrame.
  5. Попытайтесь перетащить по демонстрационному примеру снова. Число областей, которые принимают отбрасывания, увеличилось. Можно теперь отбросить наиболее где угодно на приложении включая строку меню, панель инструментов, панель title фрейма, за исключением списка (слева) или области контента ранее открытого файла. Ни один JList's, ни обработчики передачи текстовой области знают, как импортировать файлы.
  6. Отключите обработчики передачи на тех, которые остаются компонентами, выбирая Демонстрационный пример->, Удаляют TransferHandler из Списка и текст из меню.
  7. Перетащите по демонстрационному примеру снова. Можно теперь отбросить файл где угодно на приложении!
  8. Из меню выберите Демонстрационный пример-> Действие КОПИИ Использования.
  9. Перетащите по демонстрационному примеру снова. Отметьте, что курсор мыши теперь показывает курсор КОПИИ — это обеспечивает более точную обратную связь, потому что успешное отбрасывание не удаляет файл из источника. Цель может быть запрограммирована, чтобы выбрать из доступных действий отбрасывания как описано в Выборе Действия Отбрасывания.

Отметьте один нежелательный побочный эффект отключения обработчика передачи значения по умолчанию на текстовом компоненте: больше невозможно перетащить и отбросить (или сокращение/копия/вставка) текст в пределах области редактирования. Чтобы фиксировать это, Вы должны будете реализовать пользовательский обработчик передачи для текстового компонента, который принимает отбрасывания файла и также повторно реализует недостающую поддержку текстовых передач. Вы могли бы хотеть наблюдать RFE 4830695, который позволит добавлять импорт данных сверху существующего TransferHandler.

Вот исходный код для TopLevelTransferHandlerDemo.java:

/**
 * Demonstration of the top-level {@code TransferHandler}
 * support on {@code JFrame}.
 *
 * @author Shannon Hickey
 */
public class TopLevelTransferHandlerDemo extends JFrame {
    
    private static boolean DEMO = false;

    private JDesktopPane dp = new JDesktopPane();
    private DefaultListModel listModel = new DefaultListModel();
    private JList list = new JList(listModel);
    private static int left;
    private static int top;
    private JCheckBoxMenuItem copyItem;
    private JCheckBoxMenuItem nullItem;
    private JCheckBoxMenuItem thItem;

    private class Doc extends InternalFrameAdapter implements ActionListener {
        String name;
        JInternalFrame frame;
        TransferHandler th;
        JTextArea area;

        public Doc(File file) {
            this.name = file.getName();
            try {
                init(file.toURI().toURL());
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
        
        public Doc(String name) {
            this.name = name;
            init(getClass().getResource(name));
        }
        
        private void init(URL url) {
            frame = new JInternalFrame(name);
            frame.addInternalFrameListener(this);
            listModel.add(listModel.size(), this);

            area = new JTextArea();
            area.setMargin(new Insets(5, 5, 5, 5));

            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
                String in;
                while ((in = reader.readLine()) != null) {
                    area.append(in);
                    area.append("\n");
                }
                reader.close();
            } catch (Exception e) {
                e.printStackTrace();
                return;
            }

            th = area.getTransferHandler();
            area.setFont(new Font("monospaced", Font.PLAIN, 12));
            area.setCaretPosition(0);
            area.setDragEnabled(true);
            area.setDropMode(DropMode.INSERT);
            frame.getContentPane().add(new JScrollPane(area));
            dp.add(frame);
            frame.show();
            if (DEMO) {
                frame.setSize(300, 200);
            } else {
                frame.setSize(400, 300);
            }
            frame.setResizable(true);
            frame.setClosable(true);
            frame.setIconifiable(true);
            frame.setMaximizable(true);
            frame.setLocation(left, top);
            incr();
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    select();
                }
            });
            nullItem.addActionListener(this);
            setNullTH();
        }

        public void internalFrameClosing(InternalFrameEvent event) {
            listModel.removeElement(this);
            nullItem.removeActionListener(this);
        }

        public void internalFrameOpened(InternalFrameEvent event) {
            int index = listModel.indexOf(this);
            list.getSelectionModel().setSelectionInterval(index, index);
        }

        public void internalFrameActivated(InternalFrameEvent event) {
            int index = listModel.indexOf(this);
            list.getSelectionModel().setSelectionInterval(index, index);
        }

        public String toString() {
            return name;
        }
        
        public void select() {
            try {
                frame.toFront();
                frame.setSelected(true);
            } catch (java.beans.PropertyVetoException e) {}
        }
        
        public void actionPerformed(ActionEvent ae) {
            setNullTH();
        }
        
        public void setNullTH() {
            if (nullItem.isSelected()) {
                area.setTransferHandler(null);
            } else {
                area.setTransferHandler(th);
            }
        }
    }

    private TransferHandler handler = new TransferHandler() {
        public boolean canImport(TransferHandler.TransferSupport support) {
            if (!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                return false;
            }

            if (copyItem.isSelected()) {
                boolean copySupported = (COPY & support.getSourceDropActions()) == COPY;

                if (!copySupported) {
                    return false;
                }

                support.setDropAction(COPY);
            }

            return true;
        }

        public boolean importData(TransferHandler.TransferSupport support) {
            if (!canImport(support)) {
                return false;
            }
            
            Transferable t = support.getTransferable();

            try {
                java.util.List<File> l =
                    (java.util.List<File>)t.getTransferData(DataFlavor.javaFileListFlavor);

                for (File f : l) {
                    new Doc(f);
                }
            } catch (UnsupportedFlavorException e) {
                return false;
            } catch (IOException e) {
                return false;
            }

            return true;
        }
    };

    private static void incr() {
        left += 30;
        top += 30;
        if (top == 150) {
            top = 0;
        }
    }

    public TopLevelTransferHandlerDemo() {
        super("TopLevelTransferHandlerDemo");
        setJMenuBar(createDummyMenuBar());
        getContentPane().add(createDummyToolBar(), BorderLayout.NORTH);

        JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, list, dp);
        sp.setDividerLocation(120);
        getContentPane().add(sp);
        //new Doc("sample.txt");
        //new Doc("sample.txt");
        //new Doc("sample.txt");

        list.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        list.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
                if (e.getValueIsAdjusting()) {
                    return;
                }
                
                Doc val = (Doc)list.getSelectedValue();
                if (val != null) {
                    val.select();
                }
             }
        });
        
        final TransferHandler th = list.getTransferHandler();

        nullItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                if (nullItem.isSelected()) {
                    list.setTransferHandler(null);
                } else {
                    list.setTransferHandler(th);
                }
            }
        });
        thItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                if (thItem.isSelected()) {
                    setTransferHandler(handler);
                } else {
                    setTransferHandler(null);
                }
            }
        });
        dp.setTransferHandler(handler);
    }

    private static void createAndShowGUI(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
        }

        TopLevelTransferHandlerDemo test = new TopLevelTransferHandlerDemo();
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        if (DEMO) {
            test.setSize(493, 307);
        } else {
            test.setSize(800, 600);
        }
        test.setLocationRelativeTo(null);
        test.setVisible(true);
        test.list.requestFocus();
    }
    
    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                //Turn off metal's use of bold fonts
                UIManager.put("swing.boldMetal", Boolean.FALSE);
                createAndShowGUI(args);
            }
        });
    }
    
    private JToolBar createDummyToolBar() {
        JToolBar tb = new JToolBar();
        JButton b;
        b = new JButton("New");
        b.setRequestFocusEnabled(false);
        tb.add(b);
        b = new JButton("Open");
        b.setRequestFocusEnabled(false);
        tb.add(b);
        b = new JButton("Save");
        b.setRequestFocusEnabled(false);
        tb.add(b);
        b = new JButton("Print");
        b.setRequestFocusEnabled(false);
        tb.add(b);
        b = new JButton("Preview");
        b.setRequestFocusEnabled(false);
        tb.add(b);
        tb.setFloatable(false);
        return tb;
    }
    
    private JMenuBar createDummyMenuBar() {
        JMenuBar mb = new JMenuBar();
        mb.add(createDummyMenu("File"));
        mb.add(createDummyMenu("Edit"));
        mb.add(createDummyMenu("Search"));
        mb.add(createDummyMenu("View"));
        mb.add(createDummyMenu("Tools"));
        mb.add(createDummyMenu("Help"));
        
        JMenu demo = new JMenu("Demo");
        demo.setMnemonic(KeyEvent.VK_D);
        mb.add(demo);

        thItem = new JCheckBoxMenuItem("Use Top-Level TransferHandler");
        thItem.setMnemonic(KeyEvent.VK_T);
        demo.add(thItem);

        nullItem = new JCheckBoxMenuItem("Remove TransferHandler from List and Text");
        nullItem.setMnemonic(KeyEvent.VK_R);
        demo.add(nullItem);

        copyItem = new JCheckBoxMenuItem("Use COPY Action");
        copyItem.setMnemonic(KeyEvent.VK_C);
        demo.add(copyItem);

        return mb;
    }
    
    private JMenu createDummyMenu(String str) {
        JMenu menu = new JMenu(str);
        JMenuItem item = new JMenuItem("[Empty]");
        item.setEnabled(false);
        menu.add(item);
        return menu;
    }
}

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Рендеринг Расположения Отбрасывания
Следующая страница: Добавление Сокращения, Копии и Вставки (CCP)