Komponente (Frame) in anderer Klasse füllen

Status
Nicht offen für weitere Antworten.

Reinhard

Aktives Mitglied
Hallo,

ich habe eine MainForm.java, dort werden mir alle Komponenten einer Form erstellt. Zusätzlich habe ich einen MouseAdapter:

Code:
public class CMouseAdapter extends MouseAdapter
{
  JTree tree;
  JFrame frame;
  
  public CMouseAdapter(JTree tree, JFrame frame) {
    this.tree = tree;
    this.frame = frame;
  }
  
  @Override
  @SuppressWarnings("boxing")
  public void mouseClicked(MouseEvent me) {

    // Abfrage linke Maustaste (Doppelklick)
    if(me.getButton() == MouseEvent.BUTTON1 & me.getClickCount() == 2) {      
      //frame.getContentPane().getComponent(0). ...
    }
  }

Der MouseAdapter wird in der MainForm.java eingebunden:

Code:
tree.addMouseListener(new CMouseAdapter(tree, frame));

Ich möchte jetzt nachdem ein Doppelklick mit der linken Maustaste auf einen Knoten (Tree) ausgeführt wird z.B. ein JTextField (textField) füllen.

Die Struktur meiner Oberfläche sieht so aus:

frame
- contentPane
---- center - tree
---- east - panel
------ label
------ textField

Bin ich mit folgendem Code auf der richtigen Spur bzw. kann mir jemand helfen in einer Komponente einen Text zu füllen:

Code:
frame.getContentPane().getComponent(0). ...

Oder ist es falsch den Frame an die andere Klasse zu übergeben?

Danke,
Reinhard
 

SamHotte

Top Contributor
Grundsätzlich gibt es viele Wege, aber deine Frage schreit nach einem MVC-Pattern. Such mal hier im Forum das WindController-Beispiel, daran kann man es gut sehen, wie das Zusammenspiel funzt.
 

Reinhard

Aktives Mitglied
Ok hab in der FAQ was dazu gefunden. Ich les mir den Eintrag mal durch. Ich dachte das geht auf die schnelle einfacher :)
 

SamHotte

Top Contributor
Wenn du es einfach willst, übergib einfach deine Referenzen so, wie du sie benötigts. Bei kleineren Progrämmchen kein Problem, es wird nur irgendwann unübersichtlich, und da kann dann so ein Pattern helfen.
 

Reinhard

Aktives Mitglied
Es handelt sich hier eigentlich im Moment nur um ein kleines Programm.

Mir ist aber im Moment nicht klar, was ich als "Referenz" übergeben soll? Ist das dann der Frame oder gleich das JTextField?

Wie oben geschrieben, habe ich ja bereits den Frame übergeben, aber leider komme ich nicht damit klar, wie ich auf die Komponente richtig zugreifen soll.

Danke,
Reinhard
 
G

Gast

Gast
Übergib doch ein Referenz von MainForm an den Adapter und lege in dieser entsprechende Methoden zum Beschreiben an (a la den üblichen getter und setter Methoden)
 

Reinhard

Aktives Mitglied
Hallo,

kann mir jemand ein Beispiel geben für die Übergabe der "MainForm" an eine andere Klasse.
Ich habe das jetzt ne Stunde probiert, aber Swing wirft mir die lustigsten Exceptions.

Außerdem ist mir auch nicht klar, wie ich auf die "MainForm" dann zugreifen kann.

Das ganze schaut bei mir so im groben aus:

Code:
public calss MainForm {
  MainForm window;

  ...

  public static void main(String args[]) {
    window = new MainForm();

    ...

   tree.addMousListener(new CMouseAdapter(window);
  }
}

Ich denke da ist vom Ansatz her noch ein Fehler drin.
Die genaue Exception habe ich leider gerade nicht da.


In CMouseAdapter wollte ich dann etwa so auf die Komponente zugreifen:

Code:
window.panel.textField.setText("text");

Bin für jeden Tip dankbar,
Reinhard
 

Reinhard

Aktives Mitglied
Guten Morgen,

ich habe das ganze jetzt so implementiert:

Code:
public class MainForm
{
  private JTextField textField;
  static MainForm window;

  public static void main(String args[])
  {
  }

  public MainForm()
  {
    try {
      //MainForm window = new MainForm();
      window.frame.setVisible(true);
    } catch (Exception e) {
    }
  }

  private void initialize()
  {    
    frame = new JFrame();

    tree = new JTree(model);
    tree.setCellRenderer(new CCellRenderer());
    tree.addMouseListener(new CMouseAdapter(tree, window));
     
    final JPanel panel = new JPanel();
    panel.setLayout(new FormLayout(
      new ColumnSpec[] {
        FormFactory.RELATED_GAP_COLSPEC,
        new ColumnSpec("96px"),
        FormFactory.RELATED_GAP_COLSPEC,
        new ColumnSpec("11px"),
        FormFactory.DEFAULT_COLSPEC,
        FormFactory.DEFAULT_COLSPEC},
      new RowSpec[] {
        FormFactory.RELATED_GAP_ROWSPEC,
        new RowSpec("19px"),
        FormFactory.RELATED_GAP_ROWSPEC,
        FormFactory.DEFAULT_ROWSPEC}));
    frame.getContentPane().add(panel, BorderLayout.EAST);

    final JLabel selektierterKnotenLabel = new JLabel();
    selektierterKnotenLabel.setText("Selektierter Knoten:");
    panel.add(selektierterKnotenLabel, new CellConstraints("2, 2, 1, 1, fill, center"));

    textField = new JTextField();
    panel.add(textField, new CellConstraints("2, 4, 1, 1, fill, fill"));
  }

  public String getTextField()
  {
    return textField.getText();
  }

  public void setTextField(String aText)
  {
    this.textField.setText(aText);
  }

}


Im "addMouseListener" hab ich das ganze so implementiert:

Code:
public class CMouseAdapter extends MouseAdapter
{
  JTree tree;
  MainForm window;
  
  public CMouseAdapter(JTree tree, MainForm window) {
    this.tree = tree;
    this.window = window;
  }
  
  @Override
  @SuppressWarnings("boxing")
  public void mouseClicked(MouseEvent me) {

    TreePath treepath;
    int lPathCount = 0;

    treepath = tree.getClosestPathForLocation(me.getX(), me.getY());

    if (treepath != null) {
      lPathCount = treepath.getPathCount();
    }     
        
    // Abfrage linke Maustaste (Doppelklick)
    if(me.getButton() == MouseEvent.BUTTON1 & me.getClickCount() == 2) {
      if(lPathCount == AppDefs.gTreeGruppe) {
        // 
        window.setTextField(treepath.getLastPathComponent().toString());
      }
    }
    me.consume();
  }

    private boolean createPopup(String aDesc, int mouseX, int mouseY) {   
    ...    
    return true;
  }
  
}

Folgende Zeile funktioniert aber so leider nicht:
Code:
window.setTextField(treepath.getLastPathComponent().toString());

Ich bekomme dann folgende Exception:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at de.bmw.mox.forms.tree.CMouseAdapter.mouseClicked(CMouseAdapter.java:65)
	at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:212)
	at java.awt.Component.processMouseEvent(Component.java:5491)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
	at java.awt.Component.processEvent(Component.java:5253)
	at java.awt.Container.processEvent(Container.java:1966)
	at java.awt.Component.dispatchEventImpl(Component.java:3955)
	at java.awt.Container.dispatchEventImpl(Container.java:2024)
	at java.awt.Component.dispatchEvent(Component.java:3803)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3901)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
	at java.awt.Container.dispatchEventImpl(Container.java:2010)
	at java.awt.Window.dispatchEventImpl(Window.java:1774)
	at java.awt.Component.dispatchEvent(Component.java:3803)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

Was mache ich denn mit den Getter / Setter Methoden falsch?

Danke,
Reinhard
 

SamHotte

Top Contributor
Als erstes solltest du Konstruktionen wie
Code:
catch (Exception e) {
}
aus deinem Hirn und deinem Code entfernen! Du beraubst dich sämtlicher Debug-Möglichkeiten damit.

Fange die relevanten Exceptions dort auf, wo sie auftreten können, und generiere eine aussagekräftige Fehlermeldung (mit Eclipse kannst du try-catch-Blöcke sehr komfortabel erzeugen lassen).
 

SamHotte

Top Contributor
Zweitens: die getter/setter sind ok, der Fehler lässt sich durch debuggen finden (breakpoint vor der entsprechenden Zeile setzen und schrittweise durch das Programm gehen - du siehst die jeweiligen Werte deiner Variablen dann (in Eclipse oben rechts).

Wenn du dann nichts erkennen kannst, dann löse deine Konstruktion 'treepath.getLastPathComponent().toString());' auf in sowas:
Code:
Object lastPathComponent = treepath.getLastPathComponent();
String s = lastPathComponent.toString();

Damit kannst du im Debugger sehen, wo die NullPointerException genau auftritt.
 

Reinhard

Aktives Mitglied
@SamHotte:

Ich habe die Logging-Funktionalität aus dem Exception-Handling entfernt, um den Code hier im Forum übersichtlicher darzustellen. Bei mir im Programm wird das natürlich geprüft :)
 

Reinhard

Aktives Mitglied
Wenn ich "window" an den CMouseAdapter übergebe, hat es immer den Wert "null". Darum wohl die Exception :)

Code:
  public CMouseAdapter(JTree tree, MainForm window) {
    this.tree = tree;
    this.window = window;
  }

Der MouseAdapter bekommt hier zwei Werte. Bei tree passt alles, diese Werte sehe ich auch im Debugger, aber window ist immer NULL.

Ist die Übergabe evtl. noch zu früh bzw. mir ist eigentlich nicht klar, wann die Übergabe denn dann passieren sollte? :(
 

Reinhard

Aktives Mitglied
Das ganze sieht bei mir so aus. Das initialize() wird im Konstruktor von MainForm aufgerufen:

Code:
public class MainForm
{
  private JTextField textField;
  private JTree tree;
  private MainForm window;
  
  public static void main(String args[])
  {
    Logging.LogInfoMessage("Singletons created");

    try {
      MainForm window = new MainForm();
      window.frame.setVisible(true);
    } catch (Exception e) {
      Logging.LogErrorMessage(e.toString());
    }
  }

  public MainForm()
  {
    initialize();
  }

  private void initialize()
  {    
     
    frame = new JFrame();
    frame.setIconImage(Toolkit.getDefaultToolkit().getImage("./img/Achat_small.gif"));
    frame.setTitle("JDBCTree");
    frame.setBounds(100, 100, 500, 375);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
     
    // ProjektID auf 1 setzen (hier muss die ID z.B. bei einem Auswahldialog übergeben werden)
    int lintProjektID = 1;
    
    try
    {        
      tree = new JTree(model);
      tree.setCellRenderer(new CCellRenderer());
      tree.addMouseListener(new CMouseAdapter(tree, window));
      frame.getContentPane().add(tree, BorderLayout.CENTER);
    }
    catch ( SQLException e )
    {
      Message.ShowErrorMessage(e.toString());
      return;
    }     

    final JPanel panel = new JPanel();
    panel.setLayout(new FormLayout(
      new ColumnSpec[] {
        FormFactory.RELATED_GAP_COLSPEC,
        new ColumnSpec("96px"),
        FormFactory.RELATED_GAP_COLSPEC,
        new ColumnSpec("11px"),
        FormFactory.DEFAULT_COLSPEC,
        FormFactory.DEFAULT_COLSPEC},
      new RowSpec[] {
        FormFactory.RELATED_GAP_ROWSPEC,
        new RowSpec("19px"),
        FormFactory.RELATED_GAP_ROWSPEC,
        FormFactory.DEFAULT_ROWSPEC}));
    frame.getContentPane().add(panel, BorderLayout.EAST);

    final JLabel selektierterKnotenLabel = new JLabel();
    selektierterKnotenLabel.setText("Selektierter Knoten:");
    panel.add(selektierterKnotenLabel, new CellConstraints("2, 2, 1, 1, fill, center"));

    textField = new JTextField();
    panel.add(textField, new CellConstraints("2, 4, 1, 1, fill, fill"));
  }

  public String getTextField()
  {
    return textField.getText();
  }

  public void setTextField(String aText)
  {
    this.textField.setText(aText);
  }

}

Mein Problem ist bestimm nur eine minimale Sache, aber ich komm einfach nicht drauf :(
 

SamHotte

Top Contributor
Dann isses klar - solange der Konstruktor nicht fertig ist, wird das Objekt noch nicht an irgendwen anders übergeben. Daher kann dein Maushörer auch die Referenz nicht auflösen.

Lösungsvorschlag: du hast tree ja schon als Attribut deklariert. Verschiebe den 'tree.addMouseListener(...)' in die main (hinter MainForm ... = new ... ), dann sollte es funzen.
 

Reinhard

Aktives Mitglied
Hast recht, jetzt funktioniert es. Ich muss mir das ganze wohl noch ein bisschen anschauen. Vielen dank für deine geduldige Hilfe.

Schöne Grüße,
Reinhard
 
G

Gast

Gast
Hallo warum benötigt die Klasse MainFrame eine Instanz (window) von sich selbst?

mach doch mal folgendes:

tree.addMouseListener(new CMouseAdapter(tree, this));
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Tom299 JavaFX Ähnliche Komponente wie der VB6 Frame? AWT, Swing, JavaFX & SWT 2
N Swing außerhalb des Hauptframe Komponente/Frame öffnen AWT, Swing, JavaFX & SWT 2
D swt komponente in swing-frame AWT, Swing, JavaFX & SWT 4
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
temi JavaFX "Frames" in JavaFx - passende Komponente? AWT, Swing, JavaFX & SWT 13
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
J Komponente wird manchmal falsch gezeichnet AWT, Swing, JavaFX & SWT 0
R Swing Komponente im JFrame überschreinen sich AWT, Swing, JavaFX & SWT 7
Q-bert Dynamische Komponente erzeugen AWT, Swing, JavaFX & SWT 6
G vorgefertigte Buttons oder neue Komponente mit MouseListener? AWT, Swing, JavaFX & SWT 0
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
M JavaFX Progressbar bar und track Komponente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX Daten an WebView Komponente AWT, Swing, JavaFX & SWT 1
G JPanel komponente Löschen AWT, Swing, JavaFX & SWT 7
T Swing Index für Komponente in JPanel? AWT, Swing, JavaFX & SWT 6
T Swing Größe einer Komponente in einem BoxLayout / FlowLayout festlegen AWT, Swing, JavaFX & SWT 7
G Border der Komponente bei Table CellRenderer überschreiben AWT, Swing, JavaFX & SWT 0
P Warten auf komponente AWT, Swing, JavaFX & SWT 2
U LookAndFeel für eine Komponente AWT, Swing, JavaFX & SWT 2
E Mit Netbeans von einer Form auf eine Komponente einer anderen Form zugreifen AWT, Swing, JavaFX & SWT 2
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
T Komponente wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
S Swing Komponente wird überblendet AWT, Swing, JavaFX & SWT 27
A Swing Komponente mehrseitig ausdrucken AWT, Swing, JavaFX & SWT 2
V Fertige Komponente zum Anzeigen mehrerer Bilder AWT, Swing, JavaFX & SWT 5
B Swing Komponente an Position eines Objektes ausgeben lassen AWT, Swing, JavaFX & SWT 3
R Swing Komponente austauschen AWT, Swing, JavaFX & SWT 2
M JApplet mit Java 3D Komponente AWT, Swing, JavaFX & SWT 6
M Swing JMenu verdeckt durch Komponente (aber kein AWT und Swing mix!?) AWT, Swing, JavaFX & SWT 3
N Swing Java Komponente zur Darstellung von klickbaren Links, die Java Funktionen ausführen können AWT, Swing, JavaFX & SWT 2
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
S Spezielle komponente aktualisieren AWT, Swing, JavaFX & SWT 9
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
1 Swing Spaltenbreite and CellEditor- Komponente anpassen AWT, Swing, JavaFX & SWT 4
R Komponente wieder entfernen AWT, Swing, JavaFX & SWT 13
B Komponente "sauber" entfernen(JToolBar) AWT, Swing, JavaFX & SWT 4
xehpuk Swing Komponente in Graustufen zeichnen AWT, Swing, JavaFX & SWT 2
A Swing GlassPane Cursor wird bei fremder Komponente nicht angezeigt AWT, Swing, JavaFX & SWT 3
darekkay Swing Komponente zur Laufzeit neuinitialisieren AWT, Swing, JavaFX & SWT 6
K Swing Komponente als Bild speichern AWT, Swing, JavaFX & SWT 11
F visuelle Komponente AWT, Swing, JavaFX & SWT 3
padde479 Komponente gesucht AWT, Swing, JavaFX & SWT 2
A Swing Komponente für Swing und JSF durch MVC AWT, Swing, JavaFX & SWT 5
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
A Swing suche OpenSource Date(Time)Picker Komponente AWT, Swing, JavaFX & SWT 9
S Feste Position einer Komponente auf Glasspane AWT, Swing, JavaFX & SWT 6
B Erfragen der Komponente AWT, Swing, JavaFX & SWT 4
M Mausklick an darunterliegende Komponente weiterleiten AWT, Swing, JavaFX & SWT 9
B (Swing) Welche Komponente für unterteilten Text? AWT, Swing, JavaFX & SWT 4
D Wie nennt sich beschriebene Komponente? (-> Autocomplete) AWT, Swing, JavaFX & SWT 5
D Komponente im FlowLayout nicht mittig sondern rechts. Wie? AWT, Swing, JavaFX & SWT 4
G Swing Komponente gesucht (Textfeld mit Liste) AWT, Swing, JavaFX & SWT 2
padde479 Suche eine Komponente (->ToolBar) AWT, Swing, JavaFX & SWT 7
algorismi Browser Komponente AWT, Swing, JavaFX & SWT 3
G Swing Auswahlrechteck über Komponente zeichnen AWT, Swing, JavaFX & SWT 3
0 Swing Drag n' Drop Bug wenn Source und Target gleiche Komponente? AWT, Swing, JavaFX & SWT 4
C Swing Komponente mit setLocation auf JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 3
G Gibt es diese Komponente? AWT, Swing, JavaFX & SWT 11
slawaweis Suche TagCloud Komponente für Swing AWT, Swing, JavaFX & SWT 10
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
M Combobox soll Farbe einer Komponente setzen AWT, Swing, JavaFX & SWT 2
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
hdi SWT Operation auf GUI-Komponente kommt mal wieder nicht an... AWT, Swing, JavaFX & SWT 9
N Suche nach Komponente / LaF AWT, Swing, JavaFX & SWT 21
A Komponente zur Laufzeit hinzufügen und RICHTIG anzeigen AWT, Swing, JavaFX & SWT 3
T Swing Gibt es eine Komponente für eine farbliche Editorbox? AWT, Swing, JavaFX & SWT 6
S Swing Komponente mit jogl AWT, Swing, JavaFX & SWT 18
Airwolf89 Swing Von anderer Klasse auf Eigenschaften einer Komponente zugreifen AWT, Swing, JavaFX & SWT 5
SuperSeppel13 Komponente transparent übermalen AWT, Swing, JavaFX & SWT 2
I Swing Warten, bis eine GUI-Komponente aktualisiert ist? AWT, Swing, JavaFX & SWT 4
R Lineal an einer Komponente AWT, Swing, JavaFX & SWT 10
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
Ham Swing PropertyChangeListener aufrufende Komponente AWT, Swing, JavaFX & SWT 5
hdi LayoutManager GridBagLayout : Komponente hat falsche Größe? AWT, Swing, JavaFX & SWT 2
hdi Swing Suche passende API Klasse(n) für meine Komponente AWT, Swing, JavaFX & SWT 8
Ä Graphics-Komponente auf JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
H Name einer Komponente ermitteln AWT, Swing, JavaFX & SWT 5
Developer_X Swing Problem beim "rezeichnen" -> Überzeichnen der Komponente AWT, Swing, JavaFX & SWT 8
M Suche Java Komponente AWT, Swing, JavaFX & SWT 2
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
B Swing setDefaultButton geht nicht - Komponente fängt Events ab AWT, Swing, JavaFX & SWT 5
A Suche TreeTable-Komponente AWT, Swing, JavaFX & SWT 12
GilbertGrape ActionListener implementieren oder Eigenen für jede Komponente? AWT, Swing, JavaFX & SWT 9
C Spaltenorientierte Komponente, ähnlich JTabbed gesucht AWT, Swing, JavaFX & SWT 4
V Suche Komponente AWT, Swing, JavaFX & SWT 2
G Komponente zur Laufzeit tauschen. AWT, Swing, JavaFX & SWT 5
G Coverflow -artige Komponente für Swing? AWT, Swing, JavaFX & SWT 2
F eigene Swing-Komponente. Drehregler AWT, Swing, JavaFX & SWT 4
Landei Welche Kalender-Komponente? AWT, Swing, JavaFX & SWT 3
G Komponente in der der Cursor steht zurückgeben? AWT, Swing, JavaFX & SWT 2
P Unsichtbare Komponente in ein Bild rendern? AWT, Swing, JavaFX & SWT 11
G Komponente die im Center und North Bereich liegt zurückgebe? AWT, Swing, JavaFX & SWT 6
O Zwei Listener auf Komponente, warten auf Beendigun? AWT, Swing, JavaFX & SWT 2
G Kennt jemand diese Komponente? AWT, Swing, JavaFX & SWT 2
G Palette Komponente für Swing? AWT, Swing, JavaFX & SWT 8
M Name der Komponente? AWT, Swing, JavaFX & SWT 2
G Komponente oben positionieren (BorderLayout) AWT, Swing, JavaFX & SWT 3
ChaosNo1 Problem mit Komponente auf JPanel adden (beides abgeleitet) AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben