Avatar billede jakobbak Nybegynder
20. november 2003 - 19:31 Der er 4 kommentarer og
1 løsning

skifte vindue i frame

Jeg er ved at lave GUI til et biludlejningssystem og har følgende panel som jeg gerne vil sætte ind i mit hovedvindue som er et frame:

public class ReservationAdministration extends JPanel {

    public ReservationAdministration() {

I constructuren oprettes et hovedpanel, hvor der indsættes andre paneler, en masse knapper, tekstfelter osv.


I mit hovedvindue er der en menubar og afhængig af hvilken menupunkt der trykkes på skal hovedvinduet under menuen skifte.

koden for hovedvinduet ser sådan ud:

public class CarRentSystem extends JFrame implements ActionListener {

    boolean inAnApplet = true;
    JPanel test = new JPanel();

public CarRentSystem() {
// Setting up a listener for closing the Window
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                if (inAnApplet) {
                    dispose();
                } else {
                    System.exit(0);
                }
            }
        });

MenuBar mb;
        Menu m1, m2, m3, m4, m5;
        MenuItem mi1_1, mi1_2, mi1_3, mi1_4, mi2_1, mi2_2,mi2_3, mi2_4,
        mi3_1, mi3_2, mi3_3, mi3_4, mi4_1, mi4_2, mi4_3, mi4_4, mi5_1;

        //This section builds the menu bar.
        mb = new MenuBar();
        setMenuBar(mb);


      Menupunkter laves og følgende switch styrer kald af menupanelerne som skal vises i hovedvinduet:

public void actionPerformed(ActionEvent e) {
              String st = e.getActionCommand();
              char s = st.charAt(0);
             
  switch(s) {
      case 'a': test.removeAll();
                test.add(new ReservationAdministration());
                test.setVisible(true);
                test.repaint();  // redraw the area
                test.validate();

    Og klassen aflsuttes med følgende:

// The main that starts the program
    public static void main(String[] args) {
        CarRentSystem window = new CarRentSystem();

// Setting up the window
        window.inAnApplet = false;
        window.setTitle("Car Rent System V 1.0");
        window.setSize(800, 600);
        window.setVisible(true);
    }


Problemet er bare at denne kode ikke virker, når jeg kører programmet kommer hovedvinduet godt nok frem, men når jeg trykker på den tilsvarende knap til et nyt vindue, sker der ingenting.

Håber der er nogen der kan give mig udførlig vejledning!!!
Jeg er ret ny i GUI kodning.


Der er 100 point til svar der fører til løsning.
Avatar billede _carsten Nybegynder
20. november 2003 - 20:34 #1
Faktisk er jeg voldsomt i tvivl om hvad der er dit egentlige problem - hvis jeg forstår dig ret, er det et CardLayout du skal bruge for at opnå hvad du ønsker, prøv køre nedenstående eksempel - måske en løsning.

Mere kan jeg ikke bidrage med i dag.


import java.awt.*;
public class CarRent extends javax.swing.JFrame {
   
    public CarRent() {
        initComponents();
        setSize(400,400);
    }
   

    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jPanel2 = new javax.swing.JPanel();
        jPanel3 = new javax.swing.JPanel();
        jPanel4 = new javax.swing.JPanel();
        jPanel5 = new javax.swing.JPanel();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenuItem2 = new javax.swing.JMenuItem();
        jMenuItem3 = new javax.swing.JMenuItem();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jLabel1.setText("I dette panel er en masse knapper og tekstfelter");
        jPanel1.add(jLabel1);

        getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH);

        jPanel2.setLayout(new java.awt.CardLayout());

        jPanel3.setBackground(new java.awt.Color(0, 102, 255));
        jPanel2.add(jPanel3, "card2");

        jPanel4.setBackground(new java.awt.Color(255, 0, 51));
        jPanel2.add(jPanel4, "card3");

        jPanel5.setBackground(new java.awt.Color(51, 153, 0));
        jPanel2.add(jPanel5, "card4");

        getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER);

        jMenu1.setText("Menu");
        jMenuItem1.setText("Vis bl\u00e5t panel");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                action1(evt);
            }
        });

        jMenu1.add(jMenuItem1);

        jMenuItem2.setText("Vis r\u00f8dt panel");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                action2(evt);
            }
        });

        jMenu1.add(jMenuItem2);

        jMenuItem3.setText("Vis gr\u00f8nt panel");
        jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                action3(evt);
            }
        });

        jMenu1.add(jMenuItem3);

        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        pack();
    }

    private void action1(java.awt.event.ActionEvent evt) {
        CardLayout cl = (CardLayout)jPanel2.getLayout();
        cl.show(jPanel2, "card2");
    }

    private void action2(java.awt.event.ActionEvent evt) {
        CardLayout cl = (CardLayout)jPanel2.getLayout();
        cl.show(jPanel2, "card3");
    }

    private void action3(java.awt.event.ActionEvent evt) {
        CardLayout cl = (CardLayout)jPanel2.getLayout();
        cl.show(jPanel2, "card4");
    }
   

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new CarRent().show();
    }
   

    private javax.swing.JLabel jLabel1;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JPanel jPanel5;   
}
Avatar billede jakobbak Nybegynder
20. november 2003 - 20:45 #2
Har set lidt på eksemplet og selvom den umiddelbart har samme effekt som jeg ønsker er det lidt forvirrende. Det jeg ønsker er blot at vide hvordan man sætter et panel fra en klasse over i et JFrame i en anden klasse.
Jeg troede egentlig at denne kode ville gøre dette:

test.add(new ReservationAdministration());

hvor test er det panel i JFrame hovedvinduet som det eksterne panel skal tilføjes til. new ReservationAdministration laver et objekt af denne klasse og det indsættes i panelet.
Avatar billede _carsten Nybegynder
20. november 2003 - 21:05 #3
Du kan godt gøre det på den måde.
Problemet skyldes formentlig layoutet i dit test panel.
Default layout i JPanel's er FlowLayout, prøv at sætte test til BorderLayout, så virker det sikkert.
Avatar billede trolle Nybegynder
21. november 2003 - 00:44 #4
hmm, jeg vil gerne lave et lille bidrag... Saa vidt jeg husker saa virker revalidate();
bedre end validate();
Avatar billede trolle Nybegynder
21. november 2003 - 00:45 #5
case 'a': test.removeAll();
                test.add(new ReservationAdministration());
                test.setVisible(true);
                test.repaint();  // redraw the area
og saa:
                test.revalidate();
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