Problem bei eigenem Texteditor

Gayson

Mitglied
Hallo!
Ich habe vor ca. 1 Monat angefangen, ein Buch über Java zu lesen (Java in 21 Tagen).
Nun möchte ich mein erworbenes Wissen (;)) einsetzen, indem ich einen ganz normalen Texteditor bastel, dem ich dann immer mehr Funktionen zufügen möchte.

Zunächst habe ich zwei Probleme:
1. ActionListener: Ich möchte einfach erreichen, dass, wenn ich auf "Datei öfnnen klicke, sich der JFrameTitle ändert. Der Kompiler zeigt keine Fehler an, aber leider klappt das trotzdem nicht...
2. Textfeldgröße: Wenn ich die Applikation ausführe, kommt immer so ein hässlicher Rand. Außerdem verändert sich natülrich auch nicht die TextArea-Größe, wenn ich den JFrame mit der Maus vergrößere (liegt natürlich an den konstanten Werten im TextArea-Konstruktor). Aber wie lege ich die Werte so fest, so die Textfeldgröße immer so groß wie der JFrame ist? Hab JTextArea(getSize().height, getSize().width) ausprobiert, klappt aber natürlich nicht, weil bei getSize Pixelangaben rauskommen, die TextArea möchte aber Angaben für Spalten und Zeilen.

Wäre toll, wenn ihr euch mal den Code anschauen könntet, und mir Lösungsansätze geben könntet.

Mfg
Gayson

Code:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Editor extends JFrame implements ActionListener {

	public Editor() {
        		super("Editor");
		setLocation(100,100);
        		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//-----------------Look-And-Feel-Stil-----------------
    		try {
			UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName());
    			} catch(Exception e) {};

		//-----------------Menü-----------------
		JMenuBar bar = new JMenuBar();

		//Menüeintrag Datei
		JMenuItem j01 = new JMenuItem("Datei Öffnen");
		JMenuItem j02 = new JMenuItem("Datei Speichern");

		JMenu m1 = new JMenu("Datei");
		m1.add(j01);
		m1.add(j02);
		m1.addActionListener(this);
		bar.add(m1);

		//Menüeintrag Hilfe
		JMenuItem j11 = new JMenuItem("Hilfe");
		JMenuItem j12 = new JMenuItem("Info");
		JMenu m2 = new JMenu("Hilfe");
		m2.add(j11);
		m2.add(j12);
		bar.add(m2);

		//-----------------Textfeld-----------------
		JPanel pane = new JPanel();
		JTextArea textfeld = new JTextArea(20, 20);
		textfeld.setLineWrap(true);
		textfeld.setWrapStyleWord(true);
		JScrollPane scrollpane = new JScrollPane(textfeld, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		pane.add(scrollpane);

		setJMenuBar(bar);
		setContentPane(pane);
		pack();
		setVisible(true);
	}

	public static void main (String[] arguments) {
		Editor ed= new Editor();
	}

	public void actionPerformed(ActionEvent evt){
		if (evt.getSource() instanceof JMenuItem) {
			String cmd = evt.getActionCommand();
			if (cmd.equals("Datei Öffnen")) {
				setTitle("Es hat geklappt!")
			}			
		}
		repaint();
	
	}
}
 
Original geschrieben von Gayson
Hallo!
Ich habe vor ca. 1 Monat angefangen, ein Buch über Java zu lesen (Java in 21 Tagen).
Nun möchte ich mein erworbenes Wissen (;)) einsetzen, indem ich einen ganz normalen Texteditor bastel, dem ich dann immer mehr Funktionen zufügen möchte.

Zunächst habe ich zwei Probleme:
1. ActionListener: Ich möchte einfach erreichen, dass, wenn ich auf "Datei öfnnen klicke, sich der JFrameTitle ändert. Der Kompiler zeigt keine Fehler an, aber leider klappt das trotzdem nicht...

Sieht eigentlich im Code richtig aus. Bist Du schon mal mit nem Debugger reingesteppt? Das erübrigt oftmals eine Frage hier. ;-)
Ich meine Durchsteppen der actionPerformed()-Methode, was überhaupt bei
String cmd = evt.getActionCommand();
als cmd anliegt, ob diese Stelle erreicht wird usw.
Evtl. schau auch mal, ob evt.getSource() nicht direkt auf j01 abgeprüft werden kann.
Übrigens kann es durchaus sinnvoll sein, jedem MenuItem eine eigene Action oder einen eigenen (anonymen) ActionListener zu hinterlegen, statt die ganze Klasse gleich als ActionListener zu deklarieren.

2. Textfeldgröße: Wenn ich die Applikation ausführe, kommt immer so ein hässlicher Rand. Außerdem verändert sich natülrich auch nicht die TextArea-Größe, wenn ich den JFrame mit der Maus vergrößere (liegt natürlich an den konstanten Werten im TextArea-Konstruktor). Aber wie lege ich die Werte so fest, so die Textfeldgröße immer so groß wie der JFrame ist? Hab JTextArea(getSize().height, getSize().width) ausprobiert, klappt aber natürlich nicht, weil bei getSize Pixelangaben rauskommen, die TextArea möchte aber Angaben für Spalten und Zeilen.

Wäre toll, wenn ihr euch mal den Code anschauen könntet, und mir Lösungsansätze geben könntet.

