1

发生拖放事件时,我不知道如何更改框架的标题。我已经阅读了有关 DnD 和 Transferable 的 Java 文档,但我找不到解决方案,我得出的结论是我必须使用 DropTargetListener 玩游戏,但我陷入了僵局。任何答案都会让人松一口气!(同样在拖放中我想保留文本的属性)

SSCCE是:

package sscceeditor;
import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.text.BadLocationException;
import rtf.AdvancedRTFDocument;
import rtf.AdvancedRTFEditorKit;

class ExampleFrame extends JFrame{
    private JMenuBar bar = new JMenuBar();
    private JMenu fileMenu = new JMenu("File");
    private JMenuItem saveItem = new JMenuItem("Save");
    private JMenuItem loadItem = new JMenuItem("Load");
    private JTextPane txtPane = new JTextPane(new AdvancedRTFDocument());
    private JScrollPane scroller = new JScrollPane(txtPane);
    private JFileChooser chooser = new JFileChooser();
    private AdvancedRTFEditorKit rtfKit = new AdvancedRTFEditorKit();


    //ctor begins...
    public ExampleFrame(){
        super("Example Editor");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(500, 400);
        this.setLocationRelativeTo(null);

        saveItem.addActionListener(new SaveHandler());
        loadItem.addActionListener(new LoadHandler());
        this.addDragAndDropSupportToJTextPane(txtPane);

        //set the kit...
        txtPane.setEditorKit(rtfKit);


        //create the menu...
        fileMenu.add(saveItem);
        fileMenu.add(loadItem);
        bar.add(fileMenu);
        this.setJMenuBar(bar);

        //create the main panel...
        JPanel mainPane = new JPanel();
        mainPane.setLayout(new BorderLayout());
        mainPane.add(BorderLayout.CENTER , scroller);

        this.setContentPane(mainPane);

    }//end of ctor.

    //inner event handler classes...
    class SaveHandler implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            int response = chooser.showSaveDialog(ExampleFrame.this);

            if(response == JFileChooser.APPROVE_OPTION){

                try(BufferedWriter bw = new BufferedWriter(
                        new FileWriter(chooser.getSelectedFile().getPath())))
                {

                    rtfKit.write(bw, txtPane.getDocument(), 0, txtPane.getDocument().getLength());

                    bw.close();

                    JOptionPane.showMessageDialog( ExampleFrame.this,"Saved");

                    txtPane.setText("");
                }catch(IOException | BadLocationException  ex){
                    System.err.println(ex);
                }


            }
        }//end of method.

    }

    class LoadHandler implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            int response = chooser.showOpenDialog(ExampleFrame.this);

            if(response == JFileChooser.APPROVE_OPTION){

                StringBuilder sb = new StringBuilder();

                try(BufferedReader bw = new BufferedReader(
                        new FileReader(chooser.getSelectedFile().getPath())))
                {

                    txtPane.setText("");
                    rtfKit.read(bw, txtPane.getDocument(), 0);
                    bw.close();
                }catch(IOException | BadLocationException ex){
                    System.err.println(ex);
                }


            }
        }//end of method.

    }


    private void addDragAndDropSupportToJTextPane(JTextPane thePane){

        thePane.setDragEnabled(true);


        thePane.setDropMode(DropMode.INSERT);

    }//end of method.


}//end of class ExampleFrame.


public class SSCCEeditor {

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

            @Override
            public void run() {
                new ExampleFrame().setVisible(true);
            }

        });
    }
}

非常感谢您的时间!

4

0 回答 0