JAVA AWT Fragen und Probleme

Doc

Aktives Mitglied
Hallo,
ich arbeite mich gerade in AWT ein und habe noch einige Probleme.

Ich möchte in einer Klasse alle meine Fensterelemente und Button-Aktionen haben (ích hoffe das ist möglich). Die Klasse möchte ich dann im Hauptprogramm mit
Fenster f = new Fenster();
aufrufen.

Ich habe im wesentlichen 2 Textfelder und einen Button. Ich möchte nun bei Druck auf den Knopf, dass die Inhalte der Textfelder in 2 Strings eingelesen werden. Danach möchte ich noch eine Funktion ausführen (vorerst nicht wichtig).

Bisher hab ich folgendes gemacht:

Java:
import java.awt.*;
import java.awt.event.*;

public class Fenster extends Frame {
	
	public Fenster(){

		//Knopfdruck Aktionen
		class Knopfdruck implements ActionListener{
			public void actionPerformed(ActionEvent e){
				
				//Hier möchte ich nach der Eingabe des Textes in die 2 Textfelder,
				//den Text in 2 Strings schreiben.
				
				//Danach möchte ich noch eine Funktion aufrufen.
				
			}
		}
		
	
		//Fenstername
		this.setTitle("Name des Programms");
		//Fenstergröße
		this.setSize(800, 600);
		
		//Fenster zentrieren
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		this.setLocation((d.width-this.getSize().width) / 2,
						 (d.height-this.getSize().height) / 2 );
	
		//Fenster Schliessen
		addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		
		
		//WindowListener, um auf WindowEvents reagieren zu können
		addWindowListener(new MeinWindowListener());
		
		//Action Listener, der nur auf Knopfdruck reagiert
		ActionListener aktion = new Knopfdruck();	

		
		
		//Fenster-Elemente
		setLayout(new FlowLayout());
		
		TextField textfeld1;
		textfeld1 = new TextField(12);		
		add(textfeld1);
		
		TextField textfeld2;
		textfeld2 = new TextField(12);		
		add(textfeld2);
		
		Button button1;
		button1 = new Button("Button 1");
		add(button1);
		button1.addActionListener(aktion);		
		button1.setActionCommand("b1");
			

		setVisible(true);
	}
}

Ist der Aufbau bisher richtig?
Wie kann ich den eingegebenen Text in den Textfeldern in Strings schreiben?
Später würde ich gerne noch eine größeren Text in einem großen Textfeld in das Fenster einbauen. Wie mach ich das? Die TextFields geben einem ja nur die Möglichkeit einer Längenangabe. Ich hätte allerdings gern ein größeres Feld um ganze Text auszugeben.

Ich fühle mich sehr unsicher im Umgang mit AWT, wenn also irgendwelche sinnlosen Dinge zu finden sind, würde ich mich über Tipps freuen.

Danke für eure Hilfe und Zeit.

Grüße,
Doc
 
Zuletzt bearbeitet:
Erstmal vorneweg: Du solltest dir überlegen, gleich mit Swing anzufangen. AWT ist eigentlich "veraltet", und Swing ist mit Trail: Creating a GUI With JFC/Swing (The Java™ Tutorials) so ausführlich und exzellent dokumentiert, dass es sich wirklich anbietet. Wenn du gerade erst mit AWT angefangen hast, brauchst du jetzt aber nicht zu denken: "Öööhi, jetz' kann ich alles wieder löschen oder was?" 😉 : Bisher würde eine Umstellung auf Swing in erster Linie bedeuten, vor die ganzen Component-Namen (Frame, Button, Textfield) ein "J" zu schreiben: (JFrame, JButton, JTextField)

ALLE Aktionen von einer Klasse abhandeln zu lassen geht zwar und ist auch nicht "falsch", kann aber schnell unübersichtlich werden, wenn man mehr Components hat. Du solltest dir erstmal eine sinnvolle aufteilung deines Programms überlegen, d.h. was soll wie gehen, welche Gruppen von Components gehören zusammen und können in einer Klasse zusammengefasst werden usw.

Wie kann ich den eingegebenen Text in den Textfeldern in Strings schreiben?
Code:
public class Fenster extends Frame {
    
    private TextField textFieldMitEinemPassendenNamen;

    public Fenster(){
 
...
        textFieldMitEinemPassendenNamen= new TextField(12);      
        add(textFieldMitEinemPassendenNamen);

    }


    void woanders()
    {
        String s = textFieldMitEinemPassendenNamen.getText();
    }

}

Später würde ich gerne noch eine größeren Text in einem großen Textfeld in das Fenster einbauen. Wie mach ich das?

Es gibt noch TextArea (bzw. JTextArea in Swing)
 
Also ich hab mir mal Swing angeschaut, aber das verwirrt mich jetzt zu sehr :-( Daher werde ich wohl vorerst weiter mit AWT weiterarbeiten. Ich hab mir viele Beispiele angesehen und auch selbst schon einiges probiert aber irgendwie klappt es nicht :-(
Das was ich bisher mit dem ActionListener und dem ActionEvent gemacht habe leuchtet mir irgendwie nicht ein. Daher hab ich es jetzt mal aus dem Code entfernt. Vielleicht kann mir das jemand erklären, falls es nicht zu aufwändig ist :-(

Vielleicht könnte mir jemand den Code schreiben, der bei mir fehlt. Ich bekomm das mit den Buttons und den Aktionen leider nicht hin. Ich hoffe das ist nicht sehr aufwändig.

Also bisher habe ich die Elemente in das Fenster eingefügt und ich kann das Fenster schliessen:

Java:
import java.awt.*;
import java.awt.event.*;

public class Fenster extends Frame {
	
	public Fenster(){
		
		//Fenstername
		this.setTitle("Name des Programms");
		//Fenstergröße
		this.setSize(800, 600);
		
		//zentriere das Fenster
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		this.setLocation((d.width-this.getSize().width) / 2,
						 (d.height-this.getSize().height) / 2 );
	
		//Fenster Schliessen
		addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		
			
		//Fenster-Elemente
		setLayout(new FlowLayout());
		
		TextField textfeld1;
		textfeld1 = new TextField(12);		
		add(textfeld1);
				
		TextField textfeld2;
		textfeld2 = new TextField(12);		
		add(textfeld2);
		
		
		Button button1;
		button1 = new Button("Suche Starten");
		add(button1);

		//Ich möchte nun einen Knopf bei dem folgende beiden Aktionen ausgeführt werden
		String s1 = textfeld1.getText();
		String s2 = textfeld2.getText();
	
		

		setVisible(true);
	}
}

Ich probier jetzt seit Tagen damit rum, aber bekomms nicht gebacken. Ich steh irgendwie auf dem Schlauch.
Mir fehlt also die Aktion auf dem Button und eine Funktion mit der ich dann die Button-Funktionen ausführen kann.

Wäre es sehr aufwendig mir den Code zu erklären/geben? Es handelt sich ja nur um eine Aktion auf einem Button.

Danke schonmal im voraus.
 
Zuletzt bearbeitet:
Danke euch. Dann werde ich mir das wohl doch anschauen.
Könnte mir bitte jemand erklären wie ich mit Swing einen Button erstelle und Aktionen darauflegen kann?
Die ganze Sache mit den WindowListenern leuchtet mir nicht ein :-(
 
Zuletzt bearbeitet:
Java:
JFrame frame = new JFrame(); //das fenster erstellen
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );//das programm wirdt beim schießen der fensters beendet 

final JButton button1 = new JButton("klick mich" ); //button erzeugen
frame.add( button1 ); //den button zum fenster hinzufügen
 
button1.addActionListener( new ActionListener() { //den ActionListener an den button dranhängen
  @Override public void actionPerformed( ActionEvent e ) { 
    System.out.println("ich wurde geklickt");//hier drin steht was beim klicken des buttons gemacht wird
  } 
} ); 
 
frame.pack(); //ausrichten
frame.setVisible( true );//fenster sichtbar machen
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 16.6 Schaltflächen
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 16.6 Schaltflächen

den ActionListener kann man sich so vorstellen:
stell dir vor, dein ganzes programm besteht aus personen.
jede hat eine andere aufgabe, eine überlegt sich wie die komponenten in deinem fenster anzuordnen sind und eine andere zeit diese komponenten an.
dann gibt es auch noch eine person, die extra auf deinen Button aufpasst, den ActionListener
diese person sitzt immer nur in der ecke und wartet darauf das ihr button gedrückt wird.
wenn das nun passiert dann führst sie bestimmten code aus, in diesem fall das System.out.println()
 
Zuletzt bearbeitet:
So, ich bins nochmal 🙂
Mein Programm tut was es soll. Jetzt fehlt mir noch eine Kleinigkeit.

Ich würde gerne einen String in eine Textarea schreiben, und möchte Teile des Strings farbig ausgeben. Ich denke das teilweise Auslesen sollte mit
substring(int beginIndex, int endIndex)
funktionieren.
Ich würde nun gern manche Substrings bei der Ausgabe einfärben.
Geht das mit einer TextArea in Swing. Oder geht das überhaupt?
 
Wenn Sie editierbaren Text in Java darstellen möchten, haben Sie mehrere Möglichkeiten. Sie können bspw. eine JTextArea oder ein JTextField verwenden und simple Formatierungen daran vornehmen, die das komplette Textfeld betreffen (bspw. die Hintergrundfarbe oder Schrift verändern). Sollen sich bestimmte Textabschnitte voneinander unterscheiden, haben Sie zuerst einmal ein Problem, weil das mit einer JTextArea oder einem JTextField nicht funktioniert. Eine Alternative wäre es, HTML in einem JEditorPane darzustellen. Die Editierbarkeit ist in diesem Fall jedoch stark eingeschränkt. Es gibt noch eine weitere Möglichkeit: Sie können ein javax.swing.JTextPane mit einem eigenen javax.swing.text.StyledDocument versehen
(Java Blog Buch : D) Formatierte Texteingabe)

EDIT:
Java:
	public static void main(String[] args) throws Exception {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame frame = new JFrame();
				JPanel panel = new JPanel();
				final StyledDocument doc = new DefaultStyledDocument();
				final SimpleAttributeSet sas = new SimpleAttributeSet();
				StyleConstants.setForeground(sas, Color.RED); //färben aktivieren
				StyleConstants.setUnderline(sas, true); //unterstreichen aktivieren
				JTextPane text = new JTextPane(doc);
				text.setText("Dass ist ein Täst");
				JButton check = new JButton("spell check");
				check.addActionListener(new ActionListener() {
					@Override
					public void actionPerformed(ActionEvent e) {
						doc.setCharacterAttributes(3, 1, sas, false);
						doc.setCharacterAttributes(14, 1, sas, false);
					}
				});
				panel.add(text);
				panel.add(check);
				frame.add(panel);
				frame.pack();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setLocationRelativeTo(null);
				frame.setVisible(true);
			}
		});
	}
 
Zuletzt bearbeitet:
du musst den ansatz auf alle fälle mal bei der Font und der Color-klasse(bevor du fragst: color ist zwar in java.awt, aber trotzdem das richtige 🙂) versuchen.
ob es speziell in TextAreas geht weiß ich nicht...edit: ok, geht nicht 😉
in JLabels gehts, würde das auch reichen?
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 17.5 Das Innere und Äußere einer Form
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 17.3 Zeichenketten schreiben und Fonts
edit: zu langsam 😉
 
Hab was gefunden, wie man Highlights in einer TextArea macht. Also eigentlich genau was ich brauche.

Highlighting Words in a JTextComponent | Example Depot

Für unterschiedliche Highlights braucht man ein TextPane.
Wie das mit den Styles funktionieren soll, ist mir allerdings nicht so ganz klar.

EDIT:
If many different highlight styles are required, it is necessary to use styles with a JTextPane. See Setting the Font and Color of Text in a JTextPane Using Styles for more details.

Das hatte ich wohl falsch verstanden. Damit ist wohl nur der Stil gemeint. Also sollten mehrere Suchwörter im gleichen Stil funktionieren.
 
Zuletzt bearbeitet:
Hm. Für "formatierten" Text reicht eine JTextArea AFAIK nicht. Und ganz nebenbei: Dafür würdest du mit AWT auf Granit beißen 😀 Das kann schon ein bißen aufwändiger werden, je nachdem, was das Ziel ist. Wirklich intensiv und ausführlich habe ich mich damit auch noch nicht auseinandergesetzt. Als Einstieg würde ich (unabhängig vom eigentlichen Programm) mal die Beispiele auf How to Use Editor Panes and Text Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components) ansehen, und ein bißchen damit rumspielen, um ein Gefühl dafür zu bekommen, was wie geht...
 
Eigentlich klappts, wie ich möchte. Das highlighten ist für meine Ansprüche ausreichend.

Nur eine Sache macht Probleme.

Was genau macht "substring" ???

Immer wenn ich das benutzte spinnt mein Programm.
 
mittlerweile tuts jetzt doch. ganz merkwürdig.

ich hab auch gerade das problem, dass ich alle meine class-dateien löschen muss, um neu kompilieren zu können. echt ne komische sache.

irgendwelche tipps? 🙁

ich bekomm komische warnungen und ich soll mit -Xlint neu kompilieren. vielleicht hat es damit was zu tun. ich bin da relativ hilflos :-(
 
Zuletzt bearbeitet:
Jetzt muss ich doch nochmal etwas fragen 🙂

Hier hab ich mir angeschaut, wie man in einer TextArea highlightet.

Highlighting Words in a JTextComponent | Example Depot

Tut auch wunderbar.

Nur jetzt will ichs doch mit unterschiedlichen Styles versuchen. Dazu brauche ich ein TextPane.

Es wird ja verwiesen auf eine andere Seite:

If many different highlight styles are required, it is necessary to use styles with a JTextPane. See Setting the Font and Color of Text in a JTextPane Using Styles | Example Depot for more details.

Allerdings versteh ich nicht, wie das genau funktionieren soll :-(
Ich vermute mal man muss Styles erstellen, und diese dann dem entsprechenden Highlight hinzufügen.
Aber wie genau? Meine Versuche sind bisher leider nicht von Erfolg gekrönt.

Bisher habe ich ein Textpane erstellt und zwei Stile erstellt, ich hoffe richtig:

Java:
		//TextPane erstellen
		final JTextPane textPane = new JTextPane();
		frame.add(new JScrollPane( textPane )); 
		StyledDocument doc = textPane.getStyledDocument(); 

		// Stil Rot
		Style styleRot = textPane.addStyle("Red", null);
		StyleConstants.setForeground(styleRot, Color.red); 

		//Stil Unterstrichen
		Style styleUnderline = textPane.addStyle("Underline", null);
		StyleConstants.setUnderline(styleUnderline, true);

Kann mir vielleicht jemand erklären wie das Highlighten mit den Styles im TextPane funktioniert?

Danke schonmal im Voraus.
 
Zuletzt bearbeitet:

Zurück
Oben