Avatar billede saxtus Nybegynder
12. marts 2004 - 12:30 Der er 35 kommentarer og
1 løsning

udskiftning og indsætning af JPanel

Hejsa

Jeg har et problem med udskiftning af JPanels.
jeg skal have det 2 steder, og det ene sted kan jeg godt få det at virke, men det andet sted vil den bare ikke - eller jo det vil den godt, men så skal vinduet have været vist først fra det første sted.
Mit metode kald er det samme begge steder, så det virker mystisk.

Det ene sted (som virker) er fra en JTabbedPane hvor den lytter på om jeg skifter faneblad.
Den anden der ikke virker er fra en knap.

hvis i vil se noget kode skal i bare sige til
Avatar billede funkyloonie Nybegynder
12. marts 2004 - 14:26 #1
kunne det være noget med manglende opdatering af grænseflade? prøv med noget updateUI() eller Validate() eller repaint().

Får du en fejl?

Er du sikker på knappen løber al den samme kode igennem som fanebladet?
Avatar billede saxtus Nybegynder
12. marts 2004 - 14:48 #2
Jeg bruger denne her

  public void SkiftPanel(JPanel panel){
    int comp = 0;

    while(c.getComponent(comp) == Svandret || c.getComponent(comp) == VareBeskrivelse.hentInstans() || c.getComponent(comp) == TabMenu.hentInstans()){
      comp++;
    }
    c.remove(c.getComponent(comp));
    c.add(panel, " 4, 1");
    repaint();
  }

og så sender jeg det panel af sted som jeg skal have vist
Avatar billede saxtus Nybegynder
12. marts 2004 - 14:52 #3
synes at det er underligt for den fjerner panelet godt nok.
Jeg har enda kopieret mit metodekald fra mit faneblad.

Main.hentInstans().SkiftPanel(SælgVare.hentInstans());
Avatar billede _carsten Nybegynder
13. marts 2004 - 09:33 #4
I stedet for at tilføje og fjerne JPanels i en kørende app, bør du egentlig lægge stilen om og anvende CardLayout i stedet for, med mindre de paneler du skifter i mellem skal have forskellig størrelse, prøv et teste nedenstående eksempel


import java.awt.*;
public class Exp476419 extends javax.swing.JFrame {

    public Exp476419() {
        initComponents();
        setSize(400,400);
    }


    private void initComponents() {
        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);
            }
        });

        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 Exp476419().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 saxtus Nybegynder
15. marts 2004 - 09:59 #5
jeg har aldrig arbejdet med cardLayout, det jeg bruger her er tablelayout og synes eller at det virker fint. men kunne jo godt være at man skulle prøve det.

kan det re-size??
Avatar billede _carsten Nybegynder
15. marts 2004 - 10:10 #6
CardLayout fungerer på samme måde som et spil kort, hvor alle kort har nøjagtig samme størrelse og du kan tage et hvilket som helst kort i bunken og lægge det øverst

Du kan resize, men alle kort vil hele tiden have samme størrelse

D.v.s i din JTabbedPane kunne du smide et JPanel og sætte Layout = CardLayout
så fylder du dit Layout op med de JPanels der nu skal være, så kan du i stedet
for at fjerne og tilføje paneler, bare skifte imellem dem, hvilket giver roligere
billede.
Avatar billede saxtus Nybegynder
15. marts 2004 - 11:00 #7
jeg har lige forsøgt mig lidt med det der cardlayout, men kan ikke lige hitte ud af det. Det her er hvad jeg har lavet, ved ikke om det er rigtigt.

package Kildekode.GUI;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CardPanel {
  private JPanel cards; //a panel that uses CardLayout
  private static CardPanel instans;

  // Singleton
  public static CardPanel hentInstans(){
    if (instans == null)
      instans = new CardPanel();
    return instans;
  }

  public void CardPanel(){
    //Create the "cards".
    JPanel card1 = new JPanel();
    JPanel card2 = new JPanel();
    JPanel card3 = new JPanel();

    card1.add("", SælgVare.hentInstans());
    card2.add("", IndkøbVare.hentInstans());
    card3.add("", LagerVare.hentInstans());

    //Create the panel that contains the "cards".
    cards = new JPanel(new CardLayout());
    cards.add(card1);
    cards.add(card2);
    cards.add(card3);
  }
}

hvordan vælger jeg hvilket kort der skal vises mm.
Avatar billede _carsten Nybegynder
15. marts 2004 - 11:28 #8
Dette var en måde at gøre det på
Ændringer/tilføjelser markeret med XXXXX

public class CardPanel {
  private JPanel cards; //a panel that uses CardLayout
  private static CardPanel instans;
  private CardLayout layout;  XXXXXXXXXXXXXXXXXXXXXXXXXXXX

  // Singleton
  public static CardPanel hentInstans(){
    if (instans == null)
      instans = new CardPanel();
    return instans;
  }

  public void CardPanel(){
    //Create the "cards".
    JPanel card1 = new JPanel();
    JPanel card2 = new JPanel();
    JPanel card3 = new JPanel();

    card1.add("", SælgVare.hentInstans());
    card2.add("", IndkøbVare.hentInstans());
    card3.add("", LagerVare.hentInstans());

    //Create the panel that contains the "cards".
    cards = new JPanel(new CardLayout());
    cards.add(card1);
    cards.add(card2);
    cards.add(card3);
   
    layout = (CardLayout)cards.getLayout();  XXXXXXXXXXX
  }

  //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  private void visCard1(){
    layout.show(cards, "card1");
  }

  private void visCard2(){
    layout.show(cards, "card2");
  }

  private void visCard3(){
    layout.show(cards, "card3");
  }
}
Avatar billede saxtus Nybegynder
15. marts 2004 - 11:32 #9
kan du så ikke lave en metode til mig der kan skifte kort for mig?
Avatar billede saxtus Nybegynder
15. marts 2004 - 11:33 #10
den skal kunne tilgås fra andre filer
Avatar billede _carsten Nybegynder
15. marts 2004 - 11:36 #11
Du retter dem bare fra private til public
hvis de ligger i samme package, kan du nøjes med at gøre dem protected

  public void visCard1(){
    layout.show(cards, "card1");
  }

  public void visCard2(){
    layout.show(cards, "card2");
  }

  public void visCard3(){
    layout.show(cards, "card3");
  }
Avatar billede saxtus Nybegynder
15. marts 2004 - 11:39 #12
så har jeg gjort det, men kan ikke få den til at vise noget :(

package Kildekode.GUI;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CardPanel extends JPanel{
  private JPanel cards;
  private static CardPanel instans;
  private CardLayout layout;

  // Singleton
  public static CardPanel hentInstans(){
    if (instans == null)
      instans = new CardPanel();
    return instans;
  }

  public void CardPanel(){
    //Create the "cards".
    JPanel card1 = new JPanel();
    JPanel card2 = new JPanel();
    JPanel card3 = new JPanel();

    card1.add("card1", SælgVare.hentInstans());
    card2.add("card2", IndkøbVare.hentInstans());
    card3.add("card3", LagerVare.hentInstans());

    //Create the panel that contains the "cards".
    cards = new JPanel(new CardLayout());
    cards.add(card1);
    cards.add(card2);
    cards.add(card3);

    layout = (CardLayout)cards.getLayout();
    visCard1();
  }


  public void visCard1(){
    layout.show(cards, "card1");
  }

  public void visCard2(){
    layout.show(cards, "card2");
  }

  public void visCard3(){
    layout.show(cards, "card3");
  }
}

et eller andet må jeg have gjort forkert.

i min main metode kalder jeg

    //Layoutet
    setJMenuBar(MenuBar);
    c.add(TabMenu.hentInstans(), " 1, 1, 1, 3");
    c.add(VareBeskrivelse.hentInstans(), " 4, 3");
    c.add(CardPanel.hentInstans(), " 4, 1");
    c.add(Svandret, " 4, 2");

og så burde den vel bare sætte det ind der
Avatar billede _carsten Nybegynder
15. marts 2004 - 12:31 #13
Ja - det burde den

Du extender JPanel hvilket ikke er nødvendigt, prøv at fjerne den og se om det gør hele forskellen, eller kan jeg ikke hjælpe.
Avatar billede saxtus Nybegynder
15. marts 2004 - 12:44 #14
prøver lige
Avatar billede saxtus Nybegynder
15. marts 2004 - 14:15 #15
den skriver et eller andet med

AppAccelerator(tm) 1.2.010 for Java (JDK 1.2), x86 version.
Copyright (c) 1997-1999 Inprise Corporation. All Rights Reserved.
java.lang.reflect.InvocationTargetException: java.lang.VerifyError:
(class: Kildekode/GUI/Main, method: <init> signature: ()V) Incompatible argument to function

        at Kildekode.GUI.Start.main(Start.java:63)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.borland.jbuilder.util.BootStrap.invokeMain(Unknown Source)
        at com.borland.jbuilder.util.BootStrap.main(Unknown Source)

går jeg så ind og kigger på filen Start på linie 63 finder jeg min look and feel. udkommentere jeg den så fjrener den så den linie men det virker stadig ikke
Avatar billede _carsten Nybegynder
15. marts 2004 - 14:52 #16
Det kniber lidt med tiden - (det arbejde tager meget af ens fritid)

Vender tilbage i aften, men jeg vil meget gerne flere fejlmeddelelser hvis du får nogen

Fejlen ligger sandsynligvis et andet sted.
Avatar billede _carsten Nybegynder
15. marts 2004 - 16:44 #17
Hvordan ser din main metode ud, det må være der vi skal begynde at lede efter løsningen ?

Selv om jeg aldrig selv har brugt/anvendt TableLayout (bruger altid GridBagLayout) så mener jeg ikke der er problemer i Layoutet, udfra det jeg har skimmet i dokumentationen omkring TableLayout
Avatar billede saxtus Nybegynder
15. marts 2004 - 17:38 #18
har prøvet noget mere- den skriver noget om at jeg ikke kan adde det til den awt.Container
Avatar billede _carsten Nybegynder
15. marts 2004 - 17:43 #19
Lyder spændende, som om du mixer AWT og Swing på en måde som ikke kan lade sig gøre.

Kan vi se din main() ??
Avatar billede saxtus Nybegynder
15. marts 2004 - 17:47 #20
her har vi så min main metode

  public static void main(String args[]){
    try {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    catch (Exception e){}

    Main.hentInstans();
    Start j = new Start();
    j.countDown(1);
  }
Avatar billede saxtus Nybegynder
15. marts 2004 - 17:50 #21
Her er så den min main ret barberet

package Kildekode.GUI;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import layout.TableLayout;

public class Main extends JFrame{
  private static Main instans;
  private Container c;
  private JSeparator Svandret, jSeparator1;


  // Singleton
  public static Main hentInstans(){
    if (instans == null)
      instans = new Main();
    return instans;
  }

  private Main(){
    double m = 5;
    double p = TableLayout.PREFERRED;
    double f = TableLayout.FILL;
    double stoerrelse[][] = {{ m, 200, m, m, f, m, m},
                            {m, f, 2, p, m}};

    c = this.getContentPane();
    c.setLayout(new TableLayout(stoerrelse));

    setTitle("Electric It - Salgs- og lagersystem");
    setIconImage(new ImageIcon("ikoner\\fortryd2.gif").getImage());
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt){
        exitForm(evt);
      }
    });

    Svandret = new JSeparator();

    //Layoutet
    setJMenuBar(MenuBar);
    c.add(TabMenu.hentInstans(), " 1, 1, 1, 3");
    c.add(VareBeskrivelse.hentInstans(), " 4, 3");
    c.add(SælgVare.hentInstans(), " 4, 1");
    c.add(Svandret, " 4, 2");


    setSize(800, 600);
    Dimension dim = getToolkit().getScreenSize();
    Rectangle abounds = this.getBounds();
    this.setLocation((dim.width - abounds.width) / 2,
    (dim.height - abounds.height) / 2);
    show();

  }

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

  public void SkiftPanel(JPanel panel){
    int comp = 0;

    while(c.getComponent(comp) == Svandret || c.getComponent(comp) == VareBeskrivelse.hentInstans() || c.getComponent(comp) == TabMenu.hentInstans()){
      comp++;
    }
    c.remove(c.getComponent(comp));
    c.add(panel, " 4, 1");
    repaint();
  }
Avatar billede saxtus Nybegynder
15. marts 2004 - 17:53 #22
der hvor min main metode ligger et bare for at lave en splash screan med noget logo og så vidersender den så til denne her.

det er så her der skal stå

    //Layoutet
    setJMenuBar(MenuBar);
    c.add(TabMenu.hentInstans(), " 1, 1, 1, 3");
    c.add(VareBeskrivelse.hentInstans(), " 4, 3");
    c.add(SælgVare.hentInstans(), " 4, 1");
    //***** c.add(CardPanel.hentInstans(), " 4, 1"); ******
    c.add(Svandret, " 4, 2");
Avatar billede _carsten Nybegynder
15. marts 2004 - 18:14 #23
Har du prøvet at udkommentere denne

c.add(SælgVare.hentInstans(), " 4, 1");

Og virker det så ?
Avatar billede _carsten Nybegynder
15. marts 2004 - 18:19 #24
Hov -  du har jo byttet rundt på dem

    card1.add("", SælgVare.hentInstans());
    card2.add("", IndkøbVare.hentInstans());
    card3.add("", LagerVare.hentInstans());

Skal være
    card1.add(SælgVare.hentInstans(), "card1");
    card2.add(IndkøbVare.hentInstans(), "card2");
    card3.add(LagerVare.hentInstans(), "card3");
Avatar billede saxtus Nybegynder
15. marts 2004 - 18:33 #25
awt.Container igen

ja har også prøvet det - det er nogte skidt der her :( *g*
Avatar billede saxtus Nybegynder
15. marts 2004 - 18:35 #26
findes der ikke en variant af cardLayout der køre awt i stedte??
Avatar billede _carsten Nybegynder
15. marts 2004 - 20:05 #27
Der er mig bekendt ingen variant af CardLayout, desuden er CardLayout AWT.

Det er ikke der fejlen ligger, men

1. Hvis du samler det hele sammen, giver flere linier kode end jeg kunne have lyst
  til at rende igennem ???

2. Eller skal jeg prøve at lave et eksempel med en JFrame, JTabbedPane og nogle paneler ??
Avatar billede saxtus Nybegynder
15. marts 2004 - 20:14 #28
det skal være en JFrame, jeg har nemlig allerede et JTabbedPane - kan lige uploade et billede af hvad det er, så du kan se det.

www.kalundhobbyen.dk/start.JPG
Avatar billede _carsten Nybegynder
15. marts 2004 - 20:22 #29
Skal billedet i den røde ramme skifte hvis man trykker på fanen indkøb ?
Avatar billede saxtus Nybegynder
15. marts 2004 - 20:49 #30
ja - det er så der der skal være det cardLayout
Avatar billede saxtus Nybegynder
15. marts 2004 - 20:54 #31
Har du et andet forslag til hvordan det ellers kunne laves??
Avatar billede _carsten Nybegynder
15. marts 2004 - 21:06 #32
Sorry - skulle lige se noget advokat sjov i fjerneren.

Jeg ville nok lade fanerne ligge horizontalt og putte tabellen ind i fanen,
for ligesom at skabe en helhed omkring hver fane, altså i fanen salg ligger
alt som vedrører salg, men det ser jo nydeligt ud, så lad os se om vi ikke
kan få det til at virke.

Jeg går i gang med et eksempel, vender forhåbentlig tilbage i aften!
Avatar billede _carsten Nybegynder
15. marts 2004 - 22:06 #33
Så er der et eksempel, jeg har prøvet at holde det simpelt og i din byggestil, men er egentlig ikke klar over om det helt er lykkedes, under alle omstændigher er det her nok mit sidste bud på en løsning - er faktisk flad nu!

Prøv at klikke på fanebladene og se hvordan billedet skifter i højre side.
Jeg har vist kun tilbage at sige - - pøj, pøj med det.

public class Saxtus  extends javax.swing.JFrame {
    public Saxtus() {
        initComponents();
        setSize(500,500);
        tabbedPane.setPreferredSize(new java.awt.Dimension(200,500));
    }

    private void initComponents() {
       
        cardLayout = new MyCardLayout();
        layout = (java.awt.CardLayout)cardLayout.getLayout();
        tabbedPane = new TabbedPanePanel(layout, cardLayout);
       
       
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        getContentPane().add(tabbedPane, java.awt.BorderLayout.WEST);
        getContentPane().add(cardLayout, java.awt.BorderLayout.CENTER);
     
        pack();
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   
    public static void main(String args[]) {
        new Saxtus().show();
    }

    private TabbedPanePanel tabbedPane;
    private MyCardLayout cardLayout;
    private java.awt.CardLayout layout;
}






class TabbedPanePanel extends javax.swing.JPanel {
    public TabbedPanePanel(java.awt.CardLayout card, MyCardLayout myLayout) {
        this.card = card;
        this.myLayout = myLayout;
        initComponents();
    }
   
    private void initComponents() {
        jTabbedPane1 = new javax.swing.JTabbedPane();
        pane1 = new javax.swing.JTabbedPane();
        pane2 = new javax.swing.JTabbedPane();
        pane3 = new javax.swing.JTabbedPane();

        setLayout(new java.awt.BorderLayout());

        pane1.addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentShown(java.awt.event.ComponentEvent evt) {
                card.show(myLayout, "card1");
            }
        });
       
        pane2.addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentShown(java.awt.event.ComponentEvent evt) {
                card.show(myLayout, "card2");
            }
        });
       
        pane3.addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentShown(java.awt.event.ComponentEvent evt) {
                card.show(myLayout, "card3");
            }
        });
       
        jTabbedPane1.addTab("Salg", pane1);

        jTabbedPane1.addTab("Indk\u00f8b", pane2);

        jTabbedPane1.addTab("Lager", pane3);

        add(jTabbedPane1, java.awt.BorderLayout.CENTER);
    }

    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JTabbedPane pane1;
    private javax.swing.JTabbedPane pane2;
    private javax.swing.JTabbedPane pane3;   
    private java.awt.CardLayout card;
    private MyCardLayout myLayout;
}





// Panelet som indeholder CardLayout
class MyCardLayout extends javax.swing.JPanel {
    public MyCardLayout() {
        myPanel1 = new MyPanel(java.awt.Color.BLUE);
        myPanel2 = new MyPanel(java.awt.Color.GREEN);
        myPanel3 = new MyPanel(java.awt.Color.RED);

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

        add(myPanel1, "card1");

        add(myPanel2, "card2");

        add(myPanel3, "card3");
    }

    private MyPanel myPanel1;
    private MyPanel myPanel2;
    private MyPanel myPanel3;
}





//De 3 paneler som ligger i klassen MyCardLayout
class MyPanel extends javax.swing.JPanel {
    public MyPanel(java.awt.Color color) {
        setBackground(color);
    }
}
Avatar billede _carsten Nybegynder
15. marts 2004 - 22:07 #34
Jeg vil være så fræk at lægge et svar !
Avatar billede saxtus Nybegynder
15. marts 2004 - 22:44 #35
det ser godt ud, skal lige bruge dagen imorgen til at tilpasse det - ellers laver jeg bare en anden main
Avatar billede saxtus Nybegynder
23. marts 2004 - 10:32 #36
det var kun den her jeg manglede

validate();

Lidt skidt det ikke var mere.
du får alligevel lidt point fordi du var så aktiv med at hjælpe mig :)
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