Java actionCommand

Status
Niet open voor verdere reacties.

Simon R

Gebruiker
Lid geworden
30 jul 2010
Berichten
7
Hallo allemaal,

Is er iemand die ervaring heeft met de actioncommand van java? Ik heb namelijk een rekenmachine die uit meerdere klassen bestaat. De classes knoppen en bewerkingen extends van rekenmachineUodate. De rekenmachine update is de hoofdclass waar de knoppen aangemaakt en geplaatst worden. In de class knoppen krijgen alle knoppen hun fucntie. Nu heb ik inmiddels het programma zover dat de actionPerformed method uit de class knoppen reageert op alle knoppen. Alleen weet java niet welke knop bedient word, want er gebeurd niets. Wie weet hoe dit precies werkt?
Bekijk bijlage rekenmachine.txt
 

Bijlagen

Ik weet niet precies wat knoppen doet, maar het maakt in ieder geval de actionlisteners. ;) Waarschijnlijk dat je hierbij ook een ActionEvent meekrijgt, hier zit verschillende data aan vast. Een voorbeeldje om de tekst van een JButton te printen:

Code:
    public ActionListener knoppen()
    {
        return new ActionListener() {
            public void actionPerformed(ActionEvent e) { //Je krijgt een ActionEvent mee met de data van de geklikte knop
                Object o = e.getSource();   //Het object waarop geklikt is 
                if(o instanceof JButton)    //Kijk of het object een JButton is
                    System.out.println(((JButton) o).getText());    //Zo ja pak de text en print deze 
            }
        };
    }

Je kunt ook aan de hand van bijvoorbeeld de positie werken, maar ik vind dit de makkelijkste oplossing.
 
Laatst bewerkt:
PHP:
	public void setup(){		
		tf = new JTextField(15);
		panel = new JPanel();
		panel.setPreferredSize(new Dimension(300, 50));
		
		button = new JButton[buttontext.length];//hierdoor veroorzaakt, wel intialiseren
		for (x = 0; x < buttontext.length; x++){
			button[x] = new JButton(buttontext[x]); //hier nullpointer exeption
			button[x].addActionListener(new ActionListener() {
                                           public void actionPerformed(ActionEvent e) {
                                                  myaction(x);
                                           }
                                        });
			button[x].setActionCommand(Integer.toString(x));
			panel.add(button[x]);
		}	
		
		tf = new JTextField(10);
		panel.add(tf);
		
		frame = new JFrame("Rekenmachine");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(350, 130);
		frame.setVisible(true);
		frame.add(panel);
		}		
	}
 
Maar kan dit commando dan ook de verschillende knoppen van de rekenmachine onderscheiden
 
je kan het zo doen

Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Main extends JFrame
{
	public Main()
	{
		this.setSize(400, 400);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLayout(new FlowLayout());
		
		JButton button1 = new JButton("button 1");
		JButton button2 = new JButton("button 2");
		
		getContentPane().add(button1);
		getContentPane().add(button2);
		
		button1.addActionListener(new button1Action());
		button2.addActionListener(new button2Action());
		
		this.setVisible(true);
	}
	
	public static void main(String[] args)
	{
		new Main();
	}
	
	private class button1Action implements ActionListener
	{
		@Override
		public void actionPerformed(ActionEvent arg0) 
		{
			System.out.println("button 1");
			
		}
	}
	
	private class button2Action implements ActionListener
	{
		@Override
		public void actionPerformed(ActionEvent e) 
		{
			System.out.println("button 2");
		}
	}
}

of met 1 actionListener klasse:
maar dan moet het wel in de zelfde main klasse want hij moet de JButton herkennen(deze is hier ook als field geïnitialiseerd).
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Main extends JFrame
{
	private JButton button1, button2;
	
	public Main()
	{
		this.setSize(400, 400);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLayout(new FlowLayout());
		
		button1 = new JButton("button 1");
		button2 = new JButton("button 2");
		
		getContentPane().add(button1);
		getContentPane().add(button2);
		
		button1.addActionListener(new buttonAction());
		button2.addActionListener(new buttonAction());
		
		this.setVisible(true);
	}
	
	public static void main(String[] args)
	{
		new Main();
	}
	
	private class buttonAction implements ActionListener
	{
		@Override
		public void actionPerformed(ActionEvent e) 
		{
			if(e.getSource() == button1)
			    {
				System.out.println("button 1");
			    }
			else if(e.getSource() == button2)
			    {
				System.out.println("button 2");
			    }  
		}
	}
}

het kan ook in een andere klasse en dat je dan de naam controleert van de knop via de ActionEvent e, maar ben even kwijt hoe, en het is tevens niet netjes.
 
