Frame schliessen

Guten Tag,

ich habe ein kleines Problem und hoffe, dass ihr mir auf die Sprünge helfen könnt.
Ich arbeite an einem kleinen Programm, welches via Gui logische Abläufe zeigen soll. Das ist auf mehrere Frames aufgeteilt. Zu Anfang wird ein Frame dargestellt, in dem man auswählen kann, zu welchen anderem Frame man springen möchte.
Und schon da, wenn man nur das erste Frame hat, tritt dieses Verhalten schon auf.

Solange ich in Netbeans bin funktioniert alles wunderbar. Die Fenster lassen sich schliessen, wie gewollt.
Dann erstelle ich eine .jar.
Starte ich diese Jar mit dem JDK 1.7.0_21 via MS-Dos Eingabeaufforderung, läuft alles wie erwartet.
Starte ich blos mit “java -jar”, dann wird die JRE 7 genommen, dann kann ich das (oder dann eben auch die) Fenster nicht schliessen. Das Ganze lässt sich dann nur über schliessen der MS-dos Aufforderung beenden.

Der Kunde hat sich bei mir gemeldet (dadurch weiss ich das überhaupt:( ) und mir dieses Verhalten beschrieben, und siehe da - das Selbe hier.

Wisst ihr eine Abhilfe? Ich nehme an, irgendwo liegt eihn Fehler meinerseits.

Danke im Voraus
Torsten

Habe mal schnell die Dateien vereinfacht.
Bei den beiden Dateien tritt dieses Verhalten auf.
Was kann ich anders machen?

TestGui.java


/**
 *
 * @author ToMa
 */
public class TestGui {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                    
                StartGui st = new StartGui();
                st.programWindow.setVisible(true);
                
                
            }
        
        });
    }
}

StartGui.java

    /**
     * 
     */
    public StartGui() {
        initComponents();
    }
    
    /**
     * 
     */
    private void initComponents() {
        
        
        
        
        programWindow = new javax.swing.JFrame();
        programWindow.setLayout(null);
        
        panelMain = new javax.swing.JPanel();
        panelMain.setLayout(null);
        
        buttonStart = new javax.swing.JButton();
        
        scrollListKomponent = new javax.swing.JScrollPane();
        listKomponent = new javax.swing.JList();

        
        

        buttonStart.setText("Start");
        buttonStart.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonStartActionPerformed(evt);
            }
        });
        buttonStart.setBounds(10, 10, 230, 25);
        
        
        
        listKomponent.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "no Frame" , "nichts" , "und wieder nichts"};
            @Override
            public int getSize() { return strings.length; }
            @Override
            public Object getElementAt(int i) { return strings**; }
        });
        listKomponent.setSelectedIndex(0);
        
        scrollListKomponent.setViewportView(listKomponent);
        scrollListKomponent.setBounds(10, 55, 230, 200);
  
        panelMain.setBounds(0,0,255, 300);
        panelMain.add(buttonStart);
        panelMain.add(scrollListKomponent);
        
        programWindow.setResizable(false);
        programWindow.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        programWindow.setTitle("Start V1.0");
        programWindow.setBounds(10, 10, 255, 300);
        programWindow.getContentPane().add(panelMain);
        
        
        
    }
    
    //<editor-fold defaultstate="collapsed" desc="Events">
    
    

    /**
     *
     */
    private void buttonStartActionPerformed(java.awt.event.ActionEvent evt) {
        int index = listKomponent.getSelectedIndex();
        
        
        
        
    }
    
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Variablen">
    public javax.swing.JFrame programWindow;
    
    private javax.swing.JButton buttonStart;
    
    private javax.swing.JList listKomponent;
    
    private javax.swing.JPanel panelMain;
    
    private javax.swing.JScrollPane scrollListKomponent;
    
    
    //</editor-fold>
}```

Was heißt “nicht schließen”:
schließt sich das fenster garnicht oder schließt sich das Fenster und die MS-dos-Aufforderung bleibt noch offen?

Ich tippe mal auf letzteres. Dann musst du folgende Methode auf deinem FrameObjekt aufrufen:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Für denn Fall dass es das nicht war:
Tauchen Exceptions auf? Wenn ja welche (am besten komplett posten mit zugehörigem relavanten Code)

@tomate salat
Nicht schliessen heisst, dass wenn ich das rote Kreuz oben recht betätige keinerlei Reaktion erfolgt.
Es wird das Fenster, in dem ich das Kreuz klicke, nicht geschlossen.

Das Fenster wird erst dann geschlossen, wenn ich die MS-DOS Eingabe über schliessen beende.

Exceptions oder sonstige Fehlermeldungen sind nicht vorhanden.

Das Verhalten tritt auch bei EXIT_ON_CLOSE auf. Extra eben noch mal geschaut.

Torsten

das Programm ist immer noch ziemlich lang,
tritt kein Fehler auf wenn du die JList herausnimmst, ist sie also Fehler-relevant?
anderenfalls hat sie nichts darin zu suchen,

hier noch kürzer mit einem WindowListener,
ist interessant ob der drankommt, was sagt der zur gesetzten CloseOperation?
könnte letztlich auch egal sein wenn System.exit() oder dispose() in den Listener hineinkommt
(sofern dieser funktioniert)

aber wenn DISPOSE_ON_CLOSE nicht geht, dann ist ja mit allem Möglichen zu rechnen, nichts darf vorausgesetzt werden

im zuvor geposteten Programm erbte auch noch StartGui von JFrame, was zumindest in der gekürzten Variante unnötig ist,
darauf ist noch zu achten, wird wirklich das JFrame angezeigt, welches du willst?
ist die CloseOperation beim richtigen JFrame gesetzt oder bei einem falschen?

wenn dabei Fehler passieren, kann man auch schnell den WindowListener falsch adden und kommt nicht voran,
im Testprogramm mit nur einem JFrame sollte aber alles eindeutig sein

class TestGui2
{
    public static void main(String[] args)
    {
        java.awt.EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {

                    StartGui st = new StartGui();
                    st.programWindow.setVisible(true);
                }
            });
    }
}


class StartGui
{
    public StartGui()
    {
        programWindow = new javax.swing.JFrame();
        programWindow.setResizable(false);
        programWindow.addWindowListener(new WindowAdapter()
            {
                public void windowClosing(WindowEvent _e)
                {
                    System.out.println("want to close " + programWindow.getDefaultCloseOperation());
                }

                public void windowClosed(WindowEvent _e)
                {
                    System.out.println("close");
                }

            });
        programWindow.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        programWindow.setTitle("Start V1.0");
        programWindow.setBounds(10, 10, 255, 300);

    }

    public javax.swing.JFrame programWindow;

}

Werde mir heute abend oder am WE die Problematik noch mal anschauen. Mal sehen auf was ich komme. Möglich auch, dass das Problem nur am Rechner in der Firma auftaucht.

Wie auch immer…
Erstmal danke. Waren nützliche Denkanstösse.
Torsten

Hallo,

gerade eben noch mal probiert. Unter Ubuntu keine Probleme.
Unter Windows keine Probleme. Der selbe Programmcode wurde verwendet (TestGui.java und StartGui.java).
Allerdings habe ich hier zu Hause eine neuere JRE 1.7.0_25.
Kann das damit zusammenhängen?
Also hier zu Hause läuft es, wie es soll. Dann eben Montag auf Arbeit weiter machen.

Schönes Wochenende

Wie jetzt, dein Java Programm läuft auf MS-DOS? Jedenfalls denke du willst einfach statt “java -jar” “javaw -jar” benutzen, dann wird kein Konsolenfenster geöffnet und das Programm schließt sich, wenn man aufs X klickt.

was heißt ‘keine Probleme’, beziehst du dich wieder allgemein auf dein ursprüngliches Programm?
hast du schon getestet wie es mit Listener überall aussieht?

@bertor nein, nicht ms-DOS. Aber von der Ms- DOS Eingabeaufforderung.
Und da hilft es nicht (auf dem Firmencomputer) javaw zu nehmen.
Das habe ich bereits probiert.

@SlaterB ja, der ursprüngliche Code wurde verwendet. Wie ich schrieb TestGui und StartGui.
Werde Montag in der Firma mal schauen, was sich machen lässt.
Hier, zu Hause, funktioniert es ja.

Torsten

Hallo,

die freudige Nachricht zuerst. Es funktioniert nun.

Ich habe zu Hause auf meinem Computer 2 JARs erstellt. Einmal TestGui.jar mit dem Code von mir und dann die TestGui2.jar von SlaterB.
Beide funktionieren zu Hause wie erwartet, d.h. die Fenster lassen sich schliessen und bei TestGui2.jar kommt auch noch

want to close 2
close

Die Jar-Dateien mit in die Firma genommen und laufen lassen - selbe Problematik. Fenster lassen sich nicht schliessen und es kommt bei TestGui2 auch keine Ausgabe.

Dann habe ich versucht die JRE upzudaten (war noch 1.7.0_09) - Abbruch, ging nicht, keine Fehlermeldung.
Ok, denk ich, installierst du eben die 25 per Hand. Ging nicht - Fehler BrowserLaunch 1314.

Also die alte JRE per Hand deinstalliert und dann die 25 installiert.
Und siehe da, es funktioniert - Fenster lassen sich nun schliessen

Dem Kunden Update/Neuinstallation der JRE empfohlen. Und bei ihm funktioniert es auch.

Wichtig vielleicht noch, dass der Kunde und ich beide Windows XP SP3 haben.

Danke an euch für die Hilfe
Torsten