Texteditor

bene98

Aktives Mitglied
Hallo, Ich versuche gerade einen Text_Editor erstellen, den ich am leibesten auch für das Schreiben für e-mails verwenden würde.
Ich hab von dem Vorhaben auch eine Vorlage in einem Buch - ich will es aber lieber selbst umsetzen, um was zu lernen.
Meine Frage im Moment ist: Weshalb erhalte ich eine null Ponter Exception, wenn ich das Projekt ausführe und zum Beispiel die Schriftart wechsele.
Java:
package test;
import javax.swing.*;
import javax.swing.plaf.metal.MetalLookAndFeel;
import javax.swing.plaf.metal.OceanTheme;

import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

public class Textverarbeitung implements ItemListener {
JFrame tvframe;
JTextArea tvarea;
JPanel tvpanel;
JMenuBar tvbar;
JComboBox<String> fonts;
JComboBox<String> styles;
JComboBox<String> farben;
String farbe,fontname,style;

public Textverarbeitung() {}
public static void main (String []args) {
Textverarbeitung Textverarbeitung2 = new Textverarbeitung();   
Textverarbeitung2.run();
}
    
public void run() {   
JFrame tvframe= new JFrame();

try {
    // Set metl look and feel
    UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

    // Set theme to ocean
    MetalLookAndFeel.setCurrentTheme(new OceanTheme());
}
catch (Exception e) {
}

JTextArea tvarea = new JTextArea("Langeweile");
tvarea.setEditable(true);
tvarea.setPreferredSize(new Dimension(600,300));
tvarea.setLineWrap(true);
JScrollPane scroll= new JScrollPane();
scroll.getViewport().add(tvarea);

JMenuBar tvbar = new JMenuBar();
JMenu tvmenudatei = new JMenu("Datei");
JMenu tvmenubearbeiten = new JMenu("Bearbeiten");
JMenu tvmenusuchen = new JMenu("Suchen");
JMenu tvmenuversenden = new JMenu("Versenden");
tvbar.add(tvmenudatei);
tvbar.add(tvmenubearbeiten);
tvbar.add(tvmenusuchen);
tvbar.add(tvmenuversenden);

JMenuItem dateiladen =new JMenuItem("Datei laden");
tvmenudatei.add(dateiladen);
JMenuItem dateispeichern= new JMenuItem("Datei speichern");
tvmenudatei.add(dateispeichern);
JPanel tvpanel= new JPanel();


tvpanel.setLayout(new BorderLayout());
tvframe.setLayout(new BorderLayout());
tvframe.add(BorderLayout.NORTH,tvbar);
tvpanel.setSize(300, 200);
tvpanel.setVisible(true);



JComboBox<String> fonts = new JComboBox <String>();
fonts.addItem(Font.SERIF);
fonts.addItem(Font.SANS_SERIF);
fonts.addItem(Font.MONOSPACED);

JComboBox<String> styles = new JComboBox <String>();
styles.addItem("normal");
styles.addItem("kursiv");
styles.addItem("fett");


JComboBox <String> farben= new JComboBox<String>();
farben.addItem("Schwarz");
farben.addItem("Rot");
farben.addItem("Grün");
farben.addItem("Gelb");
farben.addItem("Blau");
farben.addItem("Cyan");
farben.addItem("Magenta");


JPanel auswahlboxen = new JPanel();
auswahlboxen.setLayout(new GridLayout(1,4));
auswahlboxen.add(fonts);
auswahlboxen.add(styles);
auswahlboxen.add(farben);
tvpanel.add(BorderLayout.NORTH, auswahlboxen);
tvpanel.add(BorderLayout.CENTER, scroll);


tvframe.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
tvframe.add(tvpanel);
tvframe.pack();
tvframe.setVisible(true);


fonts.setSelectedItem("SansSerif");
styles.setSelectedItem("normal");
farben.setSelectedIndex(0);

fonts.addItemListener((ItemListener) this);
styles.addItemListener((ItemListener) this);
farben.addItemListener((ItemListener) this);



}

public void fontAktualisieren() {
int fontstil;
String farbe,fontname,style;
int punktgröße;


    
    fontname = (String)fonts.getSelectedItem();
    style =  (String)styles.getSelectedItem();
    farbe= (String)farben.getSelectedItem();
    
    if(farbe.equals("Schwarz"))
        tvarea.setForeground(Color.black);
    if(farbe.equals("Rot"))
        tvarea.setForeground(Color.red);
    if(farbe.equals("Grün"))
        tvarea.setForeground(Color.green);
    if(farbe.equals("Gelb"))
        tvarea.setForeground(Color.yellow);
    if(farbe.equals("Blau"))
        tvarea.setForeground(Color.blue);
    if(farbe.equals("Cyan"))
        tvarea.setForeground(Color.cyan);
    if(farbe.equals("Magenta"))
        tvarea.setForeground(Color.magenta);

    fontstil=Font.PLAIN;
    if(style.equals("kursiv"))
    fontstil += Font.ITALIC;
    if(style.equals("fett"))
        fontstil+= Font.BOLD;
    
    tvarea.setFont(new Font (fontname, fontstil, 12));
}
@Override
public void itemStateChanged(ItemEvent e) {
    fontAktualisieren();

    
}
    
    
    
    
    
    


}
 

bene98

Aktives Mitglied
Könntest Du mir das evtl etwas näher erklären oder mir sagen unter welchem Stichwort ich das nachschlagen kann?
Danke
 

bene98

Aktives Mitglied
Ich habe nicht ganz verstanden, welche Variable das Problem verursacht. Oder geht es allgemein darum, dass z.B. der jframe oben als instanzvariable deklariert und in run() initialisiert wird?

Ich hab versucht, das Problem zu lösen, indem ich die Sachen in den Konstruktor gepackt habe. Allerdings bleibt das Problem der N
Java:
package test;
import javax.swing.*;
import javax.swing.plaf.metal.MetalLookAndFeel;
import javax.swing.plaf.metal.OceanTheme;

import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

public class Textverarbeitung implements ItemListener {
JFrame tvframe;
JTextArea tvarea;
JPanel tvpanel;
JMenuBar tvbar;
JComboBox<String> fonts;
JComboBox<String> styles;
JComboBox<String> farben;
String farbe,fontname,style;

public Textverarbeitung() {   
    JFrame tvframe= new JFrame();

    try {
        // Set metl look and feel
        UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

        // Set theme to ocean
        MetalLookAndFeel.setCurrentTheme(new OceanTheme());
    }
    catch (Exception e) {
    }

    JTextArea tvarea = new JTextArea("f");
    tvarea.setEditable(true);
    tvarea.setPreferredSize(new Dimension(600,300));
    tvarea.setLineWrap(true);
    JScrollPane scroll= new JScrollPane();
    scroll.getViewport().add(tvarea);

    JMenuBar tvbar = new JMenuBar();
    JMenu tvmenudatei = new JMenu("Datei");
    JMenu tvmenubearbeiten = new JMenu("Bearbeiten");
    JMenu tvmenusuchen = new JMenu("Suchen");
    JMenu tvmenuversenden = new JMenu("Versenden");
    tvbar.add(tvmenudatei);
    tvbar.add(tvmenubearbeiten);
    tvbar.add(tvmenusuchen);
    tvbar.add(tvmenuversenden);

    JMenuItem dateiladen =new JMenuItem("Datei laden");
    tvmenudatei.add(dateiladen);
    JMenuItem dateispeichern= new JMenuItem("Datei speichern");
    tvmenudatei.add(dateispeichern);
    JPanel tvpanel= new JPanel();


    tvpanel.setLayout(new BorderLayout());
    tvframe.setLayout(new BorderLayout());
    tvframe.add(BorderLayout.NORTH,tvbar);
    tvpanel.setSize(300, 200);
    tvpanel.setVisible(true);



    JComboBox<String> fonts = new JComboBox <String>();
    fonts.addItem(Font.SERIF);
    fonts.addItem(Font.SANS_SERIF);
    fonts.addItem(Font.MONOSPACED);

    JComboBox<String> styles = new JComboBox <String>();
    styles.addItem("normal");
    styles.addItem("kursiv");
    styles.addItem("fett");


    JComboBox <String> farben= new JComboBox<String>();
    farben.addItem("Schwarz");
    farben.addItem("Rot");
    farben.addItem("Grün");
    farben.addItem("Gelb");
    farben.addItem("Blau");
    farben.addItem("Cyan");
    farben.addItem("Magenta");


    JPanel auswahlboxen = new JPanel();
    auswahlboxen.setLayout(new GridLayout(1,4));
    auswahlboxen.add(fonts);
    auswahlboxen.add(styles);
    auswahlboxen.add(farben);
    tvpanel.add(BorderLayout.NORTH, auswahlboxen);
    tvpanel.add(BorderLayout.CENTER, scroll);


    tvframe.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    tvframe.add(tvpanel);
    tvframe.pack();
    tvframe.setVisible(true);


    
    fonts.addItemListener((ItemListener) this);
    styles.addItemListener((ItemListener) this);
    farben.addItemListener((ItemListener) this);



    }
public static void main (String []args) {
Textverarbeitung Textverarbeitung2 = new Textverarbeitung();   
}
    


public void fontAktualisieren() {
int fontstil;
String farbe,fontname,style;
int punktgröße;
    
    fontname = (String)fonts.getSelectedItem();
    style =  (String)styles.getSelectedItem();
    farbe= (String)farben.getSelectedItem();
    
    if(farbe.equals("Schwarz"))
        tvarea.setForeground(Color.black);
    if(farbe.equals("Rot"))
        tvarea.setForeground(Color.red);
    if(farbe.equals("Grün"))
        tvarea.setForeground(Color.green);
    if(farbe.equals("Gelb"))
        tvarea.setForeground(Color.yellow);
    if(farbe.equals("Blau"))
        tvarea.setForeground(Color.blue);
    if(farbe.equals("Cyan"))
        tvarea.setForeground(Color.cyan);
    if(farbe.equals("Magenta"))
        tvarea.setForeground(Color.magenta);

    fontstil=Font.PLAIN;
    if(style.equals("kursiv"))
    fontstil += Font.ITALIC;
    if(style.equals("fett"))
        fontstil+= Font.BOLD;
    
    tvarea.setFont(new Font (fontname, fontstil, 12));
}
@Override
public void itemStateChanged(ItemEvent e) {
    fontAktualisieren();

    
}
    
    
    
    
    
    


}
ull Pointer Exception bestehen.
 

fhoffmann

Top Contributor
Code:
public class Textverarbeitung implements ItemListener {
    JFrame tvframe;
    // ...
    public Textverarbeitung() {
        JFrame tvframe= new JFrame(); // dies ist eine neue lokale Variable und nicht das Member der Klasse
Lass im Konstruktor das JFrame weg (analog bei den andernen Membern).
 

bene98

Aktives Mitglied
Guten Tag,
aktuell habe ich ein Problem damit eine Bildanzeige ein mein Programm zu integrieren.
ich krieg das nicht hin, dass das Bild auf ein Panel gezeichnet wird.
Ich hab nur den Code der relevanten Klasse eingefügt. Andernfalls wäre es uz unübersichtlich
Java:
class Listener implements ActionListener {

    JFrame fenster;
    Image aktuellesBild;
    String dateiname;
    JPanel bildpanel;
    
    

    public void Textspeichern() throws IOException {
    String text = tvarea.getText();
String dateiName = "Test.txt";

FileOutputStream schreibeStrom = null;
try {
    schreibeStrom = new FileOutputStream(dateiName);
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
for (int i=0; i < text.length(); i++){

  schreibeStrom.write((byte)text.charAt(i));}

schreibeStrom.close();
}
@Override

public void actionPerformed(ActionEvent e) {
    String label=e.getActionCommand();
    
    if(label.equals("Datei speichern"))
        try {
            Textspeichern();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();}

    if (label.equals("Datei laden"))
        DateiLaden();
    if (label.equals("Drucken")) drucken();
    if (label.equals("Aufgaben anzeigen")) aufgabenAnzeigen();
    if (label.equals("Aufgabe entfernen")) aufgabeEntfernen();
    if (label.equals("Einkaufsliste anzeigen")) einkaufslisteAnzeigen();
    if (label.equals("Aufgabe hinzufügen")) aufgabeHinzufügen();
    if (label.equals("Bildbetrachter öffnen")) bildÖffnen();
    if (label.equals ("Einkaufsliste laden"))
        try {
            einkaufslisteLaden();
        } catch (FileNotFoundException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
    if (label.equals("Einkaufsliste speichern"))
        try {
            einkaufslistespeichern();
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    
    
    

}

public void bildÖffnen() {

fenster = new JFrame("Bildbetrachter");



JMenuBar menuezeile = new JMenuBar();
fenster.setJMenuBar(menuezeile);
menuezeile.setVisible(true);
JMenu hilfemenue =new JMenu("Hilfe");
JMenu filtermenue= new JMenu("Filter");
JMenu dateimenue= new JMenu("Datei");
menuezeile.add(dateimenue);
menuezeile.add(filtermenue);
menuezeile.add(hilfemenue);
JMenuItem oeffnenEintrag = new JMenuItem("Öffnen");
oeffnenEintrag.addActionListener(e->bildLaden());
dateimenue.add(oeffnenEintrag);

JMenuItem beendeEintrag = new JMenuItem("Beenden");
beendeEintrag.addActionListener(e->bildSchliessen());
dateimenue.add(beendeEintrag);
fenster.pack();
fenster.setVisible(true);

}

public void bildLaden() {
bildpanel = new JPanel();
fenster.add(bildpanel);
JFileChooser dlg= new JFileChooser(".");
int dialogRueckgabe = dlg.showOpenDialog(Aufgabenframe);
if (dialogRueckgabe == JFileChooser.APPROVE_OPTION) {
dateiname = dlg.getSelectedFile().getAbsolutePath();}
ImageIcon tmp = new ImageIcon(dateiname);
aktuellesBild= tmp.getImage();}

public void  paintComponent (Graphics g) {   
g.drawImage(aktuellesBild, 0,0,bildpanel);
bildpanel.repaint();
}}









public void bildSchliessen() {
    
}
 

bene98

Aktives Mitglied
Ich wolte fragen, ob mir vielleicht jemand weiterhelfen kann. Ich krieg das blöde Bild einfach nicht angezeigt. Problem ist: Keine Fehlermeldung in Eclipse, d.h. ich weiß nicht, wonach ich suchen soll.



Java:
class Listener implements ActionListener {

    JFrame fenster;
    Image aktuellesBild;
    String dateiname;
    JPanel bildpanel;
    
    

    public void Textspeichern() throws IOException {
    String text = tvarea.getText();
String dateiName = "Test.txt";

FileOutputStream schreibeStrom = null;
try {
    schreibeStrom = new FileOutputStream(dateiName);
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
for (int i=0; i < text.length(); i++){

  schreibeStrom.write((byte)text.charAt(i));}

schreibeStrom.close();
}
@Override

public void actionPerformed(ActionEvent e) {
    String label=e.getActionCommand();
    
    if(label.equals("Datei speichern"))
        try {
            Textspeichern();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();}

    if (label.equals("Datei laden"))
        DateiLaden();
    if (label.equals("Drucken")) drucken();
    if (label.equals("Aufgaben anzeigen")) aufgabenAnzeigen();
    if (label.equals("Aufgabe entfernen")) aufgabeEntfernen();
    if (label.equals("Einkaufsliste anzeigen")) einkaufslisteAnzeigen();
    if (label.equals("Aufgabe hinzufügen")) aufgabeHinzufügen();
    if (label.equals("Bildbetrachter öffnen")) bildÖffnen();
    if (label.equals ("Einkaufsliste laden"))
        try {
            einkaufslisteLaden();
        } catch (FileNotFoundException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
    if (label.equals("Einkaufsliste speichern"))
        try {
            einkaufslistespeichern();
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    
    
    

}

public void bildÖffnen() {

fenster = new JFrame("Bildbetrachter");



JMenuBar menuezeile = new JMenuBar();
fenster.setJMenuBar(menuezeile);
menuezeile.setVisible(true);
JMenu hilfemenue =new JMenu("Hilfe");
JMenu filtermenue= new JMenu("Filter");
JMenu dateimenue= new JMenu("Datei");
menuezeile.add(dateimenue);
menuezeile.add(filtermenue);
menuezeile.add(hilfemenue);
JMenuItem oeffnenEintrag = new JMenuItem("Öffnen");
oeffnenEintrag.addActionListener(e->bildLaden());
dateimenue.add(oeffnenEintrag);

JMenuItem beendeEintrag = new JMenuItem("Beenden");
beendeEintrag.addActionListener(e->bildSchliessen());
dateimenue.add(beendeEintrag);
fenster.pack();
fenster.setVisible(true);

}

public void bildLaden() {
bildpanel = new JPanel();
fenster.add(bildpanel);
JFileChooser dlg= new JFileChooser(".");
int dialogRueckgabe = dlg.showOpenDialog(Aufgabenframe);
if (dialogRueckgabe == JFileChooser.APPROVE_OPTION) {
dateiname = dlg.getSelectedFile().getAbsolutePath();}
ImageIcon tmp = new ImageIcon(dateiname);
aktuellesBild= tmp.getImage();
}


public class Bildanzeige extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);   
g.drawImage(aktuellesBild,0,0,this);
fenster.add(this); this.repaint(); fenster.repaint();

}


}
public void bildSchliessen() {
    
}}
 

LimDul

Top Contributor
Tipp: Strukturier deinen Code. Eclipse bietet einen Code Formatter - nutze ihn. So ist es Kraut & Rüben bzgl. Einrückungen und Klammersetzungen und damit extrem schwer zu lesen.

Im Detail kann und will ich mich nicht damit beschäftigen, aber folgender Code sieht nach riesigem Unfug aus:

Java:
public void paintComponent(Graphics g) {
super.paintComponent(g);   
g.drawImage(aktuellesBild,0,0,this);
fenster.add(this); this.repaint(); fenster.repaint();

}

Im paintComponent zeichnet man seine Komponenten. Die wird ziemlich oft aufgerufen. In der zeichnest du nicht, sondern modifzierst deine Komponenten, in dem du auf das Fenster das JPanel packst. Das ist zum einen an der Stelle kompletter Unfug - zum anderen, sofern das Panel nicht irgendwo vorher sichtbar ist, wird paintComponent nie aufgerufen - wenn es nicht sichtbar ist, wird es nicht gezeichnet.
 

bene98

Aktives Mitglied
Danke, hat funktioniert. War das Problem mit paintComponent und dass man das Panel außerhalb hinzufügen musste.
Mit der Frage von Winrückungen etc. werde ich mich mal beschäftigen. Wie kann man das erarbeiten. In den Anfängerbüchern, die ich hab, ist das nicht drin.
 

Ähnliche Java Themen

Neue Themen


Oben