Avatar billede bsp Nybegynder
11. september 2002 - 21:50 Der er 10 kommentarer og
1 løsning

Udskiftning af JPanel

Hej

Jeg sidder lige med et mærkeligt problem..

Jeg har en frame hvori der bliver add'et et Panel. Dette Panel har en knap, hvorpå at jeg trykker på denne skulle det eksisterende panel på frame udskiftes med et andet panel..

nogen der kan hjælpe eventuelt med noget kode..
Avatar billede aslan Nybegynder
11. september 2002 - 22:23 #1
har du forsøgt dig med setVisible(false) og setVisible(true)?
Avatar billede bsp Nybegynder
12. september 2002 - 09:32 #2
Hmm synes ikke rigtig at jeg kan få det til at virke.. jeg poster lige min kildekode.. den består af tre selvstændige klasser..

Min frame klasse:

public class Index extends JApplet {
  private int width = 550, height = 450;
  private MenuPanel mPanel;

  public void init() {
    mPanel = new MenuPanel();

    Container c = getContentPane();
    c.add( mPanel );
  }

  public void setWidth( int w )
    { width = ( w >= 0 ? w : 550 ); }

  public void setHeight( int h )
    { height = ( h >= 0 ? h : 450 ); }

  public static void main( String args[] ) {
    int width, height;

    if ( args.length != 2 ) {
      width = 550;
      height = 450;
    }
    else {
      width = Integer.parseInt( args[0] );
      height = Integer.parseInt( args[1] );
    }

    JFrame app = new JFrame( "VFU" );
    app.addWindowListener(
      new WindowAdapter() {
        public void windowClosing( WindowEvent e ) {
          System.exit( 0 );
        }
      }
    );

    Index appletObject = new Index();
    appletObject.setWidth( width );
    appletObject.setHeight( height );

    appletObject.init();
    appletObject.start();

    app.getContentPane().add( appletObject );
    app.setSize( width, height );
    app.show();
  }
}

Mit ene panel:

public class MenuPanel extends JPanel {
  //private int width = 400, height = 365;
  private JLabel info = new JLabel();
  private JLabel ramme1 = new JLabel();
  private JLabel ramme2 = new JLabel();
  private JTextField navnField = new JTextField();
  private JTextField skoleField = new JTextField();
  private JLabel navn = new JLabel();
  private JLabel skole = new JLabel();
  private JButton hjaelp = new JButton();
  private JButton logaf = new JButton();
  private JLabel ramme3 = new JLabel();
  private JButton udbud = new JButton();
  private JButton tilmeld = new JButton();
  private JButton blanket = new JButton();
  private JLabel udbudLabel = new JLabel();
  private JLabel tilmeldLabel = new JLabel();
  private JLabel udskrivLabel = new JLabel();
  private LogindPanel lPanel;

  public MenuPanel() {
    ButtonHandler handler = new ButtonHandler();
    info.setFont(new java.awt.Font("Dialog", 0, 18));
    info.setForeground(SystemColor.desktop);
    info.setText("Menu - Folkeskole:");
    info.setBounds(new Rectangle(21, 24, 174, 21));
    this.setLayout(null);
    ramme1.setBorder(BorderFactory.createEtchedBorder());
    ramme1.setBounds(new Rectangle(7, 8, 386, 350));
    ramme2.setBorder(BorderFactory.createEtchedBorder());
    ramme2.setBounds(new Rectangle(7, 52, 386, 306));
    navnField.setEnabled(false);
    navnField.setBorder(BorderFactory.createEtchedBorder());
    navnField.setBounds(new Rectangle(55, 61, 135, 21));
    skoleField.setEnabled(false);
    skoleField.setBorder(BorderFactory.createEtchedBorder());
    skoleField.setBounds(new Rectangle(245, 61, 135, 21));
    navn.setFont(new java.awt.Font("Dialog", 0, 12));
    navn.setForeground(Color.black);
    navn.setText("Navn:");
    navn.setBounds(new Rectangle(20, 65, 41, 17));
    skole.setFont(new java.awt.Font("Dialog", 0, 12));
    skole.setForeground(Color.black);
    skole.setToolTipText("");
    skole.setText("Skole:");
    skole.setBounds(new Rectangle(208, 65, 41, 17));
    hjaelp.setBounds(new Rectangle(304, 327, 81, 24));
    hjaelp.setBorder(BorderFactory.createEtchedBorder());
    hjaelp.setText("Hjælp");
    logaf.setBounds(new Rectangle(14, 327, 81, 24));
    logaf.setBorder(BorderFactory.createEtchedBorder());
    logaf.setText("Log af");
    logaf.addActionListener(handler);
    ramme3.setBorder(BorderFactory.createEtchedBorder());
    ramme3.setBounds(new Rectangle(7, 90, 386, 231));
    udbud.setBounds(new Rectangle(50, 135, 81, 24));
    udbud.setBorder(BorderFactory.createEtchedBorder());
    udbud.setText("Se udbud");
    tilmeld.setBounds(new Rectangle(50, 169, 81, 24));
    tilmeld.setBorder(BorderFactory.createEtchedBorder());
    tilmeld.setText("Tilmeld");
    blanket.setBounds(new Rectangle(50, 202, 81, 24));
    blanket.setBorder(BorderFactory.createEtchedBorder());
    blanket.setText("Udskriv");
    udbudLabel.setFont(new java.awt.Font("Dialog", 0, 12));
    udbudLabel.setForeground(Color.black);
    udbudLabel.setText(": Se diverse kurser der er udbudt.");
    udbudLabel.setBounds(new Rectangle(150, 138, 210, 17));
    tilmeldLabel.setFont(new java.awt.Font("Dialog", 0, 12));
    tilmeldLabel.setForeground(Color.black);
    tilmeldLabel.setText(": Tilmeld elever til præsentationskursus.");
    tilmeldLabel.setBounds(new Rectangle(150, 172, 224, 17));
    udskrivLabel.setFont(new java.awt.Font("Dialog", 0, 12));
    udskrivLabel.setForeground(Color.black);
    udskrivLabel.setText(": Udskriv tilmeldingsblanketter.");
    udskrivLabel.setBounds(new Rectangle(150, 205, 172, 17));
    this.add(info, null);
    this.add(navn, null);
    this.add(navnField, null);
    this.add(skoleField, null);
    this.add(skole, null);
    this.add(hjaelp, null);
    this.add(logaf, null);
    this.add(ramme3, null);
    this.add(ramme1, null);
    this.add(ramme2, null);
    this.add(udbud, null);
    this.add(tilmeld, null);
    this.add(blanket, null);
    this.add(udbudLabel, null);
    this.add(tilmeldLabel, null);
    this.add(udskrivLabel, null);
  }

