Java GUI-Load a Save-vysvětlení úseku kódu
Ahoj
Jsem ve třetáku a na cvičení programování z Javy jsem dostal učitele, co přeskočil uplně rok vyučování. Děláme GUI a diví se, že většina třídy to nechápe, protože nemáme na čem stavět. Zkrátka...nemám problém se to naučit (potřeboval bych ještě pár dnů abych lépe pochopil VV-proudy a vyjímky atd.), ale zítra píšeme "motivační písemku" (opravná na tu, ž čeho má 96% třídy za 5).
Program (JFrame Form...) funguje tak, že načte textovej soubor pomocí tlačítka "Load", text zobrazí do textového pole, kde se dá editovat a zeditovanej text se dá zase někam uložit pomocí tlačítka "Save".
Děláme v Netbeansu, takže polovina věcí za nás dělá Designer. V designeru nahážeme tlačítka (JButton) a textové pole (JTextArea a JScrollPane). V designeru ještě přiřádíme ke každému objektu události (Events-ActionPerformed-metody akceSave a akceLoad). Takže v source máme vygenerovanej nezměnitelnej kod popisujicí GUI a zbývá prostě popsat ty tlačítka a pole co mají dělat.
A v tom je ten problém. Napsat to umím (chápu základy OOP-třídy a objekty, takže souvislosti OK), ale rozumím tomu tak z poloviny a potřeboval bych, kdyby mi to někdo vysvětlil.
Nechci všechno, jen bych rád lépe pochopil co dělaj třídy JFileChooser, FileReader, BufferedReader, BufferedWriter v metodách akceSave(), akceLoad() a hlavně co to je ta moje vytvořená metoda inc().
[code]package Test01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import javax.swing.JFileChooser;
public class JFrame extends javax.swing.JFrame {
private JFileChooser jf;
private javax.swing.JButton save;
public JFrame() {
initComponents();
inc();
}
private void inc() {
jf = new JFileChooser("C:\\Users");
save = new javax.swing.JButton();
save.setText("Save");
save.setBounds(10, 40, 80, 50);
save.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
akceSave(evt);
}
});
getContentPane().add(save);
}
//GENEROVANEJ KOD
@SuppressWarnings("unchecked")
////GEN-BEGIN:initComponents
private void initComponents() {
load = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Text Editor");
load.setText("Load");
load.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
akceLoad(evt);
}
});
jTextArea1.setColumns(20);
jTextArea1.setRows(5);
jScrollPane1.setViewportView(jTextArea1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(614, Short.MAX_VALUE)
.addComponent(load)
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addGap(127, 127, 127)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 481, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(71, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(26, 26, 26)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 308, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(load)
.addContainerGap())
);
pack();
}// //GEN-END:initComponents
//KONEC GENEROVANEJ KOD
private void akceLoad(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_akceLoad
try {
jf.showOpenDialog(this.load);
BufferedReader br = new BufferedReader(new FileReader(jf.getSelectedFile()));
String text = "";
String linka;
while ((linka = br.readLine()) != null) {
System.out.println(""+linka);
jTextArea1.append(linka);
}
} catch (Exception e) {
System.out.println("Nelze load: " + e);
}
}//GEN-LAST:event_akceLoad
private void akceSave(java.awt.event.ActionEvent evt) {
try {
jf.showSaveDialog(this.save);
BufferedWriter bw = new BufferedWriter(new FileWriter(jf.getSelectedFile()));
jTextArea1.write(bw);
} catch (Exception e) {
System.out.println("Nelze save: " + e);
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JButton load;
// End of variables declaration//GEN-END:variables
}
[/code]
Jsem ve třetáku a na cvičení programování z Javy jsem dostal učitele, co přeskočil uplně rok vyučování. Děláme GUI a diví se, že většina třídy to nechápe, protože nemáme na čem stavět. Zkrátka...nemám problém se to naučit (potřeboval bych ještě pár dnů abych lépe pochopil VV-proudy a vyjímky atd.), ale zítra píšeme "motivační písemku" (opravná na tu, ž čeho má 96% třídy za 5).
Program (JFrame Form...) funguje tak, že načte textovej soubor pomocí tlačítka "Load", text zobrazí do textového pole, kde se dá editovat a zeditovanej text se dá zase někam uložit pomocí tlačítka "Save".
Děláme v Netbeansu, takže polovina věcí za nás dělá Designer. V designeru nahážeme tlačítka (JButton) a textové pole (JTextArea a JScrollPane). V designeru ještě přiřádíme ke každému objektu události (Events-ActionPerformed-metody akceSave a akceLoad). Takže v source máme vygenerovanej nezměnitelnej kod popisujicí GUI a zbývá prostě popsat ty tlačítka a pole co mají dělat.
A v tom je ten problém. Napsat to umím (chápu základy OOP-třídy a objekty, takže souvislosti OK), ale rozumím tomu tak z poloviny a potřeboval bych, kdyby mi to někdo vysvětlil.
Nechci všechno, jen bych rád lépe pochopil co dělaj třídy JFileChooser, FileReader, BufferedReader, BufferedWriter v metodách akceSave(), akceLoad() a hlavně co to je ta moje vytvořená metoda inc().
[code]package Test01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import javax.swing.JFileChooser;
public class JFrame extends javax.swing.JFrame {
private JFileChooser jf;
private javax.swing.JButton save;
public JFrame() {
initComponents();
inc();
}
private void inc() {
jf = new JFileChooser("C:\\Users");
save = new javax.swing.JButton();
save.setText("Save");
save.setBounds(10, 40, 80, 50);
save.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
akceSave(evt);
}
});
getContentPane().add(save);
}
//GENEROVANEJ KOD
@SuppressWarnings("unchecked")
//
private void initComponents() {
load = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Text Editor");
load.setText("Load");
load.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
akceLoad(evt);
}
});
jTextArea1.setColumns(20);
jTextArea1.setRows(5);
jScrollPane1.setViewportView(jTextArea1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(614, Short.MAX_VALUE)
.addComponent(load)
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addGap(127, 127, 127)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 481, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(71, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(26, 26, 26)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 308, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(load)
.addContainerGap())
);
pack();
}//
//KONEC GENEROVANEJ KOD
private void akceLoad(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_akceLoad
try {
jf.showOpenDialog(this.load);
BufferedReader br = new BufferedReader(new FileReader(jf.getSelectedFile()));
String text = "";
String linka;
while ((linka = br.readLine()) != null) {
System.out.println(""+linka);
jTextArea1.append(linka);
}
} catch (Exception e) {
System.out.println("Nelze load: " + e);
}
}//GEN-LAST:event_akceLoad
private void akceSave(java.awt.event.ActionEvent evt) {
try {
jf.showSaveDialog(this.save);
BufferedWriter bw = new BufferedWriter(new FileWriter(jf.getSelectedFile()));
jTextArea1.write(bw);
} catch (Exception e) {
System.out.println("Nelze save: " + e);
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JButton load;
// End of variables declaration//GEN-END:variables
}
[/code]
inc se vola po spusteni a vytvori ti jf - to bude okno pro vyber a ulozeni souboru (takovy to klasicky windowsacky ulozit jako, ikdyz v swing asi bude nejaky vlastni) a tlacitko save - vytvori, nastavi polohu a udalosti a prida do content pane
jinak tezko rict co kde konci a zacina, mohl bys to editnout a misto tagu quote pouzit code? zustane zachovano formatovani a pujde se v tom trochu vyznat...
jinak dokumentace o tech tridach mlci?
jinak tezko rict co kde konci a zacina, mohl bys to editnout a misto tagu quote pouzit code? zustane zachovano formatovani a pujde se v tom trochu vyznat...
jinak dokumentace o tech tridach mlci?
jj dokumentaci jsem pročítal a trošku mi to pomohlo v pochopení funkce. Spíš bych potřeboval vysvětlit ty soukromé metody co popisují přes vyjímky ty tlačítka...tedy akceSave, akceLoad a hlavně inc() co je v konstruktoru. To jsou vlastně jediné věci, co budu zítra psát sám (umím to jak vůl nazpamět, ale chápu to asi tak z poloviny...z pohledu OOP). Ostaní hážu v Designeru
Tak jednoduše od konce. :)
main je startovací bod programu.
Kód invokeLater() {
..
}
Ti spustí inicializaci tvého JFrame v gui vlákně.
new JFrame() - vytvoří ti instanci tvého JFramu a zavolá constuructor JFrame()
na ten se pak zavolá setVisible(true), to zobrazí okno na obrazovce.
Teď zpátky na začátek:
constructor JFrame()
ti napřed implicitně zavolá konstruktor předka (java.swing.awt.JFrame)
a pak funkce initComponents() a inc()
initComponents() ti inicializuje komponenty JFramu (Text areu a tlačítko load)
inc() vytvoří:
1) JFileChooser = komponenta (dialog) kterým pak můžeš vybrat soubor pro načtení/uložení obsahu textarey.
2) save = new javax.swing.JButton() - vytvoří nový button pro uložení
3) save.setText("Save") - nastavi text buttonku
4) save.setbounds() - umístí butonek do okna a nastaví velikost
5) save.addActionListener() = přidá ActionListener butonku save
6) funkce actionPerformed se pak vykoná při jeho stisknutí
7) getContentPane().add(save); = přidá ten butonek koněčně do okna
private void akceLoad(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_akceLoad
try {
jf.showOpenDialog(this.load); // JFileChoser zobrazí okno pro výběr souboru, který se objeví v text area
BufferedReader br = new BufferedReader(new FileReader(jf.getSelectedFile())); // z JFileChooseru se vezme vybraný soubor a vytvoří se pro něj FileReader(), ten umí čít ze souboru, ten se strčí do BufferedReaderu, který nečte znak po znaku ale čte třeba blok 2000 znaků (pro urychlení)
String text = "";
String linka;
while ((linka = br.readLine()) != null) { // čte se řádek po řádku
System.out.println(""+linka); // vypisuje se do konzole
jTextArea1.append(linka); // a přidává do textarey
}
} catch (Exception e) {
System.out.println("Nelze load: " + e);
}
}//GEN-LAST:event_akceLoad
private void akceSave(java.awt.event.ActionEvent evt) {
try {
jf.showSaveDialog(this.save); // zase se otevře dialog pro výběr souboru. Tentokrát pro uložení
BufferedWriter bw = new BufferedWriter(new FileWriter(jf.getSelectedFile())); // pro tenhle soubor se udělá FileWriter, strčí se do bufferedwriteru (zase umí zapisovat do souboru, a po blocích)
jTextArea1.write(bw); // JTextComponent (předek JTextArea) umí přímo zapsat svůj obsah pomocí writeru (kamkoli)
} catch (Exception e) {
System.out.println("Nelze save: " + e);
}
}
Snad jsem ti to trochu osvětlil.
main je startovací bod programu.
Kód invokeLater() {
..
}
Ti spustí inicializaci tvého JFrame v gui vlákně.
new JFrame() - vytvoří ti instanci tvého JFramu a zavolá constuructor JFrame()
na ten se pak zavolá setVisible(true), to zobrazí okno na obrazovce.
Teď zpátky na začátek:
constructor JFrame()
ti napřed implicitně zavolá konstruktor předka (java.swing.awt.JFrame)
a pak funkce initComponents() a inc()
initComponents() ti inicializuje komponenty JFramu (Text areu a tlačítko load)
inc() vytvoří:
1) JFileChooser = komponenta (dialog) kterým pak můžeš vybrat soubor pro načtení/uložení obsahu textarey.
2) save = new javax.swing.JButton() - vytvoří nový button pro uložení
3) save.setText("Save") - nastavi text buttonku
4) save.setbounds() - umístí butonek do okna a nastaví velikost
5) save.addActionListener() = přidá ActionListener butonku save
6) funkce actionPerformed se pak vykoná při jeho stisknutí
7) getContentPane().add(save); = přidá ten butonek koněčně do okna
private void akceLoad(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_akceLoad
try {
jf.showOpenDialog(this.load); // JFileChoser zobrazí okno pro výběr souboru, který se objeví v text area
BufferedReader br = new BufferedReader(new FileReader(jf.getSelectedFile())); // z JFileChooseru se vezme vybraný soubor a vytvoří se pro něj FileReader(), ten umí čít ze souboru, ten se strčí do BufferedReaderu, který nečte znak po znaku ale čte třeba blok 2000 znaků (pro urychlení)
String text = "";
String linka;
while ((linka = br.readLine()) != null) { // čte se řádek po řádku
System.out.println(""+linka); // vypisuje se do konzole
jTextArea1.append(linka); // a přidává do textarey
}
} catch (Exception e) {
System.out.println("Nelze load: " + e);
}
}//GEN-LAST:event_akceLoad
private void akceSave(java.awt.event.ActionEvent evt) {
try {
jf.showSaveDialog(this.save); // zase se otevře dialog pro výběr souboru. Tentokrát pro uložení
BufferedWriter bw = new BufferedWriter(new FileWriter(jf.getSelectedFile())); // pro tenhle soubor se udělá FileWriter, strčí se do bufferedwriteru (zase umí zapisovat do souboru, a po blocích)
jTextArea1.write(bw); // JTextComponent (předek JTextArea) umí přímo zapsat svůj obsah pomocí writeru (kamkoli)
} catch (Exception e) {
System.out.println("Nelze save: " + e);
}
}
Snad jsem ti to trochu osvětlil.