Gå til innhold

Vindu og knapper med javax.swing


Anbefalte innlegg

God ettermiddag!

 

Jeg tar faget Objektorintert Programmering dette semesteret, og sitter her idag og prøver å lage en enkel gui.

 

Jeg skjønner ikke helt hvordan layout'en på vinduet jeg har laget fungerer. Hvordan bestemmer jeg hvor disse knappene skal ligge?

 

Jeg har laget et program med 2 knapper, problemet er at disse knappene nå overlapper hverandre.

 

import java.awt.*;
import javax.swing.*;
public class gui {
public static void createWindow() {
}
public static void main(String args[]) {
 // Sett JSwing-standard på utseendet
 JFrame.setDefaultLookAndFeelDecorated(false);
 JFrame window = new JFrame(); // Lag vindu med tittel
 window.setTitle("Mitt vindu!");
 window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 JButton btn = new JButton("Knapp");
 btn.setSize(40,20);

 JButton btn2 = new JButton("Knapp 2");
 btn.setSize(40,20);

 window.add(btn);
 window.add(btn2);

    //Display the window.
    window.setSize(400,200);
    window.setVisible(true);
}
}

 

 

Noen hint/tips?

 

På forhånd, takk!

Lenke til kommentar
Videoannonse
Annonse

Du har vindu, men mangler en layouthåndtering, eller for å si det på en annen måte, du legger til knappene men distribuerer dem ikke.

 

Fiks i spoiler:

 

 

import java.awt.*;
import javax.swing.*;
public class gui {
public static void createWindow() {
}
public static void main(String args[]) {
 // Sett JSwing-standard på utseendet
 JFrame.setDefaultLookAndFeelDecorated(false);
 JFrame window = new JFrame(); // Lag vindu med tittel
 window.setTitle("Mitt vindu!");
 window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 window.setLayout(new FlowLayout()); //Her er en endring!!!!!!!
 JButton btn = new JButton("Knapp");
 btn.setSize(40,20);

 JButton btn2 = new JButton("Knapp 2");
 btn.setSize(40,20);

 window.add(btn);
 window.add(btn2);

		//Display the window.
		window.setSize(400,200);
		window.setVisible(true);
}
}

 

 

 

Google for mer info om åssen det funker, samtidig som at det finner andre varianter enn FlowLayout som har ulike måter å distribuere på.

Lenke til kommentar

Takk for tilbakemelding.

 

Jeg har "forsket" videre og funnet ut hvordan jeg kan håndtere layout'en på vinduet mitt. Ser på mange eksempler hvordan de bruker JPanel-objekter for å legge inn buttons, labels ol. For så å legge inn panelet på vinduet. Jeg legger objektene mine direkte inn i vinduet, er dette veldig dumt?

 

Koden min er nå slik:

 

import java.awt.*;
import javax.swing.*;
public class gui {
private static String infoText = "Hei og hertelig velkommen!";

public static void main (String args[]) {
 JFrame window = new JFrame("Mitt vindu!");

 JLabel text = new JLabel(infoText);
 text.setBounds(10,10,300,300);
 text.setVerticalAlignment(JLabel.TOP);
 text.setHorizontalAlignment(JLabel.LEFT);

 JButton btn = new JButton("Knapp");
 btn.setBounds(10,200,140,20);

 window.add(text);
 window.add(btn);

 window.setLayout(null);
 window.setSize(400,400);
 window.setLocationRelativeTo(null);
 window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 window.setVisible(true);
}
}

 

Videre sliter jeg med å forstå hvordan button-events håndteres. Knappen min må altså ha en listener for å kunne utføre noe når den "klikkes på". Kan noen forklare helt enkelt hvordan dette fungerer?

Lenke til kommentar

Nei du kan godt legge kontrollene rett i vinduet, men du må som nevnt over benytte deg av en layoutmanager. Disse fins i flere forskjellige utførelser. Grid, flow, absolute osv.

 

En listener er kort sagt en funksjon som du "kobler" til knappen. Denne utføres da ved klikking på knappen.

 

(Med forbehold om at det er 6 år siden jeg var ferdig på HiST og ikke har tatt i Java siden da :D (Go .NET! ;) ))

 

-C-

  • Liker 1
Lenke til kommentar

Høres fornuftig ut, men hvordan skal jeg gå fram for å implementere dette i koden min?

 

Her er koden:

 

import javax.swing.*;
public class gui {
private static String infoText = "Hei og hertelig velkommen!";

private static void makeText(JFrame window) {
 JLabel text = new JLabel(infoText);
 text.setBounds(10, 10, 300, 300);
 text.setVerticalAlignment(JLabel.TOP);
 text.setHorizontalAlignment(JLabel.LEFT);
 window.add(text);
}
private static void makeButton(JFrame window) {
 JButton btn = new JButton("Knapp");
 btn.setBounds(10, 200, 140, 20);
 window.add(btn);
}
private static void makeFrame() {
 JFrame window = new JFrame("Mitt vindu");
 makeText(window);
 makeButton(window);
 window.setLayout(null);
 window.setSize(400, 400);
 window.setLocationRelativeTo(null);
 window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 window.setVisible(true);
}
public static void main(String args[]) {
 makeFrame();
}
}

Lenke til kommentar

Mange GUI-komponenter arver egenskaper som gir dem metoden addActionListener, se hvordan den brukes i din egen metode makeButton().

 

 

 

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class gui {
private static String infoText = "Hei og hertelig velkommen!";
private static void makeText(JFrame window) {
	JLabel text = new JLabel(infoText);
	text.setBounds(10, 10, 300, 300);
	text.setVerticalAlignment(JLabel.TOP);
	text.setHorizontalAlignment(JLabel.LEFT);
	window.add(text);
}
private static void makeButton(JFrame window) {
	JButton btn = new JButton("Knapp");
	btn.setBounds(10, 200, 140, 20);
	  //Endring under her!!!!
	btn.addActionListener(new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			//Legg inn din egen kode her
			System.out.println("Du har trykket på knappen.");
		}
	});

	window.add(btn);
}
private static void makeFrame() {
	JFrame window = new JFrame("Mitt vindu");
	makeText(window);
	makeButton(window);
	window.setLayout(null);
	window.setSize(400, 400);
	window.setLocationRelativeTo(null);
	window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	window.setVisible(true);
}
public static void main(String args[]) {
	makeFrame();
}
}

 

 

Lenke til kommentar

Dette fungerte perfekt, tusen takk!

 

Fersk som jeg er, skjønner jeg ikke helt hva som skjer i dette punktet (usikker hva det kalles, er det et metode-kall?):

 

btn.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
System.exit(0);
  }
 });

 

objektet "btn" kaller metoden "addActionListener" med følgende parameter:

{
  public void actionPerformed(ActionEvent e) {
System.exit(0);
  }

Så da blir denne metoden lagret som en "action-listener" for objektet? Har jeg skjønt det rett?

 

EDIT: Og hva menes med "ActionEvent e" ?

Endret av StAkkarr
Lenke til kommentar

 

 

Fersk som jeg er, skjønner jeg ikke helt hva som skjer i dette punktet (usikker hva det kalles, er det et metode-kall?):

Jepp.

objektet "btn" kaller metoden "addActionListener" med følgende parameter:

{
  public void actionPerformed(ActionEvent e) {
System.exit(0);
  }

Du mangler noe i parameteren, hele parameteren blir:

new ActionListener() {
  public void actionPerformed(ActionEvent e) {
System.exit(0);
  }
 }

Hvor den da rett og slett slenger inn inn en ActionListener og lager en ny metode til ActionListener som er unik til ditt program.

Så da blir denne metoden lagret som en "action-listener" for objektet? Har jeg skjønt det rett?

Det virker sånn.

EDIT: Og hva menes med "ActionEvent e" ?

LES: http://docs.oracle.c...ase/7/docs/api/

 

Jeg holder meg som regel til litt konkrete spørsmål, jeg kommer ikke til å gi en forklaring på noe du burde ha lest ut av dokumentasjonen uansett, lær deg og les dokumentasjon når du kommer over klasser/objekter du ikke vet hva gjør.

 

Siden du nå har ferdig kode så går det an å lese dokumentasjonen ved siden av mens du tester ut det som står der på ActionEvent e.

 

 

Lenke til kommentar

Hvordan skal jeg gå fram for å få actionPerformed-metoden til å forandre en attributt for et objekt?

 

import javax.swing.*;
import java.net.*;
import java.awt.event.*;

public class register extends JFrame implements ActionListener {

private String name;
private int age;

public register(String name_, int age_) {
 name = name_;
 age = age_;
 makeFrame("Personell register");
}

public static void main (String args[]) {
 register myReg = new register("Roger",30);
}

private void makeFrame(String title) {
 JFrame frame = new JFrame(title);
 frame.setLayout(null);
 frame.setSize(400,400);

 JButton btn = new JButton("Change");
 btn.setBounds(10,10,100,20);
 btn.addActionListener(this);
 frame.add(btn);

 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 frame.setVisible(true);
}

public void actionPerformed(ActionEvent a) { // Forandre navn
 myReg.name = "Bobby!";
}
}

 

 

Min kode gir følgende feilmelding:

"myReg cannot be resolved to a variable".

Endret av StAkkarr
Lenke til kommentar

Som sagt. Lenge siden jeg har drevet med Java, men du må deklarere variabelen i klassen.

private String name;
private int age;
private register myReg; // <- Denne må inn for at klassen skal vite om den..

I tillegg så bør du vel lese deg opp litt på statiske variabler og klasser slik jeg ser du har brukt denne klassen...

Endret av ChristianW
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...