Inerhalb der [void main] auf ein Objekt der [protected void] zugreifen

Status
Nicht offen für weitere Antworten.

badfish

Mitglied
Hallo zusammen,

ich schaffe es leider nicht inerhalb der main "public static void main(String[] args) {" auf ein Objekt (ein jLabel) in der "protected void startup() {" zuzugreifen.
Was ich machen möchte? Ich möchte in einer Schleife der main auf das jLabel1 zugreifen und .setText verändern. Das Problem ist nur, dass ich von der main aus nicht darauf zugreifen kann. Auch einen Setter habe ich nicht hinbekommen.
Könnt ihr mir helfen?

Hier mein bisheriger Quelltext:
Java:
import javax.swing.JComponent;
import javax.swing.JLabel;

import javax.swing.JPanel;

import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.layout.GroupLayout;
import org.jdesktop.layout.LayoutStyle;



public class Countdown extends SingleFrameApplication {
    private JPanel topPanel;
    public JLabel jLabel1;

    @Override
    protected void startup() {
        topPanel = new JPanel();
        GroupLayout topPanelLayout = new GroupLayout((JComponent)topPanel);
        topPanel.setLayout(topPanelLayout);
        topPanel.setPreferredSize(new java.awt.Dimension(500, 300));
        {
        	jLabel1 = new JLabel();
        	jLabel1.setName("jLabel1");
        }
        topPanelLayout.setVerticalGroup(topPanelLayout.createSequentialGroup()
        	.addContainerGap(109, 109)
        	.add(jLabel1, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE)
        	.addContainerGap(107, Short.MAX_VALUE));
        topPanelLayout.setHorizontalGroup(topPanelLayout.createSequentialGroup()
        	.addContainerGap(129, 129)
        	.add(jLabel1, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE)
        	.addContainerGap(140, Short.MAX_VALUE));
        show(topPanel);
    }

        
    public static void main(String[] args) {
        launch(Countdown.class, args);
        
      
    }

}

Vielen Dank.
Grüße, badfish
 
Naja ich will aus der main heraus den Befehl jLabel1.setText("Mein Text"); aufrufen, jedoch geht das nicht. Ich verwende Eclipse, und das Programm hat mir schon vorschlagen automatisch eine statis daraus zu machen. Gesagt getan geht das ganze Programm aber zur Laufzeit hoch.

Veränderungen:
Java:
public class Countdown extends SingleFrameApplication {
    private JPanel topPanel;
    public static JLabel jLabel1;

Java:
 public static void main(String[] args) {
        launch(Countdown.class, args);
        
        jLabel1.setText("Helloh!");
        
    }

Und die Fehlermeldung:
Exception in thread "main" java.lang.NullPointerException
at Countdown.main(Countdown.java:55)
 
warum sollte es nicht null sein,
wird startup() je ausgeführt?

durch ein einfaches

protected void startup() {
System.out.println("Code kommt dran");
..
}

zu testen
 
Ja also startup() wird ausgeführt. Alle Panels und Labels werden ja auch erstellt und angezeigt. Ich weiß aber auch nicht wo bzw. wie startup() aufgerufen wird.
 
vielleicht passiert es zeitversetzt später, mit der Ausgabe bekommst du die Information, ob der Code ausgeführt wurde,
wenn du vor der Exception keinen Text siehts, dann war war da wohl nix,

baue testweise
Thread.sleep(2000)
in die main ein -> warte 2 sec vor dem Zugriff (und nach dem launch natürlich)
 
Der System.out.println() wird vor der Exception angezeigt. Also da ist alles so gut so weit. Vielleicht wird "protected void startup() {" über "launch(Countdown.class, args);" in der main aufgerufen. Also die Exceptioon kommt erst wenn ich in der main auf "jLabel1.setText("Neuer Name");" zugreife. Vorher nicht.

EDIT//
Ich habe noch ein von Jigloo angeletes Probertyfile gefunden:
Java:
#Properties updated by Jigloo
#Mon Sep 28 15:27:20 CEST 2009

Application.description=
Application.homepage=
Application.id=Countdown
Application.lookAndFeel=system
Application.title=Application Framework App
Application.vendor=Cloudgarden.com
Application.vendorId=Cloudgarden
Application.version=1.0

jLabel1.font=Arial-PLAIN-72
jLabel1.text=jLabel1

mainFrame.title=This title is defined inside the property file
 
Zuletzt bearbeitet:
extrem frech angenommen könnte die Applikation über einen anderen ClassLoader gestartet werden oder ähnlich schlimme Dinge,
so dass du da gar keinen Zugriff drauf hast, zumindest von der main-Methode aus mit mir bekannten Mitteln 😉

noch ein Test der mir dazu einfällt: setze in der main das JLabel oder eine andere statische Variable mit einem Objekt/ Wert,
danach launch()
und prüfe dann in startup, ob die statischen Variablen wieder bei null angelangt sind,
wenn das der Fall ist passiert wirklich irgendwas größeres im Hintergrund,

aber ist eigentlich auch ganz egal, warum wolltest du da nochmal in main was machen?
geht doch genauso in startup(), dort könntest du auch einen neuen Thread starten,
es gibt noch weitere zu überschreibene Methoden wie ready()
 
Naja mein Problem ist, dass ich einen Countdown schreiben möchte. Und der muss halt jede Sekunde neu durchrechnen und das ergebnis auf dem Label anzeigen. Und wenn ich das in der Methode mache, hängt doch im Endhinein das ganze Programm? So etwas muss ich dcoh gezwungener Maßen im Main machen?
 
wie gesagt: von startup() aus könntest du einen neuen Thread starten,
setzt voraus, dieses Thema zu kennen, in Kurzform:

Runnable r = new Runnable() {
public void run() {

// Code
}
}
new Thread(r).start();
 
Ahhh klingt interessant. Kommt das "new Thread(r).start();" in die main?
Werde es morgen gleich ausprobieren, jetzt habe ich feierabend 😉

Vielen Dank für die Hilfe.
 
main() ist schlecht,
von startup() aus könntest du einen neuen Thread starten

<->

kommt das in die main()?

:autsch:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben