Permalänk

java GUI guide?

Jag har precis börjat titta på GUI med java.

Jag tycker det verkar lagom enkelt att skapa ett GUI. Dvs att skapa fönster, knappar och annat... det känns rätt klart och tydligt.

Men sedan att sätta en "action" på en knapp... Där fastnar jag i att förstå vad det är jag gör.

Jag tänker mig att en knapp hela tiden lyssnar efter att det ska hända något.

så då borde jag ha en metod som utför något när knapp1 trycks ned eller något annat....
men helt plötsligt så blir det en ny klass i en klass och sedan en metod varje liten sak....
så då blir jag förvirrad

private class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { label.setText("Ny text"); } public void actionPerformed2(ActionEvent d) { label.setText("back"); } } private class ButtonListener1 implements ActionListener { public void actionPerformed(ActionEvent b) { label1.setText("Ny"); } }

någon som kan reda ut detta eller vet en bra guide som tar grunderna i att göra ett enkelt gui
med knappar som utför olika metoder.

mitt mål är att ta mitt skol projekt och göra ett GUI till det.
men först måste jag förstå lite mer

Permalänk
Medlem

Nu vet jag egentligen inte allt för mycket om hantering av GUI i java men jag slängde ihop ett litet exempel nedan som kanske hjälper:

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class Example { public static void main(String[] args) { class ButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { System.out.println("Detta händer oavsett vilken av knapparna du klickar"); if(e.getActionCommand() == "Test") { System.out.println("Du track på knappen test!"); } else if(e.getActionCommand() == "Hej") { System.out.println("Du track på knappen Hej"); } } } // Skapa en JFrame och JPanel JFrame f = new JFrame(); JPanel p = new JPanel(); // Skapa knappar med texterna "Test" och "Hej" JButton b = new JButton("Test"); JButton b2 = new JButton("Hej"); // Lägg till hanterare för aktivering av knappen b.addActionListener(new ButtonListener()); b2.addActionListener(new ButtonListener()); // Lägg till saker där dom bör ligga p.add(b); p.add(b2); f.add(p); // Visa gui:t f.pack(); f.setVisible(true); } }

I detta fallet så är ButtonListener en ActionListener. När du klickar eller aktiverar en knapp så kallar Java på actionPerformed i ButtonListener med argumentet ActionEvent e. ActionEvent e är ett objekt som innehåller information om händelsen, tex "vem var det som kallade på mig?". Denna information kan du få fram genom att använda tex. funktionen getActionCommand() som finns i ActionEvent objektet.

Permalänk

Kan verkligen rekomendera dig anonyma lyssnare för knappar och så. Mycket lättare att få specifika funktioner per knapp och hålla koden som hör till en knapp nära knappens kod. Antagligen ger detta även bättre cache träffar för bättre prestanda!

Exempel:

GCButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Runtime.getRuntime().gc(); } });

Permalänk
Medlem

Egentligen är det bästa att göra en Action, då kan du skriva en funktion som används på olika ställen.....

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;

public class TestUI extends JFrame {

private static int tryckRaknare = 0;
private static JLabel label;

public TestUI() {
setTitle("Action Example");
JMenuBar bar = new JMenuBar();
Action a = new MyAction();
JMenu m = new JMenu("Menu");
m.add(a);
bar.add(m);
setJMenuBar(bar);
JButton b = new JButton(a);
JPanel p = new JPanel(new BorderLayout());
label = new JLabel("Du har inte tryckt alls...");
p.add(label, BorderLayout.NORTH);
p.add(b, BorderLayout.SOUTH);
setContentPane(p);
pack();
}

public static void main(String[] argv) {
TestUI ui = new TestUI();
ui.setVisible(true);
}

private class MyAction extends AbstractAction {

public MyAction() {
super("Ändra Label");
}

@Override
public void actionPerformed(ActionEvent e) {
tryckRaknare++;
label.setText("Du har tryckt " + tryckRaknare + " ggr.");
}
}
}