21. maj 2004 - 08:11Der 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
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); }
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 } }
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(); }
Synes godt om
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.
Aaaaarg, det virker stadig ikke med den sidste tilføjelse...
:-)
Synes godt om
Slettet bruger
16. oktober 2007 - 16:44#7
Lukker
Synes godt om
Ny brugerNybegynder
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.