保存 JTextPane,然后用 Java 打开它

Posted

技术标签:

【中文标题】保存 JTextPane,然后用 Java 打开它【英文标题】:Save JTextPane, and Open it Java 【发布时间】:2014-02-27 23:22:10 【问题描述】:

我正在尝试使用 JFileChooser 保存文件,但我似乎无法真正保存它。 我尝试了几种不同的方法,但我希望用户能够保存在所需的位置。 当我点击“保存”按钮时,它说它已保存。但是当我试图找到该文件时,它不存在。

public class GUI extends JFrame implements ActionListener, DocumentListener
JMenuItem aapne;
JMenuItem lagre;
JMenuItem sok;
JMenuItem farge;
JMenuItem oversett;
JTextPane tekstomraadet;
JTextPane dir;
String fratekst;
String tiltekst;
String tekst;



DefaultListModel listmodel = new DefaultListModel();
JList liste = new JList(listmodel);
public GUI()

    this.setSize(1000,500);
    this.setLayout(null);

    //Passord

    passord pass = new passord();
    pass.password = JOptionPane.showInputDialog(null, "Skriv inn et passord");
    while(!(pass.password.equals("words")))
        pass.password = JOptionPane.showInputDialog(null, "Skriv inn passordet på nytt");
    

    //Liste


    liste.setBounds(900,0,100,600);
    liste.setBackground(Color.pink);
    this.add(liste);

    liste.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    listmodel.addElement("Hvit");
    listmodel.addElement("Svart");



    //Tekst



    tekstomraadet = new JTextPane();
    dir = new JTextPane();
    tekstomraadet.setBounds(0, 0, 890, 600);
    tekstomraadet.setContentType("text/html");
    tekstomraadet.getDocument().addDocumentListener(this);
    this.add(tekstomraadet);

    //MENY

    JMenuBar menuBar = new JMenuBar();
    JMenu fil = new JMenu("Fil");

    aapne = new JMenuItem("Åpne");
    lagre = new JMenuItem("Lagre");
    sok = new JMenuItem("Søk");
    farge = new JMenuItem("Endre farge");
    oversett = new JMenuItem("Oversett");

    aapne.addActionListener(this);
    lagre.addActionListener(this);
    sok.addActionListener(this);
    farge.addActionListener(this);
    oversett.addActionListener(this);

    fil.add(aapne);
    fil.add(lagre);
    fil.add(sok);
    fil.add(farge);
    fil.add(oversett);

    menuBar.add(fil);

    this.setJMenuBar(menuBar);

    this.setVisible(true);


//OVERSETTING

public String oversett (String input)
    input = input.replace(" en ", " 1 ");
    input = input.replace(" to ", " 2 ");
    input = input.replace(" tre ", " 3 ");
    input = input.replace(" fire ", " 4 ");
    input = input.replace(" fem ", " 5 ");
    input = input.replace(" seks", " 6 ");
    input = input.replace(" syv ", " 7 ");
    input = input.replace(" åtte ", " 8 ");
    input = input.replace(" ni ", " 9 ");
    input = input.replace(" ti ", " 10 ");
    return input;



public String Ord (String Ordene, String teksten)
    teksten = teksten.replace(Ordene, "<font color=\"red\">"+Ordene+"</font>");
    return teksten;

public String Ord2 (String Ordene, String teksten)
    teksten = teksten.replace(Ordene, "<font color=\"WHITE\">"+Ordene+"</font>");
    return teksten;




@Override
public void actionPerformed(ActionEvent e) 
    // TODO Auto-generated method stub
    if(e.getSource().equals(farge))

        if(liste.getSelectedValue().equals("Hvit"))
            tekstomraadet.setBackground(Color.WHITE);
        
        else if(liste.getSelectedValue().equals("Svart"))
            tekstomraadet.setBackground(Color.BLACK);
            String ord = tekstomraadet.getText();
            String gammeltekst = tekstomraadet.getText();
            String nytekst = Ord2(ord, gammeltekst);
            tekstomraadet.setText(nytekst);

        
    

    else if (e.getSource().equals(lagre))

        JFileChooser filechooser = new JFileChooser();
        filechooser.setDialogTitle("Spesifiser en fil for lagring");
        int rVal = filechooser.showSaveDialog(GUI.this);
        if(rVal == JFileChooser.APPROVE_OPTION)
            File fileTosave = filechooser.getSelectedFile();
            System.out.println("Save as file: " +fileTosave.getAbsolutePath());
            try 
                FileOutputStream f = new FileOutputStream("hehe");
                ObjectOutputStream o = new ObjectOutputStream(f);
             catch (FileNotFoundException e1) 
                // TODO Auto-generated catch block
                e1.printStackTrace();
             catch (IOException e1) 
                // TODO Auto-generated catch block
                e1.printStackTrace();
            
        
    

    else if (e.getSource().equals(aapne))
        JFileChooser c = new JFileChooser();
        int rVal = c.showOpenDialog(GUI.this);
        if (rVal == JFileChooser.APPROVE_OPTION)
            tekstomraadet.setText(c.getSelectedFile().getName());

        

    

    else if (e.getSource().equals(oversett))

        fratekst = tekstomraadet.getText();
        tiltekst = this.oversett(fratekst);
        tekstomraadet.setText(tiltekst);



    
    else if( e.getSource().equals(sok))
        String ord = JOptionPane.showInputDialog(this, "Hvilket ord søker du etter?");
        String gammeltekst = tekstomraadet.getText();
        String nytekst = Ord(ord, gammeltekst);
        tekstomraadet.setText(nytekst);


    






@Override
public void changedUpdate(DocumentEvent arg0) 
    // TODO Auto-generated method stub



@Override
public void insertUpdate(DocumentEvent arg0) 
    // TODO Auto-generated method stub





@Override
public void removeUpdate(DocumentEvent arg0) 
    // TODO Auto-generated method stub



如果我使用固定保存,它可以工作。但这只是打开一个文件的大量工作。

【问题讨论】:

1) 不要使用nullLayout 屏幕应该在不同的分辨率下工作 2) 不要在***类中实现接口,使其在可能是内部类的新类中 3) 遵循 java 代码约定,方法以小写开头,类以大写开头,都遵循驼峰式风格 请简化代码并告诉我们您已经尝试过简单的调试技术。请查看常见问题解答的asking a good question 部分以获取提示。 对不起代码。这是我在这里的第一个问题,下次我会改进它! :) 并感谢 nachokk 的回答。 【参考方案1】:
FileOutputStream f = new FileOutputStream("hehe");
ObjectOutputStream o = new ObjectOutputStream(f);

您从不使用任何 OutputStreams 进行编写。您需要写入 OutputStream,然后刷新然后关闭它。我相信关闭它(应该在 finally 块中完成)通常会刷新 OutputStream。

FileOutputStream f = new FileOutputStream("hehe");
ObjectOutputStream o = null;

try 
   o = new ObjectOutputStream(f);
   while (objectsAreLeftToBeWritten) 
     // get next object and write with 
     // o.writeObject(nextObject);
   
 catch(....) 
  // .... etc
 finally 
  // if o is not null, close it

【讨论】:

或者使用try-with-resources,objectAreLeft是什么意思? @nachokk:他会遍历一些东西来写出所有的对象。当还有对象要写入时,获取下一个对象并写入流。

以上是关于保存 JTextPane,然后用 Java 打开它的主要内容,如果未能解决你的问题,请参考以下文章

Java - 如何获取 JTextPane 的默认字体大小

java JTextPane设置问题

如何使用 Java 代码查看 JTextPane 中的段落符号?

将 JTextPane 上标文本另存为 RTF

如何让 java jTextPane 接受拖动外部文件?

JTextPane - 内容在哪里?