JVM crashed bij JOptionPane.showInternalMessageDialog

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Jegorex
  • Registratie: April 2004
  • Laatst online: 03-09 23:24
Als ik een internal message dialog gebruik en ik sluit de popup met de enter toets dan crashed mijn JVM regelmatig.
Dit gebeurt zowel in 64bit 1.6.0_18 als in 32bit 1.6.0_23

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class MainClass extends JFrame {
    private static final long           serialVersionUID    = 1L;
    private static final JDesktopPane   desk                = new JDesktopPane();

    public MainClass(String title) {
        super(title);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setContentPane(desk);
    }

    // A simple test program
    public static void main(String[] args) {
        MainClass td = new MainClass("Desktop");
        td.setSize(350, 250);
        td.setVisible(true);
        JOptionPane.showInternalMessageDialog(desk, "The End");
    }
}

Dit voorbeeld is overgenomen van java2s.com

Doe ik nu iets fout, is er iets mis met mijn pc of zit er een bug in Java?

Acties:
  • 0 Henk 'm!

  • Hillie
  • Registratie: Januari 2000
  • Laatst online: 05:29

Hillie

Poepen = ultieme ontspanning

Vergelijk het voorbeeld eens met je eigen code. Laatste regel uit de constructor staat bij jou in de main() (regel 20).

Verder gelden natuurlijk de standaardvragen: Wat heb je gedaan om zelf te debuggen? Gekeken naar compiler logs, heb je er een debugger aangehangen?

Als de voorbeeldjes fout gaan, dan is het meestal een user error. Dergelijke dingetjes hangen over het algemeen in een regressietest die voor release gedraaid wordt (mag ik toch hopen :)).

Liefhebber van schieten en schijten. Ouwehoer en niet-evangelisch atheist.

Daniel36: Dat zeg ik(?) Nee, dat zeg ik niet, je hebt gelijk.


Acties:
  • 0 Henk 'm!

  • Jegorex
  • Registratie: April 2004
  • Laatst online: 03-09 23:24
Ik heb hem in Eclipse getest met de debugger, maar de JVM loopt vast en dan kan hij ook niet meer debuggen.

Het rare is dat als ik stap voor stap door het proces ga dan loopt hij niet vast, maar als ik de er doorheen loop zonder breakpoint dan bevriest de VM.

Ik heb JOptionPane.public static int showInternalOptionDialog(...) gekopieerd naar mijn eigen klasse, als ik daar het volgende toevoeg werkt het wel op de een of andere manier:
Java:
1
2
3
4
        if (fo != null && fo.isShowing()) {
            System.out.print("");
            fo.requestFocus();
        }

Regel 2 heb ik toegevoegd, de rest staat bijna onderaan de methode.

Maar met mijn gekopieerde methode reageert de popup niet meer op de enter key :?

Edit:
Ik heb JOptionPane.showInternalMessageDialog(desk, "The End"); weer op de orriginele locatie gezet en dan lijkt hij het wel te doen.
Blijkbaar kan ik de popup niet zomaar overal neerzetten?
Vanavond zal ik eens kijken of ik hier iets mee kan. (Ik zal weinig keus hebben)

[ Voor 16% gewijzigd door Jegorex op 17-12-2010 07:31 ]


Acties:
  • 0 Henk 'm!

  • Hillie
  • Registratie: Januari 2000
  • Laatst online: 05:29

Hillie

Poepen = ultieme ontspanning

Voordat je random code overal neer gaat gooien, probeer eens te achterhalen waarom die regel in het voorbeeld het wel doet en in jouw code niet. Daar zul je waarschijnlijk niet direct een antwoord op vinden, maar met een beetje nadenk- en analysewerk kun je aardig op weg komen. Wat is je eigen idee hieromtrent?

Liefhebber van schieten en schijten. Ouwehoer en niet-evangelisch atheist.

Daniel36: Dat zeg ik(?) Nee, dat zeg ik niet, je hebt gelijk.


Acties:
  • 0 Henk 'm!

  • terje7601
  • Registratie: September 2009
  • Laatst online: 08-02-2024
Volgens mij heeft het te maken met Concurrency in Swing.
De constructor van MainClass wordt m.i. op de Swing EDT (Event Dispatching Thread) uitgevoerd, terwijl dat voor je main methode natuurlijk niet het geval is.

Edit: als je die regel in je main methode wil, zul je eens moeten kijken naar de invokeAndWait & invokeLater methodes in de javax.swing.SwingUtilities class

[ Voor 22% gewijzigd door terje7601 op 17-12-2010 10:07 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Met hierboven. Swing gerelateerde operaties doe je op de EDT.
Kortom, zet in je main
Java:
1
2
3
4
5
6
7
public static void main( String args[]){
  EventQueue.invokeLater( new Runnable(){
     public void run(){
       //your code here
     }
  } );
}

en waarschijnlijk gaat het allemaal een stuk beter

Acties:
  • 0 Henk 'm!

  • Jegorex
  • Registratie: April 2004
  • Laatst online: 03-09 23:24
Bedankt terje en Pissed :)
Ik werk vrijwel nooit met swing en had hier dan ook niet aan gedacht.
Pagina: 1