jevli Skrevet 19. januar 2013 Del Skrevet 19. januar 2013 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
Persn Skrevet 19. januar 2013 Del Skrevet 19. januar 2013 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
jevli Skrevet 19. januar 2013 Forfatter Del Skrevet 19. januar 2013 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
Wattengård Skrevet 19. januar 2013 Del Skrevet 19. januar 2013 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 (Go .NET! )) -C- 1 Lenke til kommentar
jevli Skrevet 19. januar 2013 Forfatter Del Skrevet 19. januar 2013 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
Persn Skrevet 19. januar 2013 Del Skrevet 19. januar 2013 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
jevli Skrevet 20. januar 2013 Forfatter Del Skrevet 20. januar 2013 (endret) 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 20. januar 2013 av StAkkarr Lenke til kommentar
Persn Skrevet 20. januar 2013 Del Skrevet 20. januar 2013 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
jevli Skrevet 20. januar 2013 Forfatter Del Skrevet 20. januar 2013 Ok, hjertelig takk så langt Lenke til kommentar
jevli Skrevet 20. januar 2013 Forfatter Del Skrevet 20. januar 2013 (endret) 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 20. januar 2013 av StAkkarr Lenke til kommentar
Wattengård Skrevet 20. januar 2013 Del Skrevet 20. januar 2013 (endret) 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 20. januar 2013 av ChristianW Lenke til kommentar
jevli Skrevet 20. januar 2013 Forfatter Del Skrevet 20. januar 2013 Jeg henger med, og programmet mitt (forøvrig min første GUI i Java) fungerer nå utmerket! Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå