Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hmm, was ist denn zu sehen? Garnichts? Wenn ja, woher weisst du dann, ob das Label überhaupt angezeigt wird? Oder vielleicht ist das Label zu klein. Hast du dem Label eine Grösse gegeben oder ist es in einem LayoutManager drin? Oder irgendwas mit der Farbe. Zeig doch mal mehr Code, wie du das JLabel benutzt. Zeilenumbruch in HTML machst du übrigens mit <br>.
Ja, wir haben wohl gleichzeitig geschrieben Dein Posting war vorher noch nicht da.
Ich muss das Fenster zwar mit der Maus aufziehen, aber das mehrzeilige Label sehe ich dann.
Hmm, hast du in deinem Fenster noch andere Elemente, die das JLabel evtl. überdecken? Wo und wie fügst du das JLabel hinzu? Du musst wohl doch noch den ganzen Code (zumindest den Fensteraufbau) zeigen. Übrigens: manche Komponenten in Swing haben einen Standard-LayoutManager, so z.B. der JFrame das BorderLayout und das JPanel das FlowLayout. Wenn du dann nicht setLayout(null) explizit aufrufst, dann nützt dir dein setBounds auch nix.
Indem du einen Layoutmanager verwendest. Gewohn dir den null Layout murks gar nicht erst an, es ist viel mehr Arbeit als einen Layoutmanager zu verwenden denn das ganze setBounds etc. macht alles der Layoutmanager für dich.
nun hab ich einen Layout-Manager verwendet. Aber ich habe ein Problem: Es erscheint kein Text.
Hier mal der/die Codes:
1. Hauptprogramm:
Java:
package packageOne;
import javax.swing.JFrame;
public class Hauptprogramm {
public static void main(String[] args){
JFrame Fenster = new Fenster();
}
}
2. Das Fenster (hab eine eigene Klasse erstellt damit ich öfters aus meinem Hauptprogramm darauf zugreifen kann:
Java:
package packageOne;
import java.awt.FlowLayout;
import javax.swing.JFrame;
public class Fenster extends JFrame{
FlowLayout Layout1;
public Fenster() {
setLayout(Layout1);
setVisible(true);
setSize(650, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setResizable(true);
}
}
3. Ein Panel mit dem Layoutmanager:
Java:
package packageOne;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Layout1 extends JFrame{
JLabel text1;
Layout1(){
super("Matheprogramm");
setLayout (new FlowLayout());
text1 = new JLabel ("Hallo Welt!");
add(text1);
}
}
Der Code ist nach Büchern, Tut's gund eigeninitiative geschrieben, da ich noch Anfänger bin. Vielleicht kann mir ja jemand sagen Wo ich nen Fehler gemacht habe, da Eclipse keine Fehler meldet.
Pinzipiell funktioniert das, allerdings möchte ich das Label gerne in der Layoutklasse definieren, nicht in der Hauptklasse und da hab ich wieder das problem, das es dann iwie nicht funktioniert.
Das ist kein Panel, sondern eine Klasse abgeleitet von JFrame, also eigentlich ein Frame. Änder das doch mal in
Code:
extends JPanel
um und füge es dem JFrame mit add hinzu, und nicht mit setLayout...
Und du hast immer noch bei deinem JFrame das setVisible(true) mittendrin, anstatt erst am Ende. Du musst erst die Komponenten erstellen und dem Frame hinzufügen und dann zum Schluss das setVisible(true) aufrufen.
Hallo Camino, Ich hab mal deinen Code genommen und angepasst.
Meine Frage ist nun, wenn ich ein neues Fenster erzeugen will (ohne das Panel), kann ich dann wieder auf meine Fenster-Klasse zu greifen, oder muß ich mir nen ein neus "Fenster" erstellen?
Nein, normalerweise erstellst du dir nur einmal zu Beginn ein Fenster (JFrame) und das ganze Programm läuft dann dort drin ab. Wenn du innerhalb dem Frame dann etwas anderes anzeigen möchtest, kannst du dort den Inhalt austauschen oder ändern.
ich hab zwar die letzten Kommentare alle nicht gelesen (War mir dann doch zuviel Arbeit ), außer dem Vorletzten, würde dir aber empfehlen der einfach heit halber für alle deine Klassen, die du mehrmals verwenden willst eine sog. Main/Oberklasse zu entwerfen und dir die einzelnen Komponenten aus einer XML zu laden. Sozusagen deine Config.
Falls benötigt, kann ich gerne beispielcode posten, ansonsten sollten dir die auf dieser Seite gelisteten Links weiterhelfen:
würde aber mit meinen Vorstellungen nicht übereinstimmen.
Gut; ich erklär das kurz:
Im "Start"-(oder auch Haupt-)fenster befindet sich
1. der Text (das Panel),
2. ein Eingabefeld,
3. ein Weiter-Button.
Beim Klicken auf den Button soll ein "neues" Fenster oder cas bestehende neu sortiert werden (kein Panel mehr, kein Eingabefeld, nur noch 4 Buttons) erscheinen.
@Andy17:Ja soetwas wäre nicht schlecht, da ich aber grade am Anfang bei Java bin, ist vieles immer noch neuland für mich, bei deinem link werde ich mich bei zeiten durchlesen. Danke Dir.
Beim Klicken auf den Button soll ein "neues" Fenster oder cas bestehende neu sortiert werden (kein Panel mehr, kein Eingabefeld, nur noch 4 Buttons) erscheinen.
Dafür gibt es z.B. die Möglichkeit des CardLayouts, d.h. du erstellst mehrere Panels, fügst sie dem CardLayout hinzu und steuerst dann, welches dieser Panel angezeigt wird. Kann man sich in etwa wie ein Kartenstapel vorstellen, bei dem das oberste Panel zu sehen ist. In deinem Fall wäre das erste Panel mit dem Eingabefeld und das zweite Panel mit den 4 Buttons. Es gibt halt mehrere Möglichkeiten, den Programmablauf zu steuern und das anzuzeigen, was du möchtest. Hängt halt immer davon ab, was du tun willst.
Und bevor du mit dem erstellen deiner Komponenten über XML anfängst, solltest du auf jeden Fall erst mal mit den Swing-Grundlagen (Komponenten, LayoutManager) einigermassen vertraut sein.
Mir scheint, das Java mir da sehr viel Spielraum gewährt. Ich habe ähnliches mal mit VB angefangen und bin schnell an Grenzen gestoßen, was meine Vorstellung angeht. Schließlich habe ich dann aufgegeben. Ich habe so den Verdacht, das dieses mit Jave nicht (oder zumindest nicht so schnell) passieren wird. Naja ich werd erstmal schlafen gehen, unb dann morgen weitermachen. Gute N8!!
An deine Grenzen wirst du so schnell nicht stossen. Du musst dir einfach nur überlegen, was du haben möchtest, und dann lässt sich das mit Java meist irgendwie hinkriegen. Entweder es gibt dafür schon fertige Komponenten oder Lösungen, oder man muss sich das eben so "hinbiegen" wie man es haben will.
So, ich habe es doch etwas anders gemacht. da ich das Panel/Label so wie es grad ist ja nur 1x verwenden möchte, habe ich es auch ins Hauptfenster gepackt. Nun kann ich immer an jeder beliebegen Stelle im Programm ein neues LEERES Fenster erzeugen.
Hauptprogramm:
Java:
package packageOne;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Hauptprogramm {
public static void main(String[] args) {
JFrame Fenster = new Fenster();
Fenster.setLayout(new GridLayout(2,2));
JLabel text1 = new JLabel ("<html>Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt!</html>");
Fenster.add(text1);
Fenster.setSize(650, 500);
Fenster.setVisible(true);
}
}
Fenster:
Java:
package packageOne;
import javax.swing.JFrame;
public class Fenster extends JFrame {
public Fenster() {
setSize(650, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setResizable(true);
setTitle("Matheprogramm");
}
}
Allerdings habe ich nun ein Problem; ich kann das label jetzt nun nicht mehr in Größe oder Position ändern, was ich gerne möchte um es meine Vorstellungen im Fenster anzupassen.
Hey, ich würde dir generell mal einen etwas anderen Programmierstil empfehlen:
Zuerst dein Package-Name (Wie immer)
Dann deine Importe
Dann deine Deklarationen, welche du static halten möchtest
Dann deine Methoden (public static oder protected, je nachdem, was du damit machen möchtest, wo die Methode sichtbar sein soll)
-> In die Methoden die nicht statischen Deklarationen (nur Methodenabhängig)
Dann deine MainMethode
Und dann das Klassenende.
Hier dein "Hauptprogrammcode" umgestellt:
Java:
package packageOne;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Hauptprogramm {
public static JFrame Fenster = new JFrame();
public static JLabel text1 = new JLabel();
public static void Fenster() {
Fenster.setLayout(new GridLayout(2,2));
text1 = new JLabel ("<html>Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt!</html>");
Fenster.add(text1);
Fenster.setSize(650, 500);
Fenster.setVisible(true);
Fenster.setDefaultCloseOperation(Fenster.EXIT_ON_CLOSE);
Fenster.setLocationRelativeTo(null);
Fenster.setResizable(true);
Fenster.setTitle("Matheprogramm");
}
}
public static void main(String[] args) {
Fenster();
}
}
Das wäre dein Programm in Kurzfassung, ohne umständliches Drumherum, in der "richtigen" Reihenfolge.
Wobei man dazu sagen muss, dass es keine "richtige" sondern eher eine übersichtliche Reihenfolge gibt.
Dein Punkt mit dem leeren Fenster erzeugen ( :shock: WTF? ???:L ) ist sinnlos. Ein leeres Fenster kannst du überall erzeugen, du kannst z.B. eines deklarieren und wenn du ein leeres fenster (warum auch immer) willst, immer wieder dasselbe aufrufen. Allerdings ist das total Sinnfrei, wie schon gesagt. Ich würde dir eher empfehlen alles, was der User machen / erleben soll in ZWEI verschiedene Klassen (evtl. auch versch. Packages) zu packen, dort zu deklarieren und initialisieren, sodass alles passt und dann nur TEILE der anderen Klassen / Packages importieren, dann ist dein Programm sozusagen "sicherer". Weiter wäre dann noch eine Klasse / ein Package für deine Konfiguration sinnvoll, jedoch nur, wenn du ein größeres Programm machst. Bei deiner "kleinen" Klasse lohnt sich das nicht wirklich. Empfehlen würde ich dir das im Sinne des Übens trotzdem.
AUßERDEM: WICHTIG: Bevor du dich an den Rechner setzt und loscodest, wäre es ganz gut, dir einmal enige Beispiele anzuschauen und dich nicht sofort in ein Problem zu verrennen. Gerade aufgrund der vielen Möglichkeiten, die Java einem bietet, sollte man sich zuerst LANGSAM rantasten. Sonst führt das zu solchen vermeintlich unnötigen Problemen, wie dem über meinem Post, dass andere User, die dir nur helfen wollen, aufgeben und sich eventuell fragen, warum du nicht vorher einfach mal z.B. Onkel Google fragst o.ä.
Ich hoffe ich bin dir damit nicht zu Nahe getreten, sind nur Tipps, die mir damals leider nicht gegeben wurden, weshalb ich mich anfangs auch etwas doof angestellt habe.
Für ein gutes UI, befolge einfach die o.g. Tipps und da dieses Forum nicht dazu da ist, euch die Arbeit abzunehmen, sondern nur an eurer Seite / zu eurer Hilfe dazusein, bitte Google vorher / frag Freunde oder schau dir via Hotkeys (F3 , F2 u.ä.) die versch. Möglichkeiten an und erst, nachdem du selber überhaupt nichtmehr weiter weißt, Poste etwas.
Ich würde aber trotzdem das setVisible(true) für den Frame am Ende aufrufen, wenn alle Komponenten erstellt sind. Und warum du jetzt das static für die Methode und die Objekte eingebracht hast, weiss ich auch nicht. Auch die Namensgebung ist nicht so toll bzw.verwirrend, z.B. wenn die Methode Fenster heisst, und der Frame auch genauso.
So, ich "Mische" dann auch wieder mit. Habe Mein Programm mal anders gestalltet (nicht unbedingt nach Andy's Style), aber es läuft (fast).
ähm, achso, @Andy: ich google mir schon die Finger wund, und die beste Lösung finde ich besteht aus 1. Videos ( YouTube), 2. Bücher (Gallileo openbooks) und 'last but not least' (3.) Euch im Forum. das ist so in etwa meine Vorgehensweise beim Programmieren, wobei ich viele(!) allgemeine Beispiele bekomme. Doch irgendwann stehe ich halt mal an einer Stelle an der ich selber (auch mit Video und Google) nicht mehr weiterkomme, dann bin ich Dankbar das ich auf erfahrene User Wie Euch zurückkommen kann; und genau jetzt ist es wieder soweit.
Hier mal der Code:
Java:
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class Fenster1 extends JFrame {
public Fenster1() {
JLabel begrüßung;
JLabel nameAusgabe;
JButton weiter;
JButton abbrechen;
JTextField nameEingabe;
setSize(600, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Rechenprogramm");
setLocationRelativeTo(null);
setLayout(null);
setResizable(false);
begrüßung = new JLabel("<html>Hallo,<p><p>Dies ist ein kleines Programm, welches dir hilft " +
"rechnen zu lernen, oder wenn du schon rechnen kannst, es zu verbessern.<p>" +
"wenn du möchtest, schreibe in den Kasten unten am Fensterrand deinen " +
"Namen und klicke mit der linken Maustaste auf den 'Weiter'-knopf. Du" +
"kannst aber auch auf den 'Abbrechen'-knopf klicken, wenn du das Programm beenden möchtest.");
Font Schrift = new Font("Serif", Font.BOLD, 20);
begrüßung.setBounds(20,-89,580,400);
begrüßung.setFont(Schrift);
add(begrüßung);
nameAusgabe = new JLabel("ich");
nameAusgabe.setBounds(20,90,300,400);
nameAusgabe.setFont(Schrift);
add(nameAusgabe);
nameEingabe = new JTextField();
nameEingabe.setBounds(20,312,300,30);
nameEingabe.setFont(Schrift);
add(nameEingabe);
weiter = new JButton("Weiter");
weiter.setBounds(350,300,100,50);
weiter.addActionListener(new WeiterListener());
add(weiter);
abbrechen = new JButton ("Abbrechen");
abbrechen.setBounds(460,300,100,50);
add(abbrechen);
setVisible(true);
}
private class WeiterListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
nameAusgabe.setText("Hallo Du!");
}
}
}
inZeile 66 steckt ein Fehler: nameAusgabe cannot be resolved.
mein programm basiert Hauptsächlich auf Video Tuts, und da taucht kein fehler auf Onkel Google hat leider nicht die erwarteten Lösungen gebracht. Vielleicht könnt ihr mir helfen?
zur Hürde: Mein "Fenster1" schliest nicht, stattdessen kommt 'ne Liste mit zig Fehlern!
hier mal der
Java:
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class Fenster1 extends JFrame {
JLabel begrüßung;
JLabel nameAusgabe;
JButton weiter;
JButton abbrechen;
JTextField nameEingabe;
JFrame Fenster2;
JFrame Fenster1;
public Fenster1() {
setSize(600, 400);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setTitle("Rechenprogramm");
setLocationRelativeTo(null);
setLayout(null);
setResizable(false);
begrüßung = new JLabel("<html>Hallo,<p><p>Dies ist ein kleines Programm, welches dir hilft " +
"rechnen zu lernen, oder wenn du schon rechnen kannst, es zu verbessern.<p>" +
"wenn du möchtest, schreibe in den Kasten unten am Fensterrand deinen " +
"Namen und klicke mit der linken Maustaste auf den 'Weiter'-knopf. Du" +
"kannst aber auch auf den 'Abbrechen'-knopf klicken, wenn du das Programm beenden möchtest.");
Font Schrift = new Font("Serif", Font.BOLD, 20);
begrüßung.setBounds(20,-89,580,400);
begrüßung.setFont(Schrift);
add(begrüßung);
nameAusgabe = new JLabel("ich");
nameAusgabe.setBounds(20,90,300,400);
nameAusgabe.setFont(Schrift);
add(nameAusgabe);
nameEingabe = new JTextField();
nameEingabe.setBounds(20,312,300,30);
nameEingabe.setFont(Schrift);
add(nameEingabe);
weiter = new JButton("Weiter");
weiter.setBounds(350,300,100,50);
weiter.addActionListener(new WeiterListener());
add(weiter);
abbrechen = new JButton ("Abbrechen");
abbrechen.setBounds(460,300,100,50);
add(abbrechen);
setVisible(true);
}
private class WeiterListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
nameAusgabe.setText(nameEingabe.getText());
nameEingabe.setText("");
Fenster2 = new Fenster2();
Fenster2.setVisible(true);
Fenster1.dispose();
}
}
}
und hier mal die Fehlerliste:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Fenster1$WeiterListener.actionPerformed(Fenster1.java:74)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Wenn jemand ne Lösung oder nen Tip hätte wär ich dankbar
???:L
Richtig: Es sagt, du kannst dein Fenster nicht über das ROTE X schließen.
Mit terminate und TaskMgr geht es garantiert dennoch.
Tipp:
Ersetze das o.g. hierduch:
Java:
setDefaultCloseOperation(Frame.EXIT_ON_CLOSE);
Nun solltest du keine Probleme mehr bekommen. :toll:
MFG Andy
öhm, da hast du falsch verstanden, ich meinte das Schließen aus dem Programm heraus: der Klick auf den Button soll bewirken das
1. das Label unten die Zeichen aus dem Textfeld annimmt (klappt),
2. das 1. fenster geschlossen wird (Klappt nicht),
3. ein 2. Fenster aufgeht, (klappte bisher, nun aber auch nicht obwohl ich nichts am Code verändert hab).
damit erzeugst du kein neues Objekt, sondern deklarierst nur eines!
hier mal dein Code ein wenig korrigiert:
Insbesondere die Zeilen
[java=55] weiter.addActionListener(new WeiterListener(this));[/code]
und die geänderete
Code:
WeiterListener
-Klasse solltest du Beachtung schenken.
Fenster2 und die Main-Methode sind halt nur einfach schnell hingeschrieben, damit der Code kompilieren kann...musst du natürlich mit deinem Code austauschen.
[java=65] private class WeiterListener implements ActionListener {
Fenster1 fenster1;
public WeiterListener(Fenster1 fenster1) {
this.fenster1 = fenster1;
}...[/code]
Java:
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class Fenster1 extends JFrame {
public static void main(String[] args) {
new Fenster1();
}
JLabel begrüßung;
JLabel nameAusgabe;
JButton weiter;
JButton abbrechen;
JTextField nameEingabe;
JFrame Fenster2;
//JFrame Fenster1; Das wird nicht benutzt!!!
public Fenster1() {
setSize(600, 400);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setTitle("Rechenprogramm");
setLocationRelativeTo(null);
setLayout(null);
setResizable(false);
begrüßung = new JLabel(
"<html>Hallo,<p><p>Dies ist ein kleines Programm, welches dir hilft "
+ "rechnen zu lernen, oder wenn du schon rechnen kannst, es zu verbessern.<p>"
+ "wenn du möchtest, schreibe in den Kasten unten am Fensterrand deinen "
+ "Namen und klicke mit der linken Maustaste auf den 'Weiter'-knopf. Du"
+ "kannst aber auch auf den 'Abbrechen'-knopf klicken, wenn du das Programm beenden möchtest.");
Font Schrift = new Font("Serif", Font.BOLD, 20);
begrüßung.setBounds(20, -89, 580, 400);
begrüßung.setFont(Schrift);
add(begrüßung);
nameAusgabe = new JLabel("ich");
nameAusgabe.setBounds(20, 90, 300, 400);
nameAusgabe.setFont(Schrift);
add(nameAusgabe);
nameEingabe = new JTextField();
nameEingabe.setBounds(20, 312, 300, 30);
nameEingabe.setFont(Schrift);
add(nameEingabe);
weiter = new JButton("Weiter");
weiter.setBounds(350, 300, 100, 50);
weiter.addActionListener(new WeiterListener(this));
add(weiter);
abbrechen = new JButton("Abbrechen");
abbrechen.setBounds(460, 300, 100, 50);
add(abbrechen);
setVisible(true);
}
private class WeiterListener implements ActionListener {
Fenster1 fenster1;
public WeiterListener(Fenster1 fenster1) {
this.fenster1 = fenster1;
}
@Override
public void actionPerformed(ActionEvent e) {
nameAusgabe.setText(nameEingabe.getText());
nameEingabe.setText("");
Fenster2 = new Fenster2();
Fenster2.setVisible(true);
fenster1.dispose();
}
}
private class Fenster2 extends JFrame {
}
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class MainProgramm {
public class WeiterListener implements ActionListener {
JLabel nameAusgabe;
JButton weiter;
JButton abbrechen;
JTextField nameEingabe;
JFrame Fenster2 = new Fenster2();
JFrame Fenster1 = new Fenster1();
public WeiterListener(Fenster1 Fenster1) {
this.Fenster1 = Fenster1;
}
@Override
public void actionPerformed(ActionEvent e) {
nameAusgabe.setText(nameEingabe.getText());
nameEingabe.setText("");
Fenster2.setVisible(true);
Fenster1.dispose();
}
}
public static void main(String[] args){
}
}
...alle Objekte im 1. Fenster in Fenster1:
Java:
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class Fenster1 extends JFrame {
JLabel begrüßung;
JLabel nameAusgabe;
JButton weiter;
JButton abbrechen;
JTextField nameEingabe;
JFrame Fenster2;
JFrame Fenster1;
public Fenster1() {
setSize(600, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Rechenprogramm");
setLocationRelativeTo(null);
setLayout(null);
setResizable(false);
begrüßung = new JLabel("<html>Hallo,<p><p>Dies ist ein kleines Programm, welches dir hilft " +
"rechnen zu lernen, oder wenn du schon rechnen kannst, es zu verbessern.<p>" +
"Wenn du möchtest, schreibe in den Kasten unten im Fenster deinen " +
"Namen und klicke mit der linken Maustaste auf den 'Weiter'-Knopf. Du" +
"kannst aber auch auf den 'Abbrechen'-Knopf klicken, wenn du das Programm beenden möchtest.");
Font Schrift = new Font("Serif", Font.BOLD, 20);
begrüßung.setBounds(20,-89,580,400);
begrüßung.setFont(Schrift);
add(begrüßung);
nameAusgabe = new JLabel("ich");
nameAusgabe.setBounds(20,90,300,400);
nameAusgabe.setFont(Schrift);
add(nameAusgabe);
nameEingabe = new JTextField();
nameEingabe.setBounds(20,312,300,30);
nameEingabe.setFont(Schrift);
add(nameEingabe);
weiter = new JButton("Weiter");
weiter.setBounds(350,300,100,50);
weiter.addActionListener (new WeiterListener(this));
add(weiter);
abbrechen = new JButton ("Abbrechen");
abbrechen.setBounds(460,300,100,50);
add(abbrechen);
setVisible(true);
}
}
alle Objekte (noch nicht fertig) im 2. Fenster in Fenster2:
Java:
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class Fenster2 extends JFrame {
public Fenster2() {
setSize(600, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Rechenprogramm");
setLocationRelativeTo(null);
setLayout(null);
setResizable(false);
setVisible(true);
}
}
Allerdings hab ich wohl in Fenster1 Zeile 51 folgenden Fehler: WeiterListener cannot be resolved to a type. Google meint, das wohl ein Import fehlt. Welcher denn? Wisst ihr weiter?
Dann hab ich das Problem, das zwar ein 2. Fenster sich öffnet aber nich das Fenster2 das srtört mich wie bekomme ich das nu hin?
Danke für Eure Hilfen.
Dann noch ewas komplett anderes. Soll ich jetzt immer weiter hier im Thread machen, oder soll ich einen neuen mit treffenderer Beschreibung aufmachen? Was meint ihr? Danke für die Antworten!
na evtl. morgen mehr...hier mal ein lauffähiger Code deiner Application, einige bemerkungen stehen im Code:
Java:
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class Fenster1 extends JFrame {
public static void main(String[] args) {
new Fenster1();
}
JLabel begrüßung;
JLabel nameAusgabe;
JButton weiter;
JButton abbrechen;
JTextField nameEingabe;
JFrame Fenster2;
// JFrame Fenster1; Das wird nicht benutzt!!!
public Fenster1() {
setSize(600, 400);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setTitle("Rechenprogramm");
setLocationRelativeTo(null);
setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
begrüßung = new JLabel(
"<html>Hallo,<p><p>Dies ist ein kleines Programm, welches dir hilft "
+ "rechnen zu lernen, oder wenn du schon rechnen kannst, es zu verbessern.<p>"
+ "wenn du möchtest, schreibe in den Kasten unten am Fensterrand deinen "
+ "Namen und klicke mit der linken Maustaste auf den 'Weiter'-knopf. Du"
+ "kannst aber auch auf den 'Abbrechen'-knopf klicken, wenn du das Programm beenden möchtest.");
Font Schrift = new Font("Serif", Font.BOLD, 20);
begrüßung.setBounds(20, -89, 580, 400);
begrüßung.setFont(Schrift);
add(begrüßung);
nameAusgabe = new JLabel("ich");
nameAusgabe.setBounds(20, 90, 300, 400);
nameAusgabe.setFont(Schrift);
add(nameAusgabe);
nameEingabe = new JTextField();
nameEingabe.setBounds(20, 312, 300, 30);
nameEingabe.setFont(Schrift);
add(nameEingabe);
weiter = new JButton("Weiter");
weiter.setBounds(350, 300, 100, 50);
weiter.addActionListener(new WeiterListener(this));
add(weiter);
abbrechen = new JButton("Abbrechen");
abbrechen.setBounds(460, 300, 100, 50);
add(abbrechen);
setVisible(true);
}
}
class Fenster2 extends JFrame {
public Fenster2() {
setSize(600, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Rechenprogramm");
setLocationRelativeTo(null);
setLayout(null);
setResizable(false);
setVisible(true);
}
}
class WeiterListener implements ActionListener {
// JLabel nameAusgabe; wie sollen dieses Variablen einen Wert bekommen????
// JButton weiter;
// JButton abbrechen;
// JTextField nameEingabe;
Fenster2 fenster2; // wenn dann ist das vom Typ Fenster 2
Fenster1 fenster1;
public WeiterListener(Fenster1 Fenster1) {
this.fenster1 = Fenster1;
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(123);
fenster1.nameAusgabe.setText(fenster1.nameEingabe.getText());
fenster1.nameEingabe.setText("");
fenster2 = new Fenster2();
fenster2.setVisible(true);
fenster1.dispose();
}
}
Hallo jgh,
Danke erstmal,
als warscheinlich erfahrener Java-programmierer wirst du wohl nur kopfschüttelnd über meinem Code gesessen haben.
Naja bin ja auch noch nen Java-"Kleinkind". Aber ich werde "älter".Habe mir mal das Videomaterial der Uni Aachen angeeignet, und es ist zihemlich gut. Aber jetzt zu deinem Code-Beispiel.
So wie ich das sehe habe ich für alles nur noch 1 Fenster in welchem der Code kommt.
Ich habe soetwas mla in VB angefangen, und dieser Code wäre in VB das reinste Chaos, dort wir alle möglich in eigene Klassen verpackt und fast jedes "Teil" auf der GUI bekommt sein eignenes Codefenster, ist das hier nicht? Dann muß ich mich wieder umgewöhnen. Denn ich war ja im begriff für (wenigstens) meine Fenster eigene Klassencodefenster zu erstellen damit der GesamtCode nicht so Lang und unübersichtlich wird.
ach ja 2 Dinge noch
1. Das System.out.println(123); in Zeile 100 ist doch völlig überflüssig. feif:
2. Wenn ich das so ausführe habe ich ein leeres 2. Fenster, also JLabel name Ausgabe ins 2 Frame gepackt, Alles angepasst, keine Fehler, Programmstart, Name eingegeben,Button geklickt und nicht geht mehr ;(
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at WeiterListener.actionPerformed(Hauptfenster.java:100)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Java:
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class Hauptfenster extends JFrame {
public static void main(String[] args) { //Programm begin mit dem 1.Fenster (Hauptfenster).
new Hauptfenster();
}
JLabel begrüßung;
JButton weiter;
JButton abbrechen;
JTextField nameEingabe;
JFrame Fenster2;
public Hauptfenster() {
setSize(600, 400);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setTitle("Rechenprogramm");
setLocationRelativeTo(null);
setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
begrüßung = new JLabel( //Begrüßungslabel, Hier liest der user um was es geht.
"<html>Hallo,<p><p>Dies ist ein kleines Programm, welches dir hilft "
+ "rechnen zu lernen, oder wenn du schon rechnen kannst, es zu verbessern.<p>"
+ "wenn du möchtest, schreibe in den Kasten unten am Fensterrand deinen "
+ "Namen und klicke mit der linken Maustaste auf den 'Weiter'-knopf. Du"
+ "kannst aber auch auf den 'Abbrechen'-knopf klicken, wenn du das Programm beenden möchtest.");
Font Schrift = new Font("Serif", Font.BOLD, 20);
begrüßung.setBounds(20, -89, 580, 400);
begrüßung.setFont(Schrift);
add(begrüßung);
nameEingabe = new JTextField(); //Hier soll der User seinennamen eingeben der auf allen folgenden Frames immer steht (Bsp: Hallo:xxx)
nameEingabe.setBounds(20, 312, 300, 30);
nameEingabe.setFont(Schrift);
add(nameEingabe);
weiter = new JButton("Weiter"); //Der knopf um weiter zu kommen
weiter.setBounds(350, 300, 100, 50);
weiter.addActionListener(new WeiterListener(this));
add(weiter);
abbrechen = new JButton("Abbrechen"); //DerKnopf zum Abbrechen des Programms
abbrechen.setBounds(460, 300, 100, 50);
add(abbrechen);
setVisible(true);
}
}
class Fenster2 extends JFrame {
JLabel nameAusgabe;
public Fenster2() { //Neues Fenster
setSize(600, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Rechenprogramm");
setLocationRelativeTo(null);
setLayout(null);
setResizable(false);
nameAusgabe = new JLabel("Hallo"); //hier (sollte stehen) steht der Name der im ersten Fenster eingegeben wurde
Font Schrift = new Font("Serif", Font.BOLD, 20);
nameAusgabe.setBounds(20, 90, 300, 400);
nameAusgabe.setFont(Schrift);
add(nameAusgabe);
setVisible(true);
}
}
class WeiterListener implements ActionListener {
Fenster2 fenster2;
Hauptfenster fenster1;
public WeiterListener(Hauptfenster Fenster1) {
this.fenster1 = Fenster1;
}
@Override
public void actionPerformed(ActionEvent e) {
fenster1.nameEingabe.setText("");
fenster2.nameAusgabe.setText(fenster1.nameEingabe.getText());
new Fenster2();
fenster1.dispose();
}
}
^^ aber evtl. kannst du mich mal aufklären, was du hier machen willst:
Java:
public class MainProgramm {
public class WeiterListener implements ActionListener {
wozu dieses Konstrukt...wenn ich ehrlich bin, war ich sogar überrascht, dass sowas kompiliert...
grundsätzlich sollte das hier auch so sein...wenn du allerdings Fragen hast, oder Hilfe brauchst, lässt sich das weitaus einfacher erledigen, wenn alles in einer Datei steht. Für dein Projekt solltest du die Klassen einzeln in Dateien und Packages speichern. Hier im Forum ist ein KSKB das einfachste...
Wenn du eine Klasse WeiterListener hast, dann kannst du da zwar Labels, Textfields usw. deklarieren...solange du sie initialisierst wirst du beim Zugriff auf diese Elemente immer eine NPE bekommen.
Was du eigentlich willst, sind die Komponenten deines Frames...und die holst du dir, indem du bspw. eine Instanz deines Fensters an die WeiterListener-Klasse übergibst.