Laatst bewerkt:
Ik weet niet precies wat knoppen doet, maar het maakt in ieder geval de actionlisteners. ;) Waarschijnlijk dat je hierbij ook een ActionEvent meekrijgt, hier zit verschillende data aan vast. Een voorbeeldje om de tekst van een JButton te printen:

Code:
    public ActionListener knoppen()
    {
        return new ActionListener() {
            public void actionPerformed(ActionEvent e) { //Je krijgt een ActionEvent mee met de data van de geklikte knop
                Object o = e.getSource();   //Het object waarop geklikt is 
                if(o instanceof JButton)    //Kijk of het object een JButton is
                    System.out.println(((JButton) o).getText());    //Zo ja pak de text en print deze 
            }
        };
    }
Je kunt ook aan de hand van bijvoorbeeld de positie werken, maar ik vind dit de makkelijkste oplossing.
Dit is inderdaad de makkelijkste oplossing. In plaats van de System.out kan je dus een check plaatsen op de text die terug gegeven wordt. If( (JButton) o).getText() == "0" ) enz enz...
 
Dit is inderdaad de makkelijkste oplossing. In plaats van de System.out kan je dus een check plaatsen op de text die terug gegeven wordt. If( (JButton) o).getText() == "0" ) enz enz...

vind het niet echt een nette oplossing.
Je checkt of het een JButton is (wat je eigenlijk al weet) en gaat daarna checken op de label op de button.
Stel dat je verschillende talen in je programma implementeert dan moet je elke taal checken omdat de label veranderd.

Ik denk dat het beter is om gewoon een check te geven welk object je zoekt (zie mijn vorige post).

Ik klink op dit moment misschien een kleine zeikerd maar als je het gelijk goed leert heb je er later minder last van.

als je iets niet snapt van mijn post hoor ik dat graag.
 
Laatst bewerkt:
vind het niet echt een nette oplossing.
Je checkt of het een JButton is (wat je eigenlijk al weet) en gaat daarna checken op de label op de button.
Stel dat je verschillende talen in je programma implementeert dan moet je elke taal checken omdat de label veranderd.

Ik denk dat het beter is om gewoon een check te geven welk object je zoekt (zie mijn vorige post).

Ik klink op dit moment misschien een kleine zeikerd maar als je het gelijk goed leert heb je er later minder last van.

als je iets niet snapt van mijn post hoor ik dat graag.

Zou opgelost kunnen worden door een button een name te geven en hier mee te vergelijken.
Code:
JButton.setName("a"); 
if(JButton.getName().equals("a"));
Ik heb zelf een hekel aan om een hele lange lijst met ActionListeners te hebben, dat verschilt misschien per persoon. ;)
 
Zou opgelost kunnen worden door een button een name te geven en hier mee te vergelijken.
Code:
JButton.setName("a"); 
if(JButton.getName().equals("a"));
Ik heb zelf een hekel aan om een hele lange lijst met ActionListeners te hebben, dat verschilt misschien per persoon. ;)

In mijn bericht heb ik het juist over dat het checken op de naam van de button gevaarlijk is omdat dat te veranderen is.
In mijn vorige post geef ik ene voorbeeld hoe je kan checken op het object zelf.

even snel:
Code:
//declaratie van een JButton in de classe zelf (een field dus)
private JButton button1

//in de actionListener methode kan je nu checken of het daadwerkelijk button1 is maak niet uit welke naam deze heeft.
public void actionPerformed(ActionEvent e) 
		{
			if(e.getSource() == button1)
		}


Om het nog iets duidelijker te maken, een makkelijk te begrijpen voorbeeld:
(ook als bijlage toegevoegd)
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class ButtonExample extends JFrame implements ActionListener
{
	private JButton button1, button2;
	
	public ButtonExample()
	{
		this.setSize(200, 100);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLayout(new FlowLayout());
		
		button1 = new JButton("button 1");
		button2 = new JButton("button 2");
		
		getContentPane().add(button1);
		getContentPane().add(button2);
		
		button1.addActionListener(this);
		button2.addActionListener(this);
		
		this.setVisible(true);
	}
	
	public static void main(String[] args)
	{
		new ButtonExample();
	}
	
	@Override
	public void actionPerformed(ActionEvent e) 
	{
		if(e.getSource() == button1)
		    {
				//actie button1
		    }
		else if(e.getSource() == button2)
		    {
				//actie button2
		    }  
	}
}
 

Bijlagen

Actioncommand

Beste Java toppers,

De rekenmachine werkt en het probleem is opgelost.
Bedankt voor alle hulp en het meedenken
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan