java GUI guide?
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.
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();
}
});
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.");
}
}
}
- Igår Nvidia: "Energieffektiva RTX 4060 sparar hundralappar" 36
- Igår MSI Geforce RTX 4060 Ventus 2X OC – bra prestanda vid 1080p men medioker kylare 45
- Igår Noctua släpper monteringsram för "deliddade" Ryzen 7000-processorer 15
- Igår Nvidias nästa arkitektur för Geforce kommer år 2025 58
- 27 / 6 Afox släpper kompakt Geforce RTX 4090 36
- Igår Veckans fråga: Vilket operativsystem föredrar du? 76
- Igår Bilar med smarta inslag ger fler dumma fel 58
- 27 / 6 Telekombranschen: "Smarta glasögon ersätter telefoner inom fem år" 88
- 26 / 6 Lastpass-användare rasar – kan inte logga in 59
- 26 / 6 Inet frågar SweClockers – Vad skulle du vilja förbättra på Inet.se? 53
- Framtiden för C# och .Net i Sverige46
- Fel post (dödsbo)8
- Bildvisnings program5
- PSVR2 - diskussionstråd444
- Kommer flytta till stan och mitt wifi kommer säkert synas av hundratals människor varje dag. Vilken router ska jag köpa och hur ska den ställas in?6
- Solfilm till fönster för sommarvärmen. Behöver råd.30
- Hjälp angående gammal psu och "nytt" grafikkort2
- Ert dyraste ” datormisstag”?402
- MSI Geforce RTX 4060 Ventus 2X OC – bra prestanda vid 1080p men medioker kylare45
- Vad lyssnar du på just nu?12615
- Säljes LG 27'' UltraGear 27GP950 4K Nano IPS 160 Hz HDMI 2.1
- Säljes Star Wars Jedi AMD kod
- Säljes Trasig Xiaomi Mi Electric Scooter (M365) Svart
- Säljes 5800x3D + x570 Meg Unify + be quiet! Dark Rock Slim
- Säljes AMD ASUS DUAL RX6700XT
- Säljes Dell OptiPlex 7010
- Säljes Datordelar: i5 9600k + 1070 GTX mm.
- Säljes 1080 TI | Vattenblock | 1TB SSD | Apple Watch 4 Stainless | Hörlurar | Mikrofon
- Säljes Intressekoll: Xbox Series S 512Gb samt Switch Oled 64Gb Vit
- Säljes Gamingdator RTX 3090, i9-10900K, 32GB ram
- Nvidia: "Energieffektiva RTX 4060 sparar hundralappar"36
- MSI Geforce RTX 4060 Ventus 2X OC – bra prestanda vid 1080p men medioker kylare45
- Veckans fråga: Vilket operativsystem föredrar du?76
- Bilar med smarta inslag ger fler dumma fel58
- Noctua släpper monteringsram för "deliddade" Ryzen 7000-processorer15
- Nvidias nästa arkitektur för Geforce kommer år 202558
- Microsoft vill strömma Windows från molnet71
- Starfield utvecklas med AMD:s välsignelse148
- Telekombranschen: "Smarta glasögon ersätter telefoner inom fem år"88
- En av tre svenskar använder annonsblockerare79
Externa nyheter
Spelnyheter från FZ
- Alan Wake och CoD: Kallt krig snart på PS Plus, enligt läcka igår
- Red Dead Redemption åldersmärkt igen i Korea – det spekuleras i remaster igår
- Fallout London flyttas för att slippa Starfield-konkurrensen igår
- Minecraft-filmen kan ha hittat sin Steve – Pedro "The Last of Us-Joel" Pascal igår
- Stor Diablo IV-patch släppt, mer XP och ombalanserade klasser igår