Avatar billede Slettet bruger
21. maj 2004 - 08:11 Der er 6 kommentarer og
1 løsning

ActionListener - dynamisk indhold

Hejsa,
Jeg sidder nu og tumler med et lille problem.
Jeg har en klasse, hvor der genereres et GUI med borderLayout og i toppen dannes der en pullDown menu.
Klasse benytter en actionListener, så langt så godt, men hvordan gør jeg det muligt at bestemme indholdet der vises i borderLayout.CENTER ved hjælp af actionListener? Altså, med andre ord, hvordan "logges" den event fra knappen der er valgt og hvordan  laves det sådan at man fek,s. kan bestemme indholdet med en boolean (flere i en if-sætning)?

Jeg har forsøgt med ovenstående, hvor jeg sætter en boolean i toppen og igen sætter den nede i min actionListener-metode, men indholdet skifter dog ikke.

For at undgå for meget kode har jeg pastet udvalgte stumper ind.

Min klasse-definition ser således ud:
public class Hovedvindue extends JFrame implements ActionListener

// Menuen defineres
        JMenu kontaktMenu = new JMenu("Kontakter");
        kontaktMenu.setBackground(baggrundTop);
        JMenuItem kontakter;

        kontakter = new JMenuItem("Opret ny kontakt");
        kontakter.addActionListener(this);
        kontaktMenu.add(kontakter);
        kontakter = new JMenuItem("Vis alle kontakter");
        kontakter.addActionListener(this);
        kontaktMenu.add(kontakter);

JMenuBar menuBar = new JMenuBar();
        menuBar.add(kontaktMenu);
        setJMenuBar(menuBar);

og til sidst den føromtalte listener:

public void actionPerformed(ActionEvent e)
  {
    String actionCommand = e.getActionCommand();
    if(actionCommand.equals("Opret ny kontakt"))
    {
      nyKontakt = true;
    }
  }

Hvordan kan jeg gøre indholdet i borderLayout.CENTER dynamisk med dette (hvis det altså er muligt)?

Nu har jeg følgende, men det virker ikke:

JPanel centerPanel = new JPanel();
    centerPanel.setBackground(Color.white);
    centerPanel.setSize(400, 400);
   
          // Vis indhold i centerpanel
          if (nyKontakt)
          {
            JLabel nyKontakt = new JLabel("Opret en ny kontakt?");
            centerPanel.add(nyKontakt);
          }
   
    contentPane.add(centerPanel, BorderLayout.CENTER);

Er der nogen der har et forslag?
Eller er det en komplet uduelig måde jeg har tænkt mig at gøre det på?
Avatar billede rasmusbg Nybegynder
21. maj 2004 - 08:44 #1
Du prøver i din if-sætning at tilføje en boolean til dit centerPanel.
Avatar billede conrad Nybegynder
21. maj 2004 - 09:43 #2
Du kan godt bruge den metode du har gang i (men jeg tror dog ikke det er den pæneste løsning). Det du mangler er vel at kalde en metode der får din centerpanel klasse til at tjekke på nyKontakt parameteren ?

public void actionPerformed(ActionEvent e)
  {
    String actionCommand = e.getActionCommand();
    if(actionCommand.equals("Opret ny kontakt"))
    {
      nyKontakt = true;
      panelToUpdate.doChange();//you could pass the nyKontakt paramter to avoid global variables
    }
  }
Avatar billede _carsten Nybegynder
21. maj 2004 - 09:47 #3
For mig at se er der 2 ting ikke stemmer overens

Du har identifieren "nyKontakt" som både er en boolean og en JLabel, der er hamrende usmart

Derefter skal du kalde validate() på dit centerpanel og din contentpane

Sådan løser du det

    if(actionCommand.equals("Opret ny kontakt"))
    {
      JLabel nyKontakt = new JLabel("Opret en ny kontakt?");
      centerPanel.add(nyKontakt);
      contentPane.add(centerPanel, BorderLayout.CENTER);
      centerPanel.validate();
      contentPane.validate();
    }
Avatar billede Slettet bruger
22. maj 2004 - 13:35 #4
Takker for svarene!
Carsten, jeg har benyttet dit råd om at bruge validate() på både centerPanel og contentPane og det virker fint nu. Nu kan man i hvert fald få dynamisk indhold til at blive vist i det midterste panel (centerPanel). Der er dog nu et nyt problem, da indholdet ikke umiddelbart bliver fjernet når man kalder en anden funktion fra menuen.

public void actionPerformed(ActionEvent e)
  {
    String actionCommand = e.getActionCommand();
    if(actionCommand.equals("Opret ny kontakt"))
    {
      opretBruger = false;
      nyKontakt = true;
      genererMidterPanel();
      centerPanel.validate();
      contentPane.validate();
    }
    else if(actionCommand.equals("Opret ny bruger"))
    {
      nyKontakt = false;
      opretBruger = true;
      genererMidterPanel();
      centerPanel.validate();
      contentPane.validate();
    }

Samtidig ser mit centerPanel ud som følger:

public void genererMidterPanel()
    {
      centerPanel.setBackground(Color.white);

      // Vis indhold i centerpanel
      if(nyKontakt)
      {
        centerPanel.add(new Sql());
      }
      else if(opretBruger)
      {
        centerPanel.add(new Oprettelser());
      }

      contentPane.add(centerPanel, BorderLayout.CENTER);
    }

Hvad går galt?
Begge variable bliver sat i toppen, men hverken til true eller false.
Avatar billede _carsten Nybegynder
22. maj 2004 - 13:49 #5
Er lige på vej ud af døren, og har ikke tid til at læse din kode, så  - hurtig modellen

Du skal bruge

contentPane.remove(DetPanelSomErDerNu);
contentPane.add(DetPanelSomNuSkalVises);
contentPane.validate();
Avatar billede Slettet bruger
22. maj 2004 - 14:16 #6
Aaaaarg, det virker stadig ikke med den sidste tilføjelse...

:-)
Avatar billede Slettet bruger
16. oktober 2007 - 16:44 #7
Lukker
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