Avatar billede jgthb Nybegynder
25. december 2008 - 16:29 Der er 4 kommentarer og
1 løsning

frame, flere panels ?

Hej

Er lige gået i gang med at lære at lave programmer med brugerinterface i Netbeans. Jeg har allerede fulgt tutorialen om en celcius-converter (http://java.sun.com/docs/books/tutorial/uiswing/learn/index.html).

Mit spørgsmål er nu, hvordan jeg kan lave et program med forskellige grænseflader, jeg kan vælge imellem. Jeg har lavet en JFrame med en menu med tre punkter, og når jeg så vælger et punkt, vil jeg have at indholdet i framen viser måske to knapper, og når jeg trykker på et andet menupunkt vises måske en tabel (og menuen skal naturligvis hele tiden kunne ses).

Mit eget gæt er, at jeg skal bruge nogle paneler, men jeg kan ikke finde ud af, hvordan jeg sætter det pågældende panel i forgrunden.

Håber nogen kan hjælpe. Tusind tak på forhånd

Mvh
Jonathan
Avatar billede arne_v Ekspert
25. december 2008 - 16:37 #1
Du kan enten fjerne og tilføje JPanel's eller du kan bruge JTabbedPane.
Avatar billede _carsten Nybegynder
26. december 2008 - 16:34 #2
Du kan også vælge at stable dine JPanels som et sæt spillekort og bruge CardLayout

import java.awt.CardLayout;
import java.awt.Color;
import javax.swing.JPanel;


public class MyFrame extends javax.swing.JFrame {
   
    public MyFrame() {
       
        initComponents();
        layout = new java.awt.CardLayout();
       
        red = new MyPanel(Color.RED);
        green = new MyPanel(Color.GREEN);
        blue = new MyPanel(Color.BLUE);
       
        getContentPane().setLayout(layout);
        getContentPane().add(red, "card_1");
        getContentPane().add(green, "card_2");
        getContentPane().add(blue, "card_3");
        setSize(400,400);
    }
   
                     
    private void initComponents() {
        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();


        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jMenu1.setText("Skift panel");
        jMenuItem1.setText("Vis r\u00f8dt panel");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                layout.show(getContentPane(), "card_1");
            }
        });

        jMenu1.add(jMenuItem1);

        jMenuItem2.setText("Vis gr\u00f8nt panel");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                layout.show(getContentPane(), "card_2");
            }
        });

        jMenu1.add(jMenuItem2);

        jMenuItem3.setText("Vis bl\u00e5t panel");
        jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                layout.show(getContentPane(), "card_3");
            }
        });

        jMenu1.add(jMenuItem3);

        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

    }                     

                         
   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MyFrame().setVisible(true);
            }
        });
    }
   
               
    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 CardLayout layout;
    private JPanel red, green, blue;
}








import java.awt.Color;
import javax.swing.JPanel;


public class MyPanel extends JPanel{
    public MyPanel(Color color) {
        setBackground(color);
    }
}
Avatar billede jgthb Nybegynder
28. december 2008 - 18:50 #3
jeg skulle måske have været lidt mere klar med formuleringen. mit spørgsmål var, om man kunne sætte et JPanel til at være usynligt henholdsvis synligt, men altså uden at slette det. Jeg har fundet en løsning til selve programmet (bruger JTabbedPane, som arne_v foreslog), men selve spørgsmålet vil jeg stadig gerne have besvaret.

I øvrigt må du gerne lægge et svar arne_v, og ellers tak for foreslaget til dig, carsten.
Avatar billede arne_v Ekspert
28. december 2008 - 22:43 #4
Man kan godt gøre dem switch JPanels visible/notvisible, men jeg kan umiddelbart ikke
få layout til at bruge de tomme huller.

Eksempel:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class SwitchOnOff extends JFrame implements ActionListener {
    private JPanel p1;
    private JPanel p2;
    private int n;
    public SwitchOnOff() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Demo");
        getContentPane().setLayout(new BorderLayout());
        JButton toggle = new JButton("Toogle");
        toggle.addActionListener(this);
        getContentPane().add(toggle, BorderLayout.SOUTH);
        JPanel both = new JPanel();
        both.setLayout(new GridLayout(1, 2));
        p1 = new JPanel();
        p1.setBackground(Color.BLUE);
        p1.setPreferredSize(new Dimension(100, 100));
        both.add(p1);
        p2 = new JPanel();
        p2.setBackground(Color.RED);
        p2.setPreferredSize(new Dimension(100, 100));
        both.add(p2);
        getContentPane().add(both, BorderLayout.CENTER);
        n = 0;
        pack();
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        n++;
        switch(n % 4) {
            case 0:
                p1.setVisible(true);
                p2.setVisible(true);
                break;
            case 1:
                p1.setVisible(true);
                p2.setVisible(false);
                break;
            case 2:
                p1.setVisible(false);
                p2.setVisible(true);
                break;
            case 3:
                p1.setVisible(false);
                p2.setVisible(false);
                break;
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new SwitchOnOff();
                f.setVisible(true);
            }
        });
    }
}
Avatar billede arne_v Ekspert
28. december 2008 - 22:43 #5
og et 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