Сохранение txt файла с стилем и размером текста в Java
В JTextArea можно указать цвет шрифта, стиль, размер. Если сохранить txt файл, указав размер и стиль и открыв файл после перезапуска программы, то все будет как обычно. Как сделать так что-бы при открытии файла ставился тот-же стиль, размер и шрифт который указывался при сохранении? Спасибо.
Код сохранения файла как:
BufferedWriter bwriter;
JFileChooser savefile = new JFileChooser();
int saveas = savefile.showSaveDialog(null);
if (saveas == JFileChooser.APPROVE_OPTION) {
try {
bwriter = new BufferedWriter(new FileWriter(savefile.getSelectedFile()));
jta.write(bwriter);
bwriter.close();
open2(savefile.getSelectedFile());
JOptionPane.showMessageDialog(null, "File saved.");
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "The file cannot be saved");
}
}
Код сохранения файла:
if (openedfile == null) {
BufferedWriter bwriter;
String nameoffile = JOptionPane.showInputDialog("Write name for this file. Example:filename.txt");
savefile.setSelectedFile(new File(nameoffile));
int save = savefile.showSaveDialog(null);
if (save == JFileChooser.APPROVE_OPTION) {
try {
bwriter = new BufferedWriter(new FileWriter(savefile.getSelectedFile()));
jta.write(bwriter);
bwriter.close();
open2(savefile.getSelectedFile());
JOptionPane.showMessageDialog(null, "File saved.");
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "The file cannot be saved");
}
}
} else if (openedfile != null) {
try {
BufferedWriter bwriter = new BufferedWriter(new FileWriter(openedfile));
jta.write(bwriter);
bwriter.close();
needsave = false;
JOptionPane.showMessageDialog(null, "File saved.");
filename = openedfile;
win.setTitle("Saved -" + filename + "- SimpleTextMaster 0.8(Beta)");
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "The file cannot be saved");
}
}
Код открытия:
if (needsave == true) {
int input = JOptionPane.showConfirmDialog(null, "Do you want to save the current file?\"");
if (input == 0) {
BufferedWriter bwriter;
String nameoffile = JOptionPane.showInputDialog("Write name for this file. Example:filename.txt");
JFileChooser savefile = new JFileChooser();
savefile.setSelectedFile(new File(nameoffile));
int save = savefile.showSaveDialog(null);
if (save == JFileChooser.APPROVE_OPTION) {
try {
bwriter = new BufferedWriter(new FileWriter(savefile.getSelectedFile()));
jta.write(bwriter);
bwriter.close();
needsave = false;
JOptionPane.showMessageDialog(null, "File saved.");
JFileChooser openfile = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("Txt file", "txt");
openfile.setFileFilter(filter);
int open = openfile.showDialog(null, "Open file");
if (open == JFileChooser.APPROVE_OPTION) {
try {
filename = openfile.getSelectedFile();
openedfile = openfile.getSelectedFile();
BufferedReader br = new BufferedReader(new FileReader(openfile.getSelectedFile()));
String ln;
jta.setText(null);
while ((ln = br.readLine()) != null) {
jta.append(ln + "\n");
}
br.close();
win.setTitle(filename + " - SimpleTextMaster 0.8(Beta)");
needsave = false;
JOptionPane.showMessageDialog(null, "File opened.");
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "The file cannot be opened");
}
}
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "The file cannot be saved");
}
}
} else if (input == 1) {
JFileChooser openfile = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("Txt file", "txt");
openfile.setFileFilter(filter);
int open = openfile.showDialog(null, "Open file");
if (open == JFileChooser.APPROVE_OPTION) {
try {
filename = openfile.getSelectedFile();
openedfile = openfile.getSelectedFile();
BufferedReader br = new BufferedReader(new FileReader(openfile.getSelectedFile()));
String ln;
jta.setText(null);
while ((ln = br.readLine()) != null) {
jta.append(ln + "\n");
}
br.close();
win.setTitle(filename + " - SimpleTextMaster 0.8(Beta)");
needsave = false;
JOptionPane.showMessageDialog(null, "File opened.");
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "The file cannot be opened");
}
}
} else if (input == 2) {
return;
}
} else if (needsave == false) {
JFileChooser openfile = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("Txt file", "txt");
openfile.setFileFilter(filter);
int open = openfile.showDialog(null, "Open file");
if (open == JFileChooser.APPROVE_OPTION) {
try {
filename = openfile.getSelectedFile();
openedfile = openfile.getSelectedFile();
BufferedReader br = new BufferedReader(new FileReader(openfile.getSelectedFile()));
String ln;
jta.setText(null);
while ((ln = br.readLine()) != null) {
jta.append(ln + "\n");
}
br.close();
win.setTitle(filename + " - SimpleTextMaster 0.8(Beta)");
needsave = false;
JOptionPane.showMessageDialog(null, "File opened.");
} catch (IOException e1) {
JOptionPane.showMessageDialog(null, "The file cannot be opened");
}
}
}
Извиняюсь если вы найдёте плохой код, я новичок.
Ответы (1 шт):
Автор решения: Agzam4
→ Ссылка
- Не дублируйте код, сделайте методы:
save(File f), и методsave_as()("сохранить как"), который будет вызывать методsave(File f) txtфайл хранит только текст, потому, если Вы хотите сохранять данные шрифта Вам следует преобразовать их в текст и сохранить вместе с текстом изJTextArea- Я заменил код сохранения и чтения
Вот методы:
private void open(String path) {
try {
byte[] all;
all = Files.readAllBytes(Paths.get(path));
filename = path; // Обновляем имя открытого файла
String str = new String(all);
String datastr = str.split("\n")[0];
String data[] = datastr.split("\t");
System.out.println(datastr);
jtextArea.setFont(new Font(data[0], Integer.valueOf(data[1]), Integer.valueOf(data[2])));
jtextArea.setText(str.substring(datastr.length()+1));
} catch (IOException e) {
}
}
private void save() {
save_as(new File(filename)); // filename - это имя открытого файла
}
private void save_as(File file) {
String saveText = jtextArea.getFont().getFamily() + "\t" // Имя шрифта
+ jtextArea.getFont().getStyle() + "\t" // Стиль шрифта
+ jtextArea.getFont().getSize() + "\n" // Размер шрифта
+ jtextArea.getText(); // Текст
try (FileWriter writer = new FileWriter(file)) {
writer.write(saveText);
writer.flush();
} catch (IOException ex) {
ex.printStackTrace();
}
}
Вот пример использования:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.JMenuBar;
import javax.swing.JFileChooser;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
public class JFrame extends javax.swing.JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JFrame frame = new JFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
String filename = "test";
JTextArea jtextArea;
public JFrame() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException
| UnsupportedLookAndFeelException e1) {
e1.printStackTrace();
}
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu file = new JMenu("File");
menuBar.add(file);
JMenuItem open = new JMenuItem("Open");
file.add(open);
JMenuItem save = new JMenuItem("Save");
file.add(save);
JMenuItem save_as = new JMenuItem("Save as");
file.add(save_as);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
jtextArea = new JTextArea();
String fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); // Шрифты
// Устанавлиеваем случайный шрифт для jtextArea
jtextArea.setFont(new Font(fonts[(int) (Math.random()*fonts.length)], (int) (Math.random()*2), 10 + (int) (Math.random()*10)));
contentPane.add(jtextArea, BorderLayout.CENTER);
save.addActionListener(e -> save());
save_as.addActionListener(e -> {
JFileChooser savefile = new JFileChooser();
if (savefile.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
save_as(savefile.getSelectedFile());
}
});
open.addActionListener(e -> {
JFileChooser savefile = new JFileChooser();
if (savefile.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
open(savefile.getSelectedFile().toString());
}
});
}
private void open(String path) {
try {
byte[] all;
all = Files.readAllBytes(Paths.get(path));
filename = path;
String str = new String(all);
String datastr = str.split("\n")[0];
String data[] = datastr.split("\t");
System.out.println(datastr);
jtextArea.setFont(new Font(data[0], Integer.valueOf(data[1]), Integer.valueOf(data[2])));
jtextArea.setText(str.substring(datastr.length()+1));
} catch (IOException e) {
}
}
private void save() {
save_as(new File(filename));
}
private void save_as(File file) {
String saveText = jtextArea.getFont().getFamily() + "\t" // Имя шрифта
+ jtextArea.getFont().getStyle() + "\t" // Стиль шрифта
+ jtextArea.getFont().getSize() + "\n" // Размер шрифта
+ jtextArea.getText(); // Текст
try (FileWriter writer = new FileWriter(file)) {
writer.write(saveText);
writer.flush();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}