Avatar billede marvinq Nybegynder
12. maj 2009 - 21:36 Der er 18 kommentarer og
1 løsning

GUI problem med dialogbox

Hej eksperter,

Jeg har tidliger rejst næsten samme spørgsmål, men uden den store respons.

Jeg har et problem med en java applikation, som kører i fullscreen. Hver gang der kommer en dialogbox frem (i applikationen), så minimeres applikationen fra fullscreen til tray. Det er noget nyt noget som programmet gør efter nogle nye windows opdateringer.

Hvordan kan jeg undgå det, og sørge for at applikationen forbliver i fullscreen hele tiden, også når en dialogbox kommer frem.

Det er hamrende irriterende, og kan ikke rigtige finde nogle hints om det.

Håber virkelig I kan hjælpe

På forhånd tak

/MHQ
Avatar billede _carsten Nybegynder
12. maj 2009 - 21:57 #1
Det må have noget at gøre med den måde du skruer det sammen på - vil jeg tro.

Her er et eksempel på hvordan det bør gøres - hvordan fungerer den hos dig ???

import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.SwingConstants;



public class FullScreen extends javax.swing.JFrame implements ActionListener{

    public FullScreen() {
        setExtendedState(Frame.MAXIMIZED_BOTH);

        setLayout(new FlowLayout(SwingConstants.CENTER));
       
        JButton b = new JButton("Åben dialog");
        b.addActionListener(this);
        getContentPane().add(b);
       
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
       
        pack();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FullScreen().setVisible(true);
            }
        });
    }

    public void actionPerformed(ActionEvent e) {
        MyDialog my = new MyDialog(this);
        my.setVisible(true);
    }
}





class MyDialog extends JDialog implements ActionListener{

    public MyDialog(FullScreen fs){
        super(fs, true);

        setSize(400,400);
        setLocationRelativeTo(fs);
       
        setLayout(new FlowLayout(SwingConstants.CENTER));
        JButton b = new JButton("Luk dialog");
        b.addActionListener(this);
        getContentPane().add(b);
    }

    public void actionPerformed(ActionEvent e) {
        setVisible(false);
        dispose();
    }
}
Avatar billede marvinq Nybegynder
12. maj 2009 - 22:43 #2
Hej _carsten og andre

Tak for dit hurtige svar.

Jeg forstår godt din løsning på mit svar, med at lave en "hjemmelavet" dialogbox, men jeg vil helst holde mig til en standard "windows" dialogbox, - for jeg benytter mig sådan lidt blandet af YES/NO, OK og YES/NO/CANCEL... Så det vil være lidt omfattende at lave dem alle om.

Jeg gør således... (ligeledes i en IFrame)

int response = JOptionPane.showConfirmDialog(getContentPane(), new String[] {
    "Er du sikker på, at du vil lukke programmet",
    "og dermed afslutte alle igangværende spil?"},
    "Afslut programmet?",
    //JOptionPane.YES_NO_OPTION,
    JOptionPane.WARNING_MESSAGE);
           
switch(response) {
    case JOptionPane.YES_OPTION:{
        ...
    }//case yes
    case JOptionPane.NO_OPTION:{
        ...
    }//case    no
}//switch

...men når ovenstående indtræffer, så minimeres min fullscreen applikation... det er hamrende irriterende, for det har virket upåklageligt indtil Microsoft har ændret noget i de seneste windows updates.

Håber du er med...


/MHQ
Avatar billede marvinq Nybegynder
12. maj 2009 - 22:44 #3
... og det hedder selvfølgelig JFrame :)
Avatar billede _carsten Nybegynder
13. maj 2009 - 09:38 #4
Prøv lige igen med denne - jeg tvivler stærkt at det er et problem

showConfirmDialog(getContentPane(), new String[] {
--> getContentPane()
Du skal bruge din JFrame som parent, IKKE dens contentPane

Prøv at afslutte nedenstående program




import javax.swing.JOptionPane;

public class AskBeforeClose extends javax.swing.JFrame {

    public AskBeforeClose() {
        initComponents();
    }


    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                close(evt);
            }
        });

        pack();
    }

    private void close(java.awt.event.WindowEvent evt) {
        String msg = "Vil du virkelig afslutte dette skønne program ?";

        int i = JOptionPane.showConfirmDialog(this, msg);

        if(i == JOptionPane.YES_OPTION)
            System.exit(0);
    }


    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new AskBeforeClose().setVisible(true);
            }
        });
    }
}
Avatar billede mcb2001 Nybegynder
13. maj 2009 - 11:57 #5
Hej _carsten > du laver da ikke ægte fullscreen sådan, men det er okay...

Og hvorfor ikke bare bruge en InternalFrame?
Avatar billede _carsten Nybegynder
13. maj 2009 - 13:19 #6
Hvad er ægte fullscreen, udover at være et vindue åbnet i maksimeret tilstand ??

Jeg ved godt mit lille eksempel ikke åbnede i maximeret tilstand, men det er vel bare en detalje som kan kopieres fra mit første eksempel.

JInternalFrame er noget helt andet, der anvendes i en JDesktopPane, der igen addes til en JFrame og som >>visuelt<< aldrig bliver større en den JFrame den er indeholdt i.
Avatar billede mcb2001 Nybegynder
13. maj 2009 - 14:59 #7
Avatar billede marvinq Nybegynder
13. maj 2009 - 20:14 #8
Hej,

Lækkert med lidt dialog.. :)

mcb2001:
Jeg laver allerede fullscreen som du også henviser til.

_carsten:
Dit eksempel er udmærket, men applikationen er jo ikke fullscreen, så kan ikke rigtig se om det virker, for mit problem opstår kun i fullscreen. Kan du lave et eksempel hvor det kører fullscreen - må sq indrømme jeg ikke helt kan regne ud hvordan jeg skal lave dit eksempel til fuldskærm.

Håber du/I kan hjælpe med en uddybning.

/MHQ
Avatar billede mcb2001 Nybegynder
13. maj 2009 - 20:26 #9
husker du at binde din optionpane til dit frame istedet:
istedet for:
int response = JOptionPane.showConfirmDialog(getContentPane(), new String[] {...

så prøv:

int response = JOptionPane.showConfirmDialog(this, new String[] {
Avatar billede marvinq Nybegynder
13. maj 2009 - 21:04 #10
Hej mcb2001,

Ja, det har jeg også prøvet... men desværre med samme udfald. Hver gang jeg får en dialog boks op, så minimerer den fra fullscreen. Når jeg så maksimere applikationen igen, så kan jeg se dialogboksen, og fortsætte.

this, ændrer desværre ikke noget :-/

Andre bud?

/MHQ
Avatar billede _carsten Nybegynder
13. maj 2009 - 21:42 #11
Har aldrig brugt det
Avatar billede marvinq Nybegynder
14. maj 2009 - 08:44 #12
Hmm...

Når jeg laver en JOptionPane i en fullscreen applikation som mcb2001 også henviser til, så minimerer applikationen hvergang JOptionPane't kommer frem. Det virker fint nok i eksempler som det du gav, hvor applikationen ikke er i fullscreen.

Andre bud ?

/MHQ
Avatar billede mcb2001 Nybegynder
14. maj 2009 - 08:52 #13
kunne du tegne din egen optionpane?
Avatar billede marvinq Nybegynder
14. maj 2009 - 09:17 #14
Hej,

altså du mener lidt som der blev lagt op til først, altså at lave min egen. Det vil selvfølgelig virke, men jeg benytter dem ret meget i flere varianter, så kunne jeg bruge windows egen ville det jo være at foretrække - det ville også være hurtigst, men er det eneste løsning er der selvfølgelig ikke andet at gøre.

Synes jo bare det er skide ærgeligt, hvis det er eneste løsning.

/MHQ
Avatar billede mcb2001 Nybegynder
14. maj 2009 - 10:44 #15
jamen, du kunne vel lave et "JPanel" eller lignende, som implementerer den generele funktionalitet du har brug for, og så smide den ind over din JFrame, når du vil have brugeren til at tage stilling til noget.
Avatar billede marvinq Nybegynder
14. maj 2009 - 10:51 #16
haha... joooh... ved ikke om det virker, men det er selvfølgelig en løsning.

Det undrer mig bare at der ikke findes en løsning på det, for det har altid virket tidligere.

/MHQ
Avatar billede mcb2001 Nybegynder
14. maj 2009 - 11:36 #17
ja, og det burde virke - men jeg har ikke den store erfaring med lige det problem, jeg har primært brugt "ægte" fullscreen til at kunne tegne store fraktaler direkte på skærmen, og lave zoom og scroll funktionalitet direkte... havde ikke det store behov for JOptionPanes til det, da jeg aldrig har lavet programmer/spil til fullscreen :-)
Avatar billede marvinq Nybegynder
28. december 2012 - 13:36 #18
mcb2001, det var vejen frem at kombinere JPanel og JFrame. Vil du smide et svar
Avatar billede mcb2001 Nybegynder
28. december 2012 - 16:48 #19
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester