Avatar billede aslan Nybegynder
26. april 2002 - 15:42 Der er 25 kommentarer og
1 løsning

Skifte mellem paneler?

Hvordan kan jeg skifte mellem paneler i frames i java? Gerne et eksempel!
Avatar billede codemon Nybegynder
26. april 2002 - 16:20 #1
Brug java.awt.CardLayout
Avatar billede codemon Nybegynder
26. april 2002 - 16:25 #2
/*
* Swing version.
*/

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

public class CardWindow extends JFrame
                        implements ItemListener {
    boolean inAnApplet = true;
   
    JPanel cards;
    final static String BUTTONPANEL = "JPanel with JButtons";
    final static String TEXTPANEL = "JPanel with JTextField";

    public CardWindow() {
        Container contentPane = getContentPane();

        //Put the JComboBox in a JPanel to get a nicer look.
        String comboBoxItems[] = { BUTTONPANEL, TEXTPANEL };
        JPanel cbp = new JPanel();
        JComboBox c = new JComboBox(comboBoxItems);
        c.setEditable(false);
        c.addItemListener(this);
        cbp.add(c);

        //Use the default layout manager, BorderLayout
        contentPane.add(cbp, BorderLayout.NORTH);

        cards = new JPanel();
        cards.setLayout(new CardLayout());
 
        JPanel p1 = new JPanel();
        p1.add(new JButton("Button 1"));
        p1.add(new JButton("Button 2"));
        p1.add(new JButton("Button 3"));

        JPanel p2 = new JPanel();
        p2.add(new JTextField("TextField", 20));

        cards.add(p1, BUTTONPANEL);
        cards.add(p2, TEXTPANEL);
        contentPane.add(cards, BorderLayout.CENTER);
       
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                if (inAnApplet) {
                    dispose();
                } else {
                    System.exit(0);
                }
            }
        });
    }

    public void itemStateChanged(ItemEvent evt) {
        // skift imellem cardlayouts textfield eller buttons
        CardLayout cl = (CardLayout)(cards.getLayout());
        cl.show(cards, (String)evt.getItem());
    }

    public static void main(String args[]) {
        CardWindow window = new CardWindow();
        window.inAnApplet = false;

        window.setTitle("CardLayout");
        window.pack();
        window.setVisible(true);
    }
}
Avatar billede aslan Nybegynder
26. april 2002 - 16:25 #3
codemon kunne du ikke vise mig et lille eksempel på hvordan jeg skulle kunne bruge det?
Avatar billede carstenknudsen Nybegynder
26. april 2002 - 16:25 #4
Nu skriver du ikke hvordan skiftet skal foregå,
men en mulighed der ofte er brugbar ved
manuelle skift er JTabbedPane. Til den
kan du tilføje alt der nedarver fra Component.
Eksempel:
JTabbedPane tabbedPane = new JTabbedPane();
Component c1 = new MyJPanel();
tabbedPane.add( c1 );
Component c2 = new ....;
tabbedPane.add( c2 );
// og så videre
Du kan så ved at trykke på en enkelte
tabs skifte mellem de forskellige komponenter
du har tilføjet. Dit JTabbedPane kan f.eks.
indgå i en JFrame eller et JPanel.
Avatar billede aslan Nybegynder
26. april 2002 - 18:44 #5
Jeg har fulgt dit råde carstenknudsen og fundet denne :

import javax.swing.JTabbedPane;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;

import java.awt.*;
import java.awt.event.*;
import java.sql.*;

public class TabbedPaneDemo extends JPanel {
    public TabbedPaneDemo() {
        ImageIcon icon = new ImageIcon("middle.gif");
        JTabbedPane tabbedPane = new JTabbedPane();

        Component panel1 = makeTextPanel("Blahdsgs");
        tabbedPane.addTab("One", icon, panel1, "Does nothing");
        tabbedPane.setSelectedIndex(0);

        Component panel2 = new FrontEnd();
        tabbedPane.addTab("Two", icon, panel2, "Does twice as much nothing");

        Component panel3 = makeTextPanel("Blah blah blah");
        tabbedPane.addTab("Three", icon, panel3, "Still does nothing");

        Component panel4 = makeTextPanel("Blah blah blah blah");
        tabbedPane.addTab("Four", icon, panel4, "Does nothing at all");

        //Add the tabbed pane to this panel.
        setLayout(new GridLayout(1, 1));
        add(tabbedPane);
    }

    protected Component makeTextPanel(String text) {
        JPanel panel = new JPanel(false);
        JLabel filler = new JLabel(text);
        filler.setHorizontalAlignment(JLabel.CENTER);
        panel.setLayout(new GridLayout(1, 1));
        panel.add(filler);
        return panel;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("TabbedPaneDemo");
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {System.exit(0);}
        });

        frame.getContentPane().add(new TabbedPaneDemo(),
                                  BorderLayout.CENTER);
        frame.setSize(400, 400);
        frame.setVisible(true);
    }
}


hvor jeg har lavet Component panel2 = new FrontEnd(). class FrontEnd er så:

import java.sql.*;
import java.awt.*;
import java.awt.event.*;

class FrontEnd extends Frame implements ActionListener
{
    TextField Skriv;
    TextArea Felt;
    Button    Afsend,Tøm,Luk,Fortryd;
    ConnectDB db;

    public FrontEnd()
    {
        db = new ConnectDB( "jdbc:interbase://localhost/C:/Documents and Settings/aslan/Skrivebord/ConnectDB/hotellazy.gdb", "sysdba", "masterkey" );



        setLayout( new FlowLayout( FlowLayout.CENTER, 250, 10 ) );
        Felt = new TextArea(10,40);
        Felt.setEditable(false);
        Felt.setVisible(true);
        add(Felt);

        Skriv = new TextField( 30 );
        Skriv.requestFocus();
        add(Skriv);

        Afsend = new Button( "Indsæt" );
        Afsend.addActionListener(this);
        Afsend.setVisible(true);
        add( Afsend );

        addWindowListener( new WindowAdapter()
        {
            public void windowClosing( WindowEvent e )
            {
                System.exit(0);
            }
        });

        setVisible( true );
    }


    public void actionPerformed( ActionEvent e )
    {

        if( e.getSource() == Afsend )
        {

        smidInd();
        tagUd();

        }

    }
    public void smidInd()
    {
        db.Insert( "INSERT INTO Navne VALUES( '"+Skriv.getText()+"' )" );
        Skriv.setText("");
    }
    public void tagUd()
    {
        Felt.setText("");
        try
        {
            ResultSet row = db.Select( "SELECT * FROM Navne" );

            while( row.next() )
            {
                Felt.append( row.getString(1)+"\n" );
            }
        }
        catch( SQLException cs )
        {
            System.out.println( cs );
        }
    }
    public void TømDB()
    {
        db.Insert("DELETE FROM Navne");
        Felt.setText("");

    }

    public static void main( String args[] )
    {
        new FrontEnd();
    }
}


Men det giver fejl ?
Avatar billede carstenknudsen Nybegynder
26. april 2002 - 18:51 #6
Hvor giver hvad fejl? Er det under
compilering eller under kørsel og
hvad er fejlen, er det en exception
eller en error?
Avatar billede aslan Nybegynder
26. april 2002 - 18:56 #7
Jeg kan sagtens compile filerne men når jeg forsøger at køre dem siger den Iligal.argument.exception adding a window to a container
Avatar billede carstenknudsen Nybegynder
26. april 2002 - 19:01 #8
Prøv at bruge en JFrame i stedet for en Frame
og når du add'er framen skal du ikke add'e
framen men framen.getContentPane().
Avatar billede aslan Nybegynder
26. april 2002 - 19:11 #9
Jeg er ikke helt med når du siger at jeg skal framen.getContentPane()?
Avatar billede carstenknudsen Nybegynder
26. april 2002 - 20:17 #10
En JFrame er i sig selv et vindue og kan
ikke umiddelbart tilføjes til et andet
vindue. Derimod kan en JFrames contentPane
direkte tilføjes et andet vindue. Alt
fra din JFrame pånær JMenuBar kommer så
med (det er grunden til at jeg selv kun
yderst sjældent bruger JMenuBar).
JTabbedPane pane = new JTabbedPane();
...
JFrame frame = new FrontEnd();
pane.add( frame.getContentPane() );
I dit tilfælde skal din kode der hedder
Component panel2 = new FrontEnd();
tabbedPane.addTab("Two", icon, panel2, "Does twice as much nothing");
bare skrives som
JFrame panel2 = new FrontEnd();
tabbedPane.addTab("Two", icon, panel2.getContentPane(), "Does twice as much nothing");
eller
Component panel2 = (new FrontEnd()).getContentPane();
tabbedPane.addTab("Two", icon, panel2, "Does twice as much nothing");
Avatar billede aslan Nybegynder
26. april 2002 - 20:22 #11
Jeg får 2 forskellige fejl:

C:\Documents and Settings\aslan\Skrivebord\TabbedPaneDemo.java:20: cannot resolve symbol
symbol  : method getContentPane  ()
location: class FrontEnd
Component panel2 = (new FrontEnd()).getContentPane();
                  ^
1 error

C:\Documents and Settings\aslan\Skrivebord\TabbedPaneDemo.java:20: incompatible types
found  : FrontEnd
required: javax.swing.JFrame
JFrame panel2 = new FrontEnd();
                ^
1 error
Avatar billede carstenknudsen Nybegynder
26. april 2002 - 20:26 #12
Brug den sidste løsning med
JFrame panel2 = new FrontEnd();
men for at bruge den skal du lade
FrontEnd extend'e JFrame og ikke Frame.
Avatar billede aslan Nybegynder
26. april 2002 - 20:31 #13
Så giver frontEnd fejl?

C:\Documents and Settings\aslan\Skrivebord\FrontEnd.java:5: cannot resolve symbol
symbol  : class JFrame 
location: class FrontEnd
class FrontEnd extends JFrame implements ActionListener
                      ^
C:\Documents and Settings\aslan\Skrivebord\FrontEnd.java:18: cannot resolve symbol
symbol  : method setLayout  (java.awt.FlowLayout)
location: class FrontEnd
        setLayout( new FlowLayout( FlowLayout.CENTER, 250, 10 ) );
                ^
C:\Documents and Settings\aslan\Skrivebord\FrontEnd.java:22: cannot resolve symbol
symbol  : method add  (java.awt.TextArea)
location: class FrontEnd
        add(Felt);
        ^
C:\Documents and Settings\aslan\Skrivebord\FrontEnd.java:26: cannot resolve symbol
symbol  : method add  (java.awt.TextField)
location: class FrontEnd
        add(Skriv);
                ^
C:\Documents and Settings\aslan\Skrivebord\FrontEnd.java:31: cannot resolve symbol
symbol  : method add  (java.awt.Button)
location: class FrontEnd
        add( Afsend );
                ^
C:\Documents and Settings\aslan\Skrivebord\FrontEnd.java:33: cannot resolve symbol
symbol  : method addWindowListener  (<anonymous java.awt.event.WindowAdapter>)
location: class FrontEnd
        addWindowListener( new WindowAdapter()
                ^
C:\Documents and Settings\aslan\Skrivebord\FrontEnd.java:41: cannot resolve symbol
symbol  : method setVisible  (boolean)
location: class FrontEnd
        setVisible( true );
                ^
7 errors
Avatar billede carstenknudsen Nybegynder
26. april 2002 - 20:34 #14
Du kan tilføje i starten af constructoren
Container panel = getContentPane();
for alle de fejl du har fået meddelt
ovenfor skal du skrive panel. foran:
panel.add( Afsend );
panel.setLayout(...);
og så videre.
Avatar billede aslan Nybegynder
26. april 2002 - 20:40 #15
ok nu er jeg nede på 2 fejl:

C:\Documents and Settings\aslan\Skrivebord\FrontEnd.java:5: cannot resolve symbol
symbol  : class JFrame 
location: class FrontEnd
class FrontEnd extends JFrame implements ActionListener
                      ^
C:\Documents and Settings\aslan\Skrivebord\FrontEnd.java:15: cannot resolve symbol
symbol  : method getContentPane  ()
location: class FrontEnd
        Container panel = getContentPane();
                                  ^
2 errors
Avatar billede carstenknudsen Nybegynder
26. april 2002 - 20:50 #16
Du skal importere:
import javax.swing.*;
så skulle metodekaldet getContentPane()
også blive genkendt. Du skal nok vænne
dig til at bruge komponenterne i
javax.swing istedet for dem i java.awt,
de er bedre og der er flere af dem.
Håber det virker nu.
Avatar billede aslan Nybegynder
26. april 2002 - 21:06 #17
Tusind tak:)
Avatar billede aslan Nybegynder
27. april 2002 - 00:27 #18
Hva er egentlig forskellen på Frame og JFrame?
Avatar billede aslan Nybegynder
27. april 2002 - 01:22 #19
Og af et eller anden grund bliver alle frames blandet sammen i starten indtil man har trykket på dem... jeg kunne forstille mig at tabbedPane.setSelectedIndex(0);  ikke virker som den burde?
Avatar billede carstenknudsen Nybegynder
27. april 2002 - 09:10 #20
Jeg kender ikke til det sidstnævnte problem.
Prøv at tilføje dine komponenter og lad
være med at bruge setSelectedIndex det virker
ihvertfald for mig.
Forskellen mellem Frame og JFrame er at
sidstnævnte er en af de nyere (ikke
så nyt længere) swing komponenter, som
du primært finder i javax.swing, men der
er også andre associerede klasser der ligger
i javax.swing.border, javax.swing.event osv.
Komponenterne i swing er såkaldt letvægts
komponenter, dvs. at de modsat java.awt
komponenterne (såsom Frame) ikke afhænger af
det underliggende systems vinduer/komponenter.
Det betyder at dine applikationer vil se
mere ens ud på forskellige platforme.
Derudover findes der langt flere swing
komponenter (de fleste hedder JFrame,
JButton, JLabel, du ser systemet) der har
langt mere funktionalitet end awt komponenterne.
Der er sådan set kun et enkelt problem og
det er at en del browsere ikke understøtter
swing, men det har kun betydning for dem
der skriver applets (og det gætter jeg på
er de færreste). Overvej at skifte til swing
med det samme, kig på java.sun.com og se
på nogle af de tutorials der findes der.
Avatar billede aslan Nybegynder
27. april 2002 - 09:21 #21
takker det hjalp :) Et sidste spørgsmål så skal jeg nok lade være med at forstyrre dig:). Af et eller anden grund dækker textfielden hele fladen når jeg kører dette?

    Reservation()
    {

        Container panel = getContentPane();

        panel.setLayout(new BorderLayout() );
        panel.add("North",new JLabel("ReservationsNr"));
        skrivNr = new JTextField(20);
        panel.add("Center",skrivNr);




    }
Avatar billede carstenknudsen Nybegynder
27. april 2002 - 11:25 #22
Når jeg opretter det angivne har de de
korrekte størrelser. Måske er det del
af noget større? Nogle elementer kan
sagtens svulme op hvis der er meget
plads til stede. Har du sat en eksplicit
størrelse på JFrame'en eller hvad det
ligger i?
Avatar billede aslan Nybegynder
27. april 2002 - 14:04 #23
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Reservation extends JFrame implements ActionListener
{

    JButton opret,søg,opdater,slet,nyGæst,søgGæst,afslut,checkInd,checkUd;
    JTextField skrivNr,skrivUdlStart,skrivUdlSlut,gæstNr;

    Reservation()
    {

        Container panel = getContentPane();

        panel.setLayout(new BorderLayout() );
        panel.add("North",new JLabel("ReservationsNr"));
        skrivNr = new JTextField(20);
        panel.add("Center",skrivNr);




    }
    public void actionPerformed( ActionEvent e )
    {

      if( e.getSource() == opret );
      {

      }


    }
    public static void main(String[] aslan)
    {
        new Reservation();
    }


}
Avatar billede carstenknudsen Nybegynder
27. april 2002 - 21:54 #24
Ingen pack og show?
Avatar billede aslan Nybegynder
27. april 2002 - 21:57 #25
ehm hva er det?
Avatar billede aslan Nybegynder
27. april 2002 - 22:11 #26
Hved du hvad du har gjort dit jeg siger 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