PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java - Textfeld nicht ansprechbar - getText()


Micha80
2006-09-24, 19:47:01
Problem: Eine kleine GUI mit Textfeld das nach Klick auf den OK Button den Text aus dem Textfeld ausgeben soll.

In 'public void actionPerformed(ActionEvent event)' wird das Objekt (Textfeld) txtPort aber nicht mehr gefunden.

import java.awt.event.*;
import java.awt.*;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.*;

public class PTBTime extends JFrame implements ActionListener {

private static final long serialVersionUID = 1L;

public PTBTime() { //Konstruktor
super("DayTime");
//Panel mit URL & PORT hinzufügen
JPanel panURL = new JPanel();
JLabel lblURL = new JLabel("URL:", SwingConstants.LEFT);
panURL.add(lblURL);
JTextField txtURL = new JTextField(30);
txtURL.addActionListener(this);
txtURL.setToolTipText("Geben Sie einen Servernamen ein");
panURL.add(txtURL);

JLabel lblPort = new JLabel("Port:", SwingConstants.LEFT);
panURL.add(lblPort);
JTextField txtPort = new JTextField(10);
txtPort.addActionListener(this);
txtPort.setToolTipText("Geben Sie einen PORT an");
panURL.add(txtPort);

panURL.setBorder(BorderFactory.createEtchedBorder());
getContentPane().add(panURL, BorderLayout.NORTH);

//'Ausgabe' Textfeld
JPanel panDayTime = new JPanel();
JLabel lblDayTime = new JLabel("DayTime:", SwingConstants.LEFT);
panDayTime.add(lblDayTime);
JTextField txtDayTime = new JTextField(30);
txtDayTime.setToolTipText("Geben Sie einen Servernamen ein");
panDayTime.add(txtDayTime);

panDayTime.setBorder(BorderFactory.createEtchedBorder());
getContentPane().add(panDayTime, BorderLayout.CENTER);

JPanel buttonPanel = new JPanel();
JButton btnOK = new JButton("OK");
btnOK.addActionListener(this);
buttonPanel.add(btnOK);

buttonPanel.setBorder(BorderFactory.createEtchedBorder());
getContentPane().add(buttonPanel, BorderLayout.SOUTH);
//Windows-Listener
//addWindowListener(new WindowClosingAdapter(true));
}

public void actionPerformed(ActionEvent event) {
String cmd = event.getActionCommand();

if (cmd.equals("OK")) {
System.out.println(txtPort.getText());
}
}
}

Eclipse 3.2 + Java 4.12

Monger
2006-09-24, 19:55:10
Du deklarierst deine Variable innerhalb deines Konstruktors, und damit ist sie auch nur innerhalb des Konstruktors sichtbar.

Du hast jetzt zwei Möglichkeiten: entweder du bringst deinen ActionListener in den Konstruktor mit rein (d.h. als anonyme Klasse verwenden und die Variable als final deklarieren), oder - wahrscheinlich einfacher - du deklarierst dein Textfeld als Attribut innerhalb der Klasse - dann ist es nämlich auch überall in der Klasse erreichbar.

Micha80
2006-09-24, 20:16:02
Danke. In der Klasse steht jetzt zusätzlich 'public JTextField txtPort;'. Das Textfeld wurde auch gefunden. Allerdings bekomme ich einen Haufen Fehlermeldungen.

Beim Debugen fällt auf das txtPort = null ist obwohl ein Wert in das Textfeld eingegeben wurde.

at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$ForwardActionEvents.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 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.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(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)

Monger
2006-09-24, 20:53:59
Hast du jetzt stattdessen die Deklaration im Konstruktor entfernt?

Sonst deklarierst du nämlich einerseits ein JTextField Attribut, und einmal eine JTextfield Variable - und nur eine davon ist auch initialisiert.

Micha80
2006-09-25, 08:57:35
OK ich habe jetzt this verwendet um auf die Klassenvariable zuzugreifen.

Kannst du mir ein paar Tips geben wie ich relativ schnell Java lernen kann? Bin gestern eingestiegen. Ich mache viel mit VB und noch etwas C/C++.

Negativ an Java ist für mich:
- große Wortschatz
- wenig intuitiv
- viele Zeilen Code im Verhältniss zu anderen Prog. Sprachen

Monger
2006-09-25, 09:40:47
Äh... großer Wortschatz im Vergleich zu C++ ? :|
Die C++ Veteranen beschweren sich ja gerade, dass Java featuremäßig verkrüppelt ist. Die vermissen ihre 5 unterschiedlichen Casts die sie machen können...

Das erste was du verstehen solltest, ist dass Java etwas GANZ anderes als C++ und VB ist. Sieht zwar syntaktisch ähnlich aus, reagiert aber an vielen Stellen ganz anders.

Die Sun Java Tutorials sind imho sehr gut. Vorallem sehr flächendeckend, weil da vom blutigen Anfänger bis zum alten Hasen sich jeder die Kapitel raussuchen kann die ihn wirklich betreffen.

Java ist imho keine Sprache, auf die man mal so eben umsteigt. Wenn du von C#, Python, Ruby oder den anderen modernen Sprachen auf Java umlernen würdest, wäre das kein Thema. Aber gerade C++ und VB sind doch ein gutes Stück weit von Java entfernt.