Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    3

    Chiudere "undecorated" JDialog ...

    Salve,

    chiedo un piccolo aiuto su un problema che non riesco a risolvere ... ...

    Ho un JDialog che contiene un pulsante. Alla pressione del pulsante creo una nuova classe JDialog (modale) che visualizza una tabella con dei valori che vengono aggiornati in tempo reale. Fino a qui nessun problema. Il JDialog (undecorated) che ho creato contiene solo la tabella, nessun altro pulsante e qui il problema:

    - Come chiudere il JDialog ?

    Ho fatto vari tentativi sperando di risolvere ma per adesso non ho trovato soluzione.

    Ho provato tutti gli eventi della JTable, ma una tavola senza righe (uno dei casi) non genera nessun evento alla pressione del mouse. Ho provato con gli eventi Focus e WindowFocus ma anche qui senza successo.

    Vorrei che il JDialog si chiudesse quando l'utente clicca da qualsiasi altra parte (JDialog sottostante e/o fuori dall'applicazione java), ma non ho più idee e google oggi non vuole aiutarmi ... ...

    In pratica chiudere un JDialog cliccando al di fuori di esso.

    Per rendere la cosa più chiara ho inserito un esempio (Netbeans).

    Magari qualcuno ha qualche idea di come fare ?

    Grazie mille per qualsiasi input.

    kappasm
    File allegati File allegati

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da kappasm Visualizza il messaggio
    Ho provato tutti gli eventi della JTable, ma una tavola senza righe (uno dei casi) non genera nessun evento alla pressione del mouse.
    Premessa: un MouseListener non ha nulla, di per sé, a che fare con le celle di JTable. Un MouseListener registrato su JTable riceverà tutti gli eventi che vuoi fintanto che il click è sull'area fisica di JTable. Se poi vuoi sapere in quale cella "cade" l'evento ... si può anche fare ma è un altro discorso.

    Quello che dici tu (senza righe non ottieni eventi) è dovuto ad un altro aspetto particolare di JTable. Se metti JTable in JScrollPane (cosa standard/tipica) e l'area di "view" è di es. 200x200, se non ci sono righe, il JTable ha altezza fisica ... 0! Perché in questo scenario, per default, JTable dimensiona fisicamente sé stesso al minimo indispensabile. Quindi qualunque evento del mouse andrebbe a finire al JViewport e non al JTable (dato che non lo beccheresti nemmeno fisicamente con il mouse!).

    Se vuoi che JTable riempia sempre e comunque l'altezza del viewport, da Java 6 puoi fare:

    table.setFillsViewportHeight(true);

    L'unico aspetto diverso ora è che lo sfondo è tutto dello stesso colore uguale a quello delle celle.

    Quote Originariamente inviata da kappasm Visualizza il messaggio
    Ho provato con gli eventi Focus e WindowFocus ma anche qui senza successo.
    Se registri un WindowFocusListener sulla dialog, ottieni il windowLostFocus quando attivi una finestra di un'altra applicazione (la tua dialog perde il focus).
    Cliccando su un frame rispetto cui la dialog è "modale" ... no.

    Quote Originariamente inviata da kappasm Visualizza il messaggio
    Vorrei che il JDialog si chiudesse quando l'utente clicca da qualsiasi altra parte (JDialog sottostante e/o fuori dall'applicazione java), ma non ho più idee e google oggi non vuole aiutarmi ... ...
    Non ti andrebbe bene un tasto particolare es. ESC ?
    Una combinazione di tasti comunque esiste già di sicuro, dipendentemente dal S.O. Su Windows con Alt+F4 chiudi la dialog. Ma se vuoi ESC o altro si può fare.
    Ultima modifica di andbin; 19-06-2014 a 15:47
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    3
    Sono nuovo del mondo Java, provengo da ormai molti anni di Visual Basic 6.0. Ho iniziato ad usare Netbeans 8.0 + JDK 1.7 da meno di un mese e pretendo di usare questa accoppiata come usavo Visual Basic 6.0, sono un pò presuntuoso ... ...

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Premessa: un MouseListener non ha nulla, di per sé, a che fare con le celle di JTable. Un MouseListener registrato su JTable riceverà tutti gli eventi che vuoi fintanto che il click è sull'area fisica di JTable. Se poi vuoi sapere in quale cella "cade" l'evento ... si può anche fare ma è un altro discorso.
    Grazie per il chiarimento, il comportamente è molto simile a Visual Basic, quindi niente da obbiettare.

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Quello che dici tu (senza righe non ottieni eventi) è dovuto ad un altro aspetto particolare di JTable. Se metti JTable in JScrollPane (cosa standard/tipica) e l'area di "view" è di es. 200x200, se non ci sono righe, il JTable ha altezza fisica ... 0! Perché in questo scenario, per default, JTable dimensiona fisicamente sé stesso al minimo indispensabile. Quindi qualunque evento del mouse andrebbe a finire al JViewport e non al JTable (dato che non lo beccheresti nemmeno fisicamente con il mouse!).
    Decisamente un aspetto che non immaginavo. Ancora devo prendere confidenza con la documentazione Java e con Java stesso dove ogni componente fa parte di un gruppo più grande e ha gruppi più piccoli sotto. Ancora non ho ben chiari tutti i termini, mi perdonerai per questo.

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Se vuoi che JTable riempia sempre e comunque l'altezza del viewport, da Java 6 puoi fare:

    table.setFillsViewportHeight(true);

    L'unico aspetto diverso ora è che lo sfondo è tutto dello stesso colore uguale a quello delle celle.
    Spuntanto la voce nella GUI della tabella (o aggiungendo il codice manualmente) adesso posso intercettare gli eventi del mouse anche con JTable vuota, proprio quello che volevo ... ...

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Se registri un WindowFocusListener sulla dialog, ottieni il windowLostFocus quando attivi una finestra di un'altra applicazione (la tua dialog perde il focus).
    Cliccando su un frame rispetto cui la dialog è "modale" ... no.
    Infatti, il comportameno non è quello che mi aspettavo quindi ho abbandonato l'idea.

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Non ti andrebbe bene un tasto particolare es. ESC ?
    Una combinazione di tasti comunque esiste già di sicuro, dipendentemente dal S.O. Su Windows con Alt+F4 chiudi la dialog. Ma se vuoi ESC o altro si può fare.
    Giusta osservazione, infatti oltre ad utilizzare eventi del mouse per chiudere il dialogo (mouse exit) ho inserito il tasto particolare "ESC", esiste già, come hai citato tu, la coppia di tasti "Alt+F4".

    Ti ringrazio infinitamente per l'aiuto.

    kappasm

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.