Mam zrobić prosty okienkowy edytor tekstu i mam pytanie: jeśli FileChooser() wybiorę jakiś plik to w jaki sposób dodać jego zawartość do JTextArea a następnie jej zawartość zapisać do tego samego pliku?
Odczytanie pliku:
if(fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
{
File file = fc.getSelectedFile();
try
(
Scanner sc = new Scanner(file);
)
{
ta.setText("");
while(sc.hasNextLine())
{
ta.append(sc.nextLine() + "\n");
}
}
catch(Exception e)
{...}
}
Ok dzięki a zmiany w tym pliku zostaną zapisane czy trzeba to jakoś zrobić
Niestety, trzeba to jakoś zrobić.
Chcę, żeby po kliknięciu w przycisk pojawił się JFileChooser. Mam coś takiego, ale nie działa i nie wiem dlaczego (action listner dodany do przycsku):
public void actionPerformed(ActionEvent action) {
Object source = action.getSource();
if(source == wczytaj)
{
if(fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
{
File file = fc.getSelectedFile();
try(Scanner sc = new Scanner(file);)
{
ta.setText("");
while(sc.hasNextLine())
{
ta.append(sc.nextLine() + "\n");
}
}
catch(Exception e)
{
}
}
}
}
cały kod:
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.filechooser.FileFilter;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.io.File;
public class edytor extends JFrame implements ActionListener{
private JTextArea ta;
private JButton wczytaj;
private JButton zapisz;
private JButton zakoncz;
private JFileChooser fc = new JFileChooser();
FileFilter filter = new FileNameExtensionFilter("Pliki tekstowe", "txt");
//fc.addChoosableFileFilter(filter);
private JPanel panel()
{
JPanel mp = new JPanel();
mp.setLayout(new BoxLayout(mp, BoxLayout.Y_AXIS));
mp.setPreferredSize(new Dimension(80, 1400));
JPanel menu = new JPanel();
JButton wczytaj = new JButton("Wczytaj plik");
wczytaj.setFont(new Font("Comic Sans", Font.BOLD, 20));
wczytaj.addActionListener(this);
wczytaj.setPreferredSize(new Dimension(200, 60));
menu.add(wczytaj);
JButton zapisz = new JButton("Zapisz plik");
zapisz.setFont(new Font("Comic Sans", Font.BOLD, 20));
zapisz.addActionListener(this);
zapisz.setPreferredSize(new Dimension(200, 60));
menu.add(zapisz);
JButton zakoncz = new JButton("Zakończ");
zakoncz.setFont(new Font("Comic Sans", Font.BOLD, 20));
zakoncz.addActionListener(this);
zakoncz.setPreferredSize(new Dimension(200, 60));
menu.add(zakoncz);
mp.add(menu);
JTextArea ta = new JTextArea(200, 1200);
ta.setEditable(true);
ta.setFont(new Font("Serif", Font.PLAIN, 20));
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
ta.setCaretPosition(ta.getDocument().getLength());
JScrollPane sp = new JScrollPane(ta);
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
sp.setPreferredSize(new Dimension(250, 700));
mp.add(sp);
return mp;
}
public edytor()
{
super();
this.getContentPane().add(this.panel());
}
public static void okno()
{
edytor e = new edytor();
e.setDefaultCloseOperation(EXIT_ON_CLOSE);
e.pack();
e.setLocation(200, 0);
e.setTitle("Edytor tekstu");
e.setSize(1500, 1000);
e.setResizable(true);
e.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent action) {
Object source = action.getSource();
if(source == wczytaj)
{
int ret = fc.showOpenDialog(null);
if(ret == JFileChooser.APPROVE_OPTION)
{
File file = fc.getSelectedFile();
try
{
ta.read(new FileReader(file.getAbsolutePath()), null);
}
catch(Exception e)
{
ta.setText("Nie mogę otworzyć pliku: "+file.getAbsolutePath());
ta.setText("Problem " + e);
}
}
}
else if(source == zapisz)
{
setBackground(Color.GREEN);
}
else if(source == zakoncz)
{
dispose();
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
okno();
}
});
}
}
```
```
Masz dwie zmienne o nazwie wczytaj
- pole w klasie - ma ono wartość
null
i nie ma podpiętego listenera - zmienna lokalna konstruktora - nie jest nullem i ma listenera
Porównanie (w metodzie actionPerformed)
if(source == wczytaj)
odwołuje się do pola w klasie.
Poprawienie polega na zmianie wiersza
JButton wczytaj = new JButton("Wczytaj plik");
//na
wczytaj = new JButton("Wczytaj plik");
Ok dzięki. Prosty błąd. Mam teraz taki zapis tylko jak dodam coś linijkę niżej to skleja obok jak to poprawić
else if(source == zapisz)
{
zapisz.setBackground(Color.GREEN);
zapisz.setForeground(Color.BLACK);
if(fc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION)
{
File file = fc.getSelectedFile();
try
{
FileWriter out = new FileWriter(file);
out.write(ta.getText());
out.close();
}
catch(Exception e)
{
ta.setText("Błąd zapisu:" + file.getAbsolutePath());
ta.setText("Problem" + e);
}
}
}
Jak zauważyłeś to sklejenie? Otworzyłeś zapisany plik w notatniku?
Tak, jak otworzę zapisany plik w notatniku to linijki są obok siebie, ale jak wczytam ponownie do programu to jest ok , więc nie wiem czy to sposób edycji w notatniku czy błąd kodu.
To jest usterka notatnika, który rozumie tylko jeden znak końca wiersza "\r\n"
- używane są również "\n" oraz "\r". Wszystkie edytory (poza upośledzonym notatnikiem) - również windowsowe - rozumieją wszystkie znaki końca wiersza. Masz wybór:
- nie oglądaj pliku w notatniku,-
- zmienić wartość stałej
line.separator
.
ok. Dzięki za pomoc
I jeszcze jedno pytanko, jest jakaś metoda, żeby umożliwić wczytanie wszystkich plików tekstowych czy ręcznie muszę dopisać w FileFilter?
I dlaczego to nie działa: (JButton z podpietym ActionListnerem)
else if(source == male)
{
String text = ta.getText();
text.toLowerCase();
ta.setText(text);
}