Avatar billede www.jakub.dk Nybegynder
07. februar 2003 - 15:12 Der er 17 kommentarer og
1 løsning

JInternalFrame always on top

Jeg er igang med at udvikle en applikation og er interesseret i at hører fra folk, som har erfaring i JInternalframes.
Mit problem består i at selve applikationen består af en JFrame instance med en instance af JDeskTopPain som container. Ved tryk på en knap åbnes et JInternalFrame som indeholder nogle felter som skal udfyldes af brugeren. Denne JInternalFrame indeholder også en knap, som skal åbne et JInternalFrame til. Det sidste JInternalFrame skal blive på toppen af det første men ikke på toppen af JFrame.

Hvis der er nogen som har oplevet lignende problematik før, vil jeg blive meget glad for at høre fra dig. :-)
Avatar billede viht Nybegynder
07. februar 2003 - 15:45 #1
Hvad mener du helt præcist med "På toppen af JFrame"? Hvis då åbner JInternalFrames i et JDesktopPane som er contentPane i et JFrame vil de jo altid ligge indenfor JFramet.
Avatar billede =maddog= Nybegynder
07. februar 2003 - 16:41 #2
jeg vil tro at noget i stil med
myJInternalFrame.addInternalFrameListener(new InternalFrameListener() {
  public void internalFrameDeactivated(InternalFrameEvent e) {
        myJInternalFrame.getContentPane().requestFocus();
  }
});
kunne gøre tricket, uden at have afprøvet det.
Avatar billede www.jakub.dk Nybegynder
07. februar 2003 - 18:41 #3
Jeg prøvede lige din ide maddog... Og den funkede desværre ikke. Jeg synes nu at jeg bruger de rigtige metoder, men jeg må overse et eller andet...

Mange tak for hjælpen og hvis der er flere forslag tager jeg gerne imod...

Til viht:
Det er jeg godt klar over, og det er lidt svært at forklare... Men Forestil dig den situattion:
En bruger klikker på en knap og der åbnes et vindue hvor der skal indtastes nogle oplysninger... Men for at tilføje nogen andre oplysninger skal brugeren nu trykke på en knap der hedder "Tilføj" på det åbnede vindue (som er et et instance af JInternalFrame). Når brugeren trykker på "Tilføj" Popper der et vindue op, som skal lukkes inden brugeren kan vende tilbage til det forrige vindue! Det er denne effekt jeg gerne vil efterligne, men desværre viser det sig ret svært!
Avatar billede =maddog= Nybegynder
07. februar 2003 - 21:18 #4
Jeg er fuldstændig med. Du vil gerne have den ene interne frame "pseudo-modal", altså fuldstændig afhæning af den anden interne frame.
Har du overvejet at lave en indre klasse der virker som en dialog, blot med JnternalFrame istedet for JFrame?
Avatar billede www.jakub.dk Nybegynder
07. februar 2003 - 23:43 #5
Det må jeg lige lege med det bliver dog først imorgen.... Mange tak for hjælpen.
Avatar billede www.jakub.dk Nybegynder
08. februar 2003 - 00:41 #6
Du må dog gerne forklare lidt mere hvordan, så kunne jeg komme lidt bedre igang. Hvis du altså sidder med en konkret ide (eller kode)... Så ville jeg være taknemlig.....
Avatar billede =maddog= Nybegynder
08. februar 2003 - 03:21 #7
jeg har siddet og leget lidt med det, og det er sværere end som så. jeg er i hvert fald løbet tør for ideer. Måske G.Oogle har nogle forslag?
Avatar billede viht Nybegynder
08. februar 2003 - 06:10 #8
Dette har jeg gjort med en ComponentDialog, den kan du jo tilføje så mange komponenter til som du vil.. så den kan fungere som du vil have den. Den tillader ikke at vinduer bag den aktiveres.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Test extends JFrame {
   
    private JDesktopPane desktop;
   
    private JButton addButton;
   
    public Test() {
       
        setTitle("InternalFrame Test");
        setSize(400,400);
       
        addButton = new JButton("Tilføj");
        addButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                addInternalFrame();
            }
        });
       
        desktop = new JDesktopPane();
       
        getContentPane().add(desktop, BorderLayout.CENTER);
       
        getContentPane().add(addButton, BorderLayout.SOUTH);
    }
   
    private void addInternalFrame() {
       
        int numAdded = desktop.getAllFrames().length;
       
        final JInternalFrame frame = new JInternalFrame("Internal Frame");
        frame.setSize(200,200);
        frame.setClosable(true);
        frame.setIconifiable(true);
        frame.setMaximizable(true);
        frame.setResizable(true);
        frame.setLocation(numAdded*20, numAdded*20);
       
        JButton openDialogButton = new JButton("Open dialog");
        openDialogButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                showDialog(frame);
            }
        });
       
        frame.getContentPane().add(openDialogButton, BorderLayout.SOUTH);
       
        desktop.add(frame);
        frame.setVisible(true);
    }
   
    private void showDialog(JInternalFrame frame) {
               
        Object[] messages = new Object[2];
        messages[0] = "Hejsa";
        messages[1] = new JButton("Dummy button");
        String[] options = { "Ok", "Annuller" };
       
        int result = JOptionPane.showOptionDialog(frame,
                                                        messages,
                                                          "Info",
                                                          JOptionPane.DEFAULT_OPTION,
                                                          JOptionPane.INFORMATION_MESSAGE,
                                                          null,
                                                          options,
                                                          options[0] );
    }
}

class RunIt {
   
    public static void main(String[] args) {
        new Test().show();
    }
}
Avatar billede =maddog= Nybegynder
08. februar 2003 - 06:48 #9
problemet er at hans dialog skal være en modal dialog som selv er en intern frame. dette åbner en normal dialog.
jeg kan godt lave en dialog i en intern frame (eller noget der ligner til forveksling), men ikke gøre den modal.
Avatar billede =maddog= Nybegynder
08. februar 2003 - 06:49 #10
og du har ikke lavet en WindowListener til at lukke System. fy :-).
Avatar billede www.jakub.dk Nybegynder
08. februar 2003 - 08:27 #11
Ja jeg tror desværre at jeg nok ikke kan bruge den kode... Gad vide om dette problem kan løses på nogen måde...
Avatar billede =maddog= Nybegynder
08. februar 2003 - 09:04 #12
Tadaaaaa. Når man bare bliver stædig nok. Det er en gang lineær can-of-worms kode, men det virker som det skal.

import javax.swing.*;
import javax.swing.event.*;
import java.beans.PropertyVetoException;
import java.awt.event.*;
import java.awt.*;

public class InternalFrameDemo extends JFrame {
    JDesktopPane desktop;

    public InternalFrameDemo() {
        super("InternalFrameDemo");

        //Set up the GUI.
        desktop = new JDesktopPane(); //a specialized layered pane
        desktop.putClientProperty("JDesktopPane.dragMode", "outline");
        setContentPane(desktop);
       
        final JInternalFrame frame1 = new JInternalFrame("TEST",true,true,true);
        final JInternalFrame frame2 = new JInternalFrame("Dialog",true,true,true);
        frame1.addInternalFrameListener(new InternalFrameAdapter() {
            public void internalFrameActivated(InternalFrameEvent e) {
                try {frame2.setSelected(true);}
                catch (java.beans.PropertyVetoException pve) {}
            }
        });
           
        JButton b = new JButton("Open dialog");
        b.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        frame2.setVisible(true);
                        try {frame2.setSelected(true);}
                        catch (java.beans.PropertyVetoException pve) {}
                    }
                });
        frame1.getContentPane().add(b);
        b = new JButton("Cancel");
        b.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        frame2.setVisible(false);
                    }
                });
        frame2.getContentPane().add(b);
        b = new JButton("OK");
        b.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("Do something");
                        frame2.setVisible(false);
                    }
                });
        frame2.getContentPane().add(b);
        frame1.setSize(100,100);
        frame2.setSize(100,100);
        frame1.setVisible(true); //necessary as of 1.3; OK to use before
        desktop.add(frame1);
        desktop.add(frame2);
        try { frame1.setSelected(true);}
        catch (PropertyVetoException e) {}


        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
   
    public static void main(String[] args) {
        InternalFrameDemo r = new InternalFrameDemo();
        r.setSize(400,400);
        r.setVisible(true);
    }
}
Avatar billede viht Nybegynder
08. februar 2003 - 12:05 #13
Att: maddog, ja jeg har glemt den - men det bruger du ikke en WindowListener til :) setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Avatar billede www.jakub.dk Nybegynder
08. februar 2003 - 16:08 #14
Maddog du er genial... (Hvis det altså virker på min app. )... Jeg har roddet med noget lignenede dog med en forkert indgangs vinkel...
Avatar billede www.jakub.dk Nybegynder
08. februar 2003 - 16:09 #15
Hvis den virker så er der point!
Avatar billede www.jakub.dk Nybegynder
08. februar 2003 - 16:28 #16
Jeps har lige modificeret koden og det virker... Vis du vil poste dit Kommentar som svar så er pointerne dine.. :-)
(Bare nysgerrigt, så hvor fandt du det henne?)
Avatar billede =maddog= Nybegynder
08. februar 2003 - 17:21 #17
Jeg lavede det selv. Da det er det første jeg har lavet med interne frames så jeg downloadede InternalFrameDemo for at greje syntaxen. Ganske få (5-10) linjer er tilbage.
Avatar billede www.jakub.dk Nybegynder
08. februar 2003 - 20:10 #18
jeg har faktisk prøvet alt andet end lige den måde... Meeen mange tak for hjælpen. :-)
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