  private class ButtonHandler implements ActionListener {
    public void actionPerformed( ActionEvent e ) {
      lPanel = new LogindPanel();
      //lPanel.setVisible(true);
      setVisible(false);
    }
  }
}

og mit andet panel:

public class LogindPanel extends JPanel {
  private JTextField brugerField = new JTextField();
  private JPasswordField adgangField = new JPasswordField();
  private JLabel info = new JLabel();
  private JLabel ramme1 = new JLabel();
  private JLabel ramme2 = new JLabel();
  private JLabel bruger = new JLabel();
  private JLabel adgang = new JLabel();
  private JLabel net = new JLabel();
  private JLabel loginfo = new JLabel();
  private JLabel loginfo2 = new JLabel();
  private JLabel vfu = new JLabel();
  private JButton logind = new JButton();

  public LogindPanel() {
    brugerField.setBorder(BorderFactory.createEtchedBorder());
    brugerField.setBounds(new Rectangle(200, 135, 100, 21));
    this.setLayout(null);
    adgangField.setBorder(BorderFactory.createEtchedBorder());
    adgangField.setBounds(new Rectangle(200, 165, 100, 21));
    info.setFont(new java.awt.Font("Dialog", 0, 18));
    info.setForeground(SystemColor.desktop);
    info.setText("VFU systemlogind:");
    info.setBounds(new Rectangle(21, 24, 289, 21));
    ramme1.setBorder(BorderFactory.createEtchedBorder());
    ramme1.setBounds(new Rectangle(6, 6, 387, 288));
    ramme2.setBorder(BorderFactory.createEtchedBorder());
    ramme2.setBounds(new Rectangle(6, 6, 387, 47));
    bruger.setText("Brugernavn:");
    bruger.setBounds(new Rectangle(100, 137, 78, 17));
    bruger.setFont(new java.awt.Font("Dialog", 0, 12));
    bruger.setForeground(Color.black);
    adgang.setText("Adgangskode:");
    adgang.setBounds(new Rectangle(100, 167, 85, 17));
    adgang.setFont(new java.awt.Font("Dialog", 0, 12));
    adgang.setForeground(Color.black);
    this.setBackground(SystemColor.control);
    //net.setIcon(new ImageIcon(new java.net.URL("file:///C:/My Documents/My Pictures/net.jpg")));
    net.setBounds(new Rectangle(80, 89, 40, 40));
    loginfo.setText("Indtast brugernavn og adgangskode");
    loginfo.setBounds(new Rectangle(125, 90, 218, 17));
    loginfo.setFont(new java.awt.Font("Dialog", 0, 12));
    loginfo.setForeground(Color.black);
    loginfo2.setText("for at logge på systemet.");
    loginfo2.setBounds(new Rectangle(125, 105, 218, 17));
    loginfo2.setFont(new java.awt.Font("Dialog", 0, 12));
    loginfo2.setForeground(Color.black);
    vfu.setFont(new java.awt.Font("Dialog", 0, 10));
    vfu.setForeground(SystemColor.desktop);
    vfu.setText("© Copyright 2002 VFU-Vestsjælland");
    vfu.setBounds(new Rectangle(114, 234, 177, 17));
    logind.setBounds(new Rectangle(220, 195, 80, 24));
    logind.setBorder(BorderFactory.createEtchedBorder());
    logind.setText("Log på");
    this.add(info, null);
    this.add(ramme2, null);
    this.add(brugerField, null);
    this.add(adgangField, null);
    this.add(bruger, null);
    this.add(adgang, null);
    this.add(net, null);
    this.add(loginfo, null);
    this.add(loginfo2, null);
    this.add(logind, null);
    this.add(ramme1, null);
    this.add(vfu, null);
  }
}
Avatar billede carstenknudsen Nybegynder
12. september 2002 - 14:58 #3
Du opretter godt nok et nyt LogindPanel, men det er ikke
nok, du skal også lægge det ind et eller andet sted.
Det oprindelige lPanel ændres ikke af det nye objekt.
Du skal derfor erstatte det gamle lPanel med det nye,
eller helt erstatte det tidligere indhold med det
nye lPanel.Det skal foregå i din ButtonHandler.
Avatar billede bsp Nybegynder
12. september 2002 - 15:53 #4
Ja men hvordan skal den Buttonhandler egentlig se ud så.. jeg har prøvet mange ting og ingenting virker
Avatar billede carstenknudsen Nybegynder
13. september 2002 - 11:39 #5
Jeg vil foreslå at din ButtonHandler får en construktor der
får overført noget information, f.eks. den JApplet den skal
kommunikere med. I actionPerformed skal du så have erstattet
det JPanel du kom ind i JApplet'en med det nye LogindPanel.
Det bliver nødvendigt at bruge remove metoden og dernæst
add'e det nye LogindPanel, hvorefter det formentlig bliver
nødvendigt at kalde repaint metoden for at få det til at virke.
Jeg kan prøve at konstruere et simplere eksempel hvor du kan
se det virke, men det bliver for en JFrame ikke en JApplet.
Avatar billede carstenknudsen Nybegynder
13. september 2002 - 12:42 #6
Her er et simpelt eksempel hvor der er to JPanels der
udskiftes med hindanden når den sidste knap (button)
aktiveres. Det viser princippet i hvad du skal gøre.
Med mere komplicerede layouts bliver det lidt mere
kompliceret.
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class AFrame extends JFrame implements ActionListener {
    private JPanel panel1, panel2;
    private JButton button1, button2;
    private Container c;
    public AFrame() {
    super( "This is AFrame" );
        c = getContentPane();
    c.setLayout( new FlowLayout() );
    panel1 = new JPanel( new FlowLayout() );
    panel2 = new JPanel( new FlowLayout() );
    button1 = new JButton( "button 1" );
    button2 = new JButton( "button 2" );
    button1.addActionListener( this );
    button2.addActionListener( this );
    panel1.add( new JLabel( "a label" ) );
    panel1.add( button1 );
    panel2.add( button2 );
    panel2.add( new JLabel( "another label" ) );
    JPanel panel3 = new JPanel( new FlowLayout() );
    panel3.add( new JRadioButton( "Click me!" ) );
    panel3.add( new JButton( "Push me!" ) );
    c.add( panel3 );
    c.add( panel1 );
    pack();
    }
    public void actionPerformed( ActionEvent ae ) {
    Object source = ae.getSource();
    if ( source.equals( button1 ) ) {
        c.remove( panel1 );
        c.add( panel2 );
        pack();
    }
    else if ( source.equals( button2 ) ) {
        c.remove( panel2 );
        c.add( panel1 );
        pack();
    }
    }
    public static void main( String[] args ) {
    JFrame frame = new AFrame();
    frame.show();
    }
}
Avatar billede bsp Nybegynder
15. september 2002 - 12:51 #7
Jeg kan ikke rigtig få det til at virke medmindre jeg opretter det nye panel i samme frame..
Avatar billede carstenknudsen Nybegynder
15. september 2002 - 19:06 #8
Kan du få mit eksempel til at køre?
Her kører det.
Avatar billede bsp Nybegynder
16. september 2002 - 08:40 #9
Jeg kan kører dit eksempel.. men jeg kan fx ikke kører det hvis jeg sætter den til at hente et panel fra en anden klasse
Avatar billede carstenknudsen Nybegynder
16. september 2002 - 10:29 #10
Du bliver altså nødt til at specificere lidt nærmere hvad du
mener med at du ikke kan køre det. Hvad helt præcist er det
der ikke virker og hvordan ser du det. Der burde ikke være
noget problem ved at hente panel'er fra andre klasser, de
to JPanels jeg benytter kunne lige så godt komme andet steds fra.
Avatar billede bsp Nybegynder
19. september 2002 - 11:15 #11
fandt selv ud af det men tak
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