Mfg
Gayson

So wie ich das sehe, hinterlegst Du dem
JPanel pane = new JPanel();
keinen LayoutManager. Dadurch wird per default FlowLayout benutzt. Für Deine Zwecke solltest Du dem Panel ein BorderLayout spendieren und die ScollPane der pane im CENTER hinterlegen. Was im CENTER liegt z.B. beim BorderLayout und GridBagLayout, wird skaliert, wenn die Framegröße geändert wird. Dann brauchst Du auch keine Größenangaben zu verwenden. Das was im center liegt wird immer aufs Maximum ausgedehnt.
 
Ich konnte beide Probleme lösen, der Tip mit einem Layout-Manager hat mir geholfen.
Nun möchte ich in den Texteditor ein Dateiauswahlfesnter integrieren, doch da taucht schon das nächste Problem auf.
Schaut euch mal bitte den Code nochmal an, irgendetwas muss in der ActionListener-Methode nicht stimmen.

Ich erhalte folgende Fehlermeldung:
C:\Java2\works\Editor.java:79: setText(java.lang.String) in javax.swing.text.JTextComponent cannot be applied to (java.lang.Object)
textfeld.setText(text.get(i-1));

Den Code habe ich teilweise mir selbst überlegt, teilweise übernommen.
Insbesondere das mit der ArrayList habe ich mir selst hinzugefügt, gibt es da vielleicht eine andere Alternative (außer als mit Vektoren)?

Code:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

public class Editor extends JFrame implements ActionListener {

	JTextArea textfeld = new JTextArea(20, 20);

    public Editor() {
        super("Editor");
        setLocation(100,100);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //-----------------Look-And-Feel-Stil-----------------
           try {
            UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName());
                } catch(Exception e) {};

        //-----------------Menü-----------------
        JMenuBar bar = new JMenuBar();

        //Menüeintrag Datei
        JMenuItem j01 = new JMenuItem("Datei Öffnen");
        JMenuItem j02 = new JMenuItem("Datei Speichern");
        JMenu m1 = new JMenu("Datei");
        m1.add(j01);
        m1.add(j02);
        j01.addActionListener(this);
        bar.add(m1);

        //Menüeintrag Hilfe
        JMenuItem j11 = new JMenuItem("Hilfe");
        JMenuItem j12 = new JMenuItem("Info");
        JMenu m2 = new JMenu("Hilfe");
        m2.add(j11);
        m2.add(j12);
        bar.add(m2);

        //-----------------Textfeld-----------------
        JPanel pane = new JPanel(new BorderLayout());
        textfeld.setLineWrap(true);
        textfeld.setWrapStyleWord(true);
        JScrollPane scrollpane = new JScrollPane(textfeld, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        pane.add(scrollpane, BorderLayout.CENTER);

        setJMenuBar(bar);
        setContentPane(pane);
        pack();
        setVisible(true);
    }

    public static void main (String[] arguments) {
        Editor ed= new Editor();
    }

    public void actionPerformed(ActionEvent evt){
        if (evt.getSource() instanceof JMenuItem) {
			JFileChooser auswahl = new JFileChooser();
            String cmd = evt.getActionCommand();
            //Datei öffnen
            if (cmd.equals("Datei Öffnen")) {
				auswahl.showOpenDialog(this);
				String filename = auswahl.getSelectedFile().getPath();
				//Dateiinhalt aus SelectedFile auslesen
				   try {
						FileReader file = new
							FileReader(filename);
						BufferedReader buff = new
							BufferedReader(file);
						boolean eof = false;
						ArrayList text = new ArrayList();
						while (!eof) {
							String line = buff.readLine();
							//wenn am Textende angelangt, Dateiinhalt der Textarea hinzufügen
							if (line == null) {
								for (int i=1; i<text.size(); i++){
									textfeld.setText(text.get(i-1));
								}
								eof = true;
							//wenn noch nicht am Textende angelangt, Dateiinhalt der Arraylist hinzufügen
							} else
								text.add(line);
						}
						buff.close();
					} catch (IOException e) {
						JOptionPane.showMessageDialog(null, "Error -- " + e.toString(),"Error", JOptionPane.ERROR_MESSAGE);
					}
				}
			}

    }
}
 
Original geschrieben von Gayson
Ich konnte beide Probleme lösen, der Tip mit einem Layout-Manager hat mir geholfen.
Nun möchte ich in den Texteditor ein Dateiauswahlfesnter integrieren, doch da taucht schon das nächste Problem auf.
Schaut euch mal bitte den Code nochmal an, irgendetwas muss in der ActionListener-Methode nicht stimmen.

Ich erhalte folgende Fehlermeldung:
C:\Java2\works\Editor.java:79: setText(java.lang.String) in javax.swing.text.JTextComponent cannot be applied to (java.lang.Object)
textfeld.setText(text.get(i-1));

Den Code habe ich teilweise mir selbst überlegt, teilweise übernommen.

text ist bei Dir eine ArrayList, die zunächst einmal Elemente vom Typ Object enthält. D.h. beim Auslesen mit arrayList.get(i); musst Du auf den tatsächlichen Typ casten, um mit dem Element weiter arbeiten zu können. Die Zeile müsste also lauten:

textfeld.setText((String)text.get(i-1));
 
Zurück