9
Tags:
java
Skrevet af
Bruger #15301
@ 29.09.2011
Indledning
I denne artikel, vil vi arbejde videre på, hvad vi fik lavet i den første artikel. Kort sagt, vil vi have en lommeregner, der kan pluse og minuse, det input brugeren taster ind (dog med visse begrænsninger, hvor du selv har muligheden, for at folde dig ud og lave en bedre udgave

)
Forudsætninger1) Du skal have lysten, til at følge denne tutorial.
2) Du skal have gennemgået den første del "Java GUI(swing) 1.del"
eller have en basis forståelse for swing
3) En forståelse af nedarvning i java.
Lidt Basis viden omkring ActionListeners
Den eneste ting, vi mangler at komme ind på, for at kunne lave en lommeregner, er hvordan man tjekker, om der er klikket på nogle knapper. I swing gøres dette oftest ved brug af ActionListeners, men dette kan dog gøres på andre metoder, som f.eks. ved brug kombineret brug af en MouseListeners og en MouseMotionListener(Disse kommer vi dog ikke nærmere ind på i denne artikel). En ActionListener virker ved, at det er et interface, som kun indeholder metoden "public void actionPerformed(ActionEvent e)". Der er den metode, der bliver kaldt, når der bliver trykket på for eksempel en JButton, der har en actionListener tilknyttet til sig selv. Da en JButton kun, kan udføre den kode, den har fået at vide, at den skal udføre. Er det derfor vigtigt, at man husker, at tilknytte den actionListener, til den rigtige knap. Dette gøres med metoden "addActionListener(ActionListener l)". Til at gøre dette, er der to forskellige metoder man kan benytte.
Den ene metode er, at man kan lave en anonym indre klasse, som man tilknytter til ens knap direkte.
- JButton b = new JButton();
-
- //En anonymlasse der bliver tilknyttet til vores knap
- b.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- //Todo add your code here
- }
- });
Den anden metode, man kan benytte sig af, er at lave sin helt egen klasse, der implementerer ActionListener interfacet, og derefter tilknytte sin egen klasse til de knapper man har lyst til at tilknytte den til. Et godt sted, at gøre dette er hvis, man har flere knapper der ca. skal udføre den samme kode.
- //Et eksempel på vores egen ActionListenerKlasse
- class Listener implements ActionListener{
- public void actionPerformed(ActionEvent e) {
- //Todo add your code here
- }
- }
- Listener listener = new Listener();
- JButton b = new JButton();
- b.addActionListener(listener);
Et overblik over, hvad der sker når man klikker på en knapOpgaven og løsningen
Da vi allerede fik lavet alt grafikken, i vores forrige afsnit; mangler vi nu bare at nævne, hvad der skal ske når en bruger indtaster input, og få vores funktion til at virke, så hensigtsmæssig som mulig. Det mål vi sætter for denne applikation, er at selve betjeningen af lommeregneren, skal minde om den, brugeren allerede kender fra standard lommeregneren i windows. Hvor brugeren, blot kan taster på tal og skrive tegnene plus eller minus foran de værdier, for at brugeren til sidst kan se, det samlede regnestykke, han gerne vil have udført. Når brugeren så er tilfreds med regnestykket, trykkes der blot på "Enter" og så udregner lommeregneren stykket, og viser så det endelige resultat.
For at opnå alt dette, vil vi dele denne opgave op i flere dele.
1) Få knapperne til at virke, hensigtsmæssigt ved at klikke med musen.
2) Få lommeregneren til faktisk, at kunne regne.
3) Få lommeregneren til at fungerer, ved at man trykker på knapperne.
Få knapperne til at virke
For at computeren, ved hvilken kode du gerne vil have til at ske, når du klikker på de forskellige knapper. Skal man tilknytte en "ActionListener" listener til, hver knap. Dog kan man sagtens genbruge den samme ActionListener på de forskellige knapper, og så inde i selve ens AktionListener kan man definerer, hvad der skal ske, alt afhængigt af, hvilken knap der er blevet trykket på. Da vi benytter os af denne tilgang, deler vi vores applikation op i to forskellige klasser, den første "ButtonListener" der er vores egen aktionlistener og vores "Frame" klasse fra "Java GUI(swing) 1.del". Men det var vidst også en lidt lang, snak om hvordan det virker, nu er det vidst på tide, at vi får kodet lidt og kommer videre med vores lommeregner.
Her kommer koden for vores ButtonListener
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
-
- import javax.swing.JFrame;
- import javax.swing.JTextField;
-
-
- public class ButtonListener implements ActionListener {
-
- private JTextField text;
- private String button;
- private JFrame frame;
-
- public ButtonListener(JTextField text, JFrame frame){
- this.text = text;
- this.frame = frame;
- }
-
- /*
- * Denne metode bliver kaldt, når det komponent som dette object er tilknyttet til
- * generer en aktion, dette sker f.eks når der bliver trykket på en JButton knap.
- */
- public void actionPerformed(ActionEvent ae) {
- //Denne string, fortæller navnet på det komponent, som genereret eventet
- button = ae.getActionCommand();
-
- /*
- * Denne test tjekker, om der står 0 i textboxen i forvejen
- * Hvis der gør overskrives 0 med, det tal man har trykket på
- * Hvis der derimod ikke gør, så tilføjer man blot det indtastet tal,
- * til den tekst, der er i tekstboksen i forvejen.
- */
- if(Character.isDigit(button.charAt(0))){
- if(text.getText().equals("0")){
- text.setText(button);
- }
- else{
- text.setText(text.getText().concat(button));
- }
- }
-
- //Denne tilføjes, så man kan se, at der sker noget, når man klikker på knapperne
- //Dette er dog kun en test og skal snart fjernes igen.
- System.out.println(button);
-
- }
-
- }
Og Her er koden for vores Frame
- import java.awt.BorderLayout;
- import java.awt.Dimension;
- import java.awt.Font;
- import java.awt.GridLayout;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.JPanel;
- import javax.swing.JTextField;
- import javax.swing.UIManager;
-
- public class Frame extends JFrame {
- // Constructor
- public Frame() {
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- this.setSize(200, 300);
- // Her er vores JPanel, der skal holde alle vores knapper
- JPanel grid = new JPanel();
- grid.setLayout(new GridLayout(4, 3));
-
- // Her tilføjer vi det felt, hvor både vores input og output kan stå i
- JTextField text = new JTextField();
- text.setPreferredSize(new Dimension(200, 45));
- text.setFont(new Font("Serif",Font.PLAIN,16));
-
- // Her er vores AktionListener
- ButtonListener buttonListener = new ButtonListener(text, this);
- // Her er vores array af knapper
- JButton[] buttonGrid = new JButton[10];
- for (int i = 1; i <= 9; i++) {
- buttonGrid[i] = new JButton("" + i);
- //Her tilføjer vi vores AktionListener til vores talknapper
- buttonGrid[i].addActionListener(buttonListener);
- grid.add(buttonGrid[i]);
- }
- // Og her tilføjer vi så lidt ekstra knapper til vores grid
- // Hvor vi også tilføjer den samme AktionListener til vores ekstra knapper
- JButton zeroButton = new JButton("0");
- zeroButton.addActionListener(buttonListener);
- JButton plusButton = new JButton("+");
- plusButton.addActionListener(buttonListener);
- JButton minusButton = new JButton("-");
- minusButton.addActionListener(buttonListener);
- JButton resultButton = new JButton("Result");
- resultButton.addActionListener(buttonListener);
-
- grid.add(zeroButton);
- grid.add(plusButton);
- grid.add(minusButton);
-
- // Her tilføjer vi både vores textfelt og vores grid til vores vindue
- this.add(text, BorderLayout.NORTH);
- this.add(grid, BorderLayout.CENTER);
- this.add(resultButton,BorderLayout.SOUTH);
- // Her sætter vi vores vindue til at være synligt
- this.setVisible(true);
- }
-
- public static void main(String[] args) {
- try {
- UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
- } catch (Exception e) {
- }
- Frame frame = new Frame();
- }
- }
Få lommeregneren til at kunne regne
Nu da vi faktisk, har alt layoutet på plads og kan skelne imellem, hvilke knapper, der bliver trykket på, så er det på tide, at give lidt intelligens til vores applikation. Med intelligens menes dog, kun evnen til at kunne benytte sig af, de basale regneregler "plus" og "minus". Dette kunne dog, umindbart lyde ligetil, og det er det næsten også. Det er jo sådanne med programmering, at der er ufatteligt, mange måder man kan opnå, det samme på. Denne løsning jeg kommer med her, er kun en af de utallige mange mulige løsninger der findes. Du kan muligvis, selv lave en bedre og kortere kode; hvis du lægger dit hoved i blød og tænker grundigt over, hvad det er vi forsøger at gøre. Men for at komme videre i dagens tekst, så lad os først analyserer, hvad vi forventer, at vores lommeregner skal kunne.
En kort analyse af simple regnestykkerNår man gerne vil regne med lommeregneren, er her et par eksempler, af hvad de fleste brugere vil skrive, når de benytter sig af en lommeregner.
Brugeren skriver Lommeregnerens svar"2+2" 4
"2+2-50" -46
"-50+300" 250
"-500+300-500" -700
I det første eksempel, skal de to tal, der er adskilt af + lægges sammen. I det andet eksempel skal de to første tal lægges sammen, da de er adskilt af et plus, og det tredje tal, der er adskilt af de andre med et minus skal trækkes fra. I det tredje eksempel, skal 50 trækkes fra, og der skal lægges 300 til.
Vi har altså en situation, hvor at det er det symbol, der kommer før vores tal, der bestemmer, hvad vi skal gøre med vores tal.
UdfordringenDette virker jo næsten ligetil, at gøre, bare at se på hvilket symbol, der er foran tallet, og så ellers lægge tallet fra eller til vores resultat. Problemet består i, at vores input fra brugene modtager vores program som en String, og vi skal herefter til at splitte vores input korrekt op, før at vi kan bruge det ordentligt. En af de muligheder, vi har er at benytte os af String objektets indbygget "split" metode. Denne metode returnerer et array af Strings, hvor vi har defineret at Stringen skal splittes. Denne metode vælger jeg ikke, at benytte mig af, da man kun kan splitte en karakter adgangen. Det vil sige, at vi først skulle igennem, en split med plus og derefter for hver String vi ville få med plus, skulle vi også igennem en split med minus. Den metode, vi vil benytte os, af er at tjekke Stringen igennem, for hvert symbol, og hvis der findes et symbol på den plads vi er ved, så ved vi, at der er et tal efterfulgt at symbolet, indtil det næste symbol. Og på denne måde ville vi kører hele Stringen igennem, og så lægge de rigtige tal til og fra, og dermed få det korrekte resultat.
Dette var en længere smøre, så for at få en opsummering af dette, kan I se java koden, for at gøre vores lommeregner lidt mere intilligent her.
- //Denne metode udregner vores input
- private BigDecimal calculate(String input){
- //Disse lister indeholder, de alle vores tal, altafhængigt, af om de skal lægges til eller trækkes fra.
- ArrayList<BigDecimal> positiveNumbers = new ArrayList<BigDecimal>();
- ArrayList<BigDecimal> negativeNubers = new ArrayList<BigDecimal>();
- BigDecimal result = new BigDecimal("0");
-
- //Denne variable definerer, om det er plus eller minus
- int symbol = 1;
- //Disse variabler gemmer, hvornår vores tal starter og slutter.
- int numberStart = 0;
- int numberEnd = 0;
-
- //Denne metode skiller, de positive og negative tal, i to forskellige lister.
- for (int i = 0; i < input.length(); i++) {
- if (!Character.isDigit(input.charAt(i))) {
- if(i == 0){
- numberEnd = i;
- }else{
- numberEnd = i;
- if (symbol == 1) {
- positiveNumbers.add(new BigDecimal(input.substring(numberStart, numberEnd)));
- } else if (symbol == 2) {
- negativeNubers.add(new BigDecimal(input.substring(numberStart, numberEnd)));
- }
-
- if (input.charAt(i) == '+') {
- symbol = 1;
- } else if (input.charAt(i) == '-') {
- symbol = 2;
- }
- numberStart = numberEnd + 1;
- }
- } else {
- if (i == input.length() - 2) {
- numberEnd = i + 2;
- if (symbol == 1) {
- positiveNumbers.add(new BigDecimal(input.substring(numberStart, numberEnd)));
- } else if (symbol == 2) {
- negativeNubers.add(new BigDecimal(input.substring(numberStart, numberEnd)));
- }
- }
- }
- }
-
- //Disse to for-loops ligger vores tal fra og til vores resultat.
- for (BigDecimal pos : positiveNumbers) {
- result = result.add(pos);
- }
-
- for (BigDecimal neg : negativeNubers) {
- result = result.subtract(neg);
- }
-
- //Vi retunerer vores resultat.
- return result;
- }
FejlSikringNu da, vi har fået gjort, vores lommeregner lidt intelligent, så er det vidst på tide, at vi sikrer os, at vi stort set, kun kan få korrekt input fra brugeren. Dette gør vi igen, i vores AktionListener, ved at lave en Try-Catch statement uden om vores udregning, for så derefter, at forsøge, at korrekte vores brugers input(I dette eksempel, fjerner vi blot, det sidste symbol, hvis brugeren er kommet til at indtaste "22+32++". Efter at vi har fået "Fejl sikret vores lommeregner, ser koden for ButtonListeneren således ud.
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.math.BigDecimal;
- import java.util.ArrayList;
-
- import javax.swing.JFrame;
- import javax.swing.JOptionPane;
- import javax.swing.JTextField;
-
-
- public class ButtonListener implements ActionListener {
-
- private JTextField text;
- private String button;
- private JFrame frame;
-
- public ButtonListener(JTextField text, JFrame frame){
- this.text = text;
- this.frame = frame;
- }
-
- /*
- * Denne metode bliver kaldt, når det komponent som dette object er tilknyttet til
- * generer en aktion, dette sker f.eks når der bliver trykket på en JButton knap.
- */
- public void actionPerformed(ActionEvent ae) {
- //Denne string, fortæller navnet på det komponent, som genereret eventet
- button = ae.getActionCommand();
-
- /*
- * Denne test tjekker, om der står 0 i textboxen i forvejen
- * Hvis der gør overskrives 0 med, det tal man har trykket på
- * Hvis der derimod ikke gør, så tilføjer man blot det indtastet tal,
- * til den tekst, der er i tekstboksen i forvejen.
- */
- if(Character.isDigit(button.charAt(0))){
- if(text.getText().equals("0")){
- text.setText(button);
- }
- else{
- text.setText(text.getText().concat(button));
- }
- }
- else if(button.equals("Result")){
- String input = text.getText();
-
- try{
- text.setText(calculate(input).toString());
- }catch(Exception e){
- try{
- text.setText(calculate(correctInput(input)).toString());
- }catch(Exception ex){
- JOptionPane.showMessageDialog(frame, "Your input don't have the correct format keep it like this: \n 1+2 or \n -4+24+32-3", "Error Message", 0);
- }
- }
- }
- else{
- text.setText(text.getText().concat(button));
- }
-
- //Denne tilføjes, så man kan se, at der sker noget, når man klikker på knapperne
- //Dette er dog kun en test og skal snart fjernes igen.
- System.out.println(button);
-
- }
-
- //Denne metode sørger for, at vi ikke har noget symbol i slutningen af vores input
- public static String correctInput(String in){
- String correct = in;
-
- for(int i = 0; i < in.length(); i++){
- if(i == in.length()-1){
- if(!Character.isDigit(in.charAt(i))){
- correct = correct.substring(0, in.length()-1);
- }
- }
- }
-
- return correct;
- }
-
- //Denne metode udregner vores input
- private BigDecimal calculate(String input){
- //Disse lister indeholder, de alle vores tal, altafhængigt, af om de skal lægges til eller trækkes fra.
- ArrayList<BigDecimal> positiveNumbers = new ArrayList<BigDecimal>();
- ArrayList<BigDecimal> negativeNubers = new ArrayList<BigDecimal>();
- BigDecimal result = new BigDecimal("0");
-
- //Denne variable definerer, om det er plus eller minus
- int symbol = 1;
- //Disse variabler gemmer, hvornår vores tal starter og slutter.
- int numberStart = 0;
- int numberEnd = 0;
-
- //Denne metode skiller, de positive og negative tal, i to forskellige lister.
- for (int i = 0; i < input.length(); i++) {
- if (!Character.isDigit(input.charAt(i))) {
- if(i == 0){
- numberEnd = i;
- }else{
- numberEnd = i;
- if (symbol == 1) {
- positiveNumbers.add(new BigDecimal(input.substring(numberStart, numberEnd)));
- } else if (symbol == 2) {
- negativeNubers.add(new BigDecimal(input.substring(numberStart, numberEnd)));
- }
-
- if (input.charAt(i) == '+') {
- symbol = 1;
- } else if (input.charAt(i) == '-') {
- symbol = 2;
- }
- numberStart = numberEnd + 1;
- }
- } else {
- if (i == input.length() - 2) {
- numberEnd = i + 2;
- if (symbol == 1) {
- positiveNumbers.add(new BigDecimal(input.substring(numberStart, numberEnd)));
- } else if (symbol == 2) {
- negativeNubers.add(new BigDecimal(input.substring(numberStart, numberEnd)));
- }
- }
- }
- }
-
- //Disse to for-loops ligger vores tal fra og til vores resultat.
- for (BigDecimal pos : positiveNumbers) {
- result = result.add(pos);
- }
-
- for (BigDecimal neg : negativeNubers) {
- result = result.subtract(neg);
- }
-
- //Vi retunerer vores resultat.
- return result;
- }
-
- }
Få lommeregneren til at fungerer
Nu da vi har en lommeregner, der kan regne og er lidt fejlsikret, så er det på tide, at vi begynder at tænke, på hvordan det er nemmest og mest intuitiv, for brugen at benytte sig af vores lommeregner. En af de ulemper, Som den opmærksomme læser, har lagt mærke til, er at man ikke blot kan taste, på knapperne, og så trykke på Enter for at få svaret. Man kan dog, indtaste sine tal, med plus og minus og trykke på gange og dividerer, og få dette ind og få lommeregneren til at regne(men så regner den oftest forkert). For at undgå disse små ulemper, vil vi kun lade brugen indtaste, de inputs vores lommeregner kan regne på, og give det rigtige resultat. Dette gør, vi ved at benytte os af noget, der minder om vores AktionListener, som hedder en KeyListener denne klasse får vi vores Frame klasse til at implementerer, og får på den måde alle key-tryk til at gå igennem os, så vi kan tjekke at brugerne kun kan indtaste de inputs vi bestemmer. Men nu er jeg vidst begyndt, på en lidt for lang tale igen, så mon ikke vi hellere, skal se på koden for, hvordan det endeligt ser ud.
Vores Button Listener
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.math.BigDecimal;
- import java.util.ArrayList;
-
- import javax.swing.JFrame;
- import javax.swing.JOptionPane;
- import javax.swing.JTextField;
-
-
- public class ButtonListener implements ActionListener {
-
- private JTextField text;
- private String button;
- private JFrame frame;
-
- public ButtonListener(JTextField text, JFrame frame){
- this.text = text;
- this.frame = frame;
- }
-
- /*
- * Denne metode bliver kaldt, når det komponent som dette object er tilknyttet til
- * generer en aktion, dette sker f.eks når der bliver trykket på en JButton knap.
- */
- public void actionPerformed(ActionEvent ae) {
- //Denne string, fortæller navnet på det komponent, som genereret eventet
- button = ae.getActionCommand();
-
- /*
- * Denne test tjekker, om der står 0 i textboxen i forvejen
- * Hvis der gør overskrives 0 med, det tal man har trykket på
- * Hvis der derimod ikke gør, så tilføjer man blot det indtastet tal,
- * til den tekst, der er i tekstboksen i forvejen.
- */
- if(Character.isDigit(button.charAt(0))){
- if(text.getText().equals("0")){
- text.setText(button);
- }
- else{
- text.setText(text.getText().concat(button));
- }
- }
- else if(button.equals("Result")){
- String input = text.getText();
-
- try{
- text.setText(calculate(input).toString());
- }catch(Exception e){
- try{
- text.setText(calculate(correctInput(input)).toString());
- }catch(Exception ex){
- JOptionPane.showMessageDialog(frame, "Your input don't have the correct format keep it like this: \n 1+2 or \n -4+24+32-3", "Error Message", 0);
- }
- }
- }
- else if(button.equals("Decimal")){
- text.setText(text.getText().concat("."));
- }
- else{
- text.setText(text.getText().concat(button));
- }
-
- frame.requestFocus();
-
- }
-
- //Denne metode sørger for, at vi ikke har noget symbol i slutningen af vores input
- public static String correctInput(String in){
- String correct = in;
-
- for(int i = 0; i < in.length(); i++){
- if(i == in.length()-1){
- if(!Character.isDigit(in.charAt(i))){
- correct = correct.substring(0, in.length()-1);
- }
- }
- }
-
- return correct;
- }
-
- //Denne metode udregner vores input
- private BigDecimal calculate(String input){
- //Disse lister indeholder, de alle vores tal, altafhængigt, af om de skal lægges til eller trækkes fra.
- ArrayList<BigDecimal> positiveNumbers = new ArrayList<BigDecimal>();
- ArrayList<BigDecimal> negativeNubers = new ArrayList<BigDecimal>();
- BigDecimal result = new BigDecimal("0");
-
- //Denne variable definerer, om det er plus eller minus
- int symbol = 1;
- //Disse variabler gemmer, hvornår vores tal starter og slutter.
- int numberStart = 0;
- int numberEnd = 0;
-
- //Denne metode skiller, de positive og negative tal, i to forskellige lister.
- for (int i = 0; i < input.length(); i++) {
- if (!Character.isDigit(input.charAt(i))) {
- if(i == 0){
- numberEnd = i;
- }else{
- numberEnd = i;
- if (symbol == 1) {
- positiveNumbers.add(new BigDecimal(input.substring(numberStart, numberEnd)));
- } else if (symbol == 2) {
- negativeNubers.add(new BigDecimal(input.substring(numberStart, numberEnd)));
- }
-
- if (input.charAt(i) == '+') {
- symbol = 1;
- } else if (input.charAt(i) == '-') {
- symbol = 2;
- }
- numberStart = numberEnd + 1;
- }
- } else {
- if (i == input.length() - 2) {
- numberEnd = i + 2;
- if (symbol == 1) {
- positiveNumbers.add(new BigDecimal(input.substring(numberStart, numberEnd)));
- } else if (symbol == 2) {
- negativeNubers.add(new BigDecimal(input.substring(numberStart, numberEnd)));
- }
- }
- }
- }
-
- //Disse to for-loops ligger vores tal fra og til vores resultat.
- for (BigDecimal pos : positiveNumbers) {
- result = result.add(pos);
- }
-
- for (BigDecimal neg : negativeNubers) {
- result = result.subtract(neg);
- }
-
- //Vi retunerer vores resultat.
- return result;
- }
-
- }
Og vores Frame
- import java.awt.BorderLayout;
- import java.awt.Dimension;
- import java.awt.Font;
- import java.awt.GridLayout;
- import java.awt.event.KeyEvent;
- import java.awt.event.KeyListener;
-
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.JPanel;
- import javax.swing.JTextField;
- import javax.swing.UIManager;
-
- public class Frame extends JFrame implements KeyListener {
-
- //Alle vores knapper
- JButton zeroButton;
- JButton plusButton;
- JButton minusButton;
- JButton resultButton;
- JButton[] buttonGrid;
-
- // Constructor
- public Frame() {
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- this.setSize(200, 300);
- this.addKeyListener(this);
- // Her er vores JPanel, der skal holde alle vores knapper
- JPanel grid = new JPanel();
- grid.setLayout(new GridLayout(4, 3));
-
- // Her tilføjer vi det felt, hvor både vores input og output kan stå i
- JTextField text = new JTextField();
- text.setPreferredSize(new Dimension(200, 45));
- text.setFont(new Font("Serif",Font.PLAIN,16));
-
- // Her er vores AktionListener
- ButtonListener buttonListener = new ButtonListener(text, this);
- // Her er vores array af knapper
- buttonGrid = new JButton[10];
- for (int i = 1; i <= 9; i++) {
- buttonGrid[i] = new JButton("" + i);
- //Her tilføjer vi vores AktionListener til vores talknapper
- buttonGrid[i].addActionListener(buttonListener);
- grid.add(buttonGrid[i]);
- }
- // Og her tilføjer vi så lidt ekstra knapper til vores grid
- // Hvor vi også tilføjer den samme AktionListener til vores ekstra knapper
- zeroButton = new JButton("0");
- zeroButton.addActionListener(buttonListener);
- plusButton = new JButton("+");
- plusButton.addActionListener(buttonListener);
- minusButton = new JButton("-");
- minusButton.addActionListener(buttonListener);
- resultButton = new JButton("Result");
- resultButton.addActionListener(buttonListener);
-
- grid.add(zeroButton);
- grid.add(plusButton);
- grid.add(minusButton);
-
- // Her tilføjer vi både vores textfelt og vores grid til vores vindue
- this.add(text, BorderLayout.NORTH);
- this.add(grid, BorderLayout.CENTER);
- this.add(resultButton,BorderLayout.SOUTH);
- // Her sætter vi vores vindue til at være synligt
- this.setVisible(true);
- this.requestFocus();
- }
-
- public static void main(String[] args) {
- try {
- UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
- } catch (Exception e) {
- }
- Frame frame = new Frame();
- }
-
-
- //En metode, der definerer, hvad der skal ske, når der bliver trykket på en knap
- public void keyPressed(KeyEvent ke) {
- int key = ke.getKeyCode();
-
- switch(key){
- case KeyEvent.VK_ENTER:
- resultButton.doClick();
- break;
- case KeyEvent.VK_ADD:
- plusButton.doClick();
- break;
- case KeyEvent.VK_SUBTRACT:
- minusButton.doClick();
- break;
- case KeyEvent.VK_NUMPAD0:
- zeroButton.doClick();
- break;
- case KeyEvent.VK_NUMPAD1:
- buttonGrid[1].doClick();
- break;
- case KeyEvent.VK_NUMPAD2:
- buttonGrid[2].doClick();
- break;
- case KeyEvent.VK_NUMPAD3:
- buttonGrid[3].doClick();
- break;
- case KeyEvent.VK_NUMPAD4:
- buttonGrid[4].doClick();
- break;
- case KeyEvent.VK_NUMPAD5:
- buttonGrid[5].doClick();
- break;
- case KeyEvent.VK_NUMPAD6:
- buttonGrid[6].doClick();
- break;
- case KeyEvent.VK_NUMPAD7:
- buttonGrid[7].doClick();
- break;
- case KeyEvent.VK_NUMPAD8:
- buttonGrid[8].doClick();
- break;
- case KeyEvent.VK_NUMPAD9:
- buttonGrid[9].doClick();
- break;
- }
-
- }
-
-
-
- @Override
- public void keyReleased(KeyEvent e) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void keyTyped(KeyEvent ke) {
- // TODO Auto-generated method stub
-
-
- }
- }
En lille forklaring af, hvordan en KeyListener virkerFor at benytte sig af en KeyListener, skal man have en klasse, der implementerer KeyListener klassen, (ligesom vores Frame implementerede KeyListener) Derudover, skal man tilføje hvilke elementer at denne KeyListener, skal fungerer på, ligesom da vi definerede satte vores Frame til at lytte til sig selv, med "this.addKeyListener(this);" som er et eksempel på dette. Ligesom med vores AktionListener, kan man også bruge den samme KeyListener på flere elementer. Lige en sidste ting, der skal nævnes om KeyListeners er, at for at de virker, kræver det, at det element de er tilknyttet har focus, ligesom vi gjorde da, vi benytte os af metoden "frame.requestFocus();" i vores ButtonListener.
Et billed af vores endelige lommeregnerRunable JAR file
Nu da vi har lavet en lommeregner, der virker via gui, ville det ikke være særligt brugervenligt, hvis vores brugere(højst sandsynligvis os selv) skal ind til cmd, og først finde stien til vores lommeregner, før de kan benytte sig af vores program. Det ville være noget nemmere, hvis vi havde en fil vi bare kunne dobbelt klikke på, og så ville vores program starte. Dette har java heldigvis, en mekanisme til at gøre, desværre er denne mekanisme, ikke helt optimal, da man for eksempel ikke kan have et ikon på sin .jar fil. Der findes metoder til at komme udover dette problem, blandt andet ved at lave en installer, eller at lave en .exe fil der kører ens java program. Men for øjeblikke er det nok for os, at få lavet vores program om, fra kun at kunne kører fra cmd til, også at kunne kører via en fil på computeren.
Dette kan forholdsvist simpelt gøres ved at man benytte sig af programmet "jar.exe" der kommer med når man downloader sin version af jdk. Men som ethvert andet program, skal det vide hvad det skal gøre, før det kan udføre det. Processen med at lave en runnable .jar file kan deles ind i 3 dele.
1) Skrive sin manifest-fil
2) give jar.exe de rigtige argumenter
3) Køre sit program
For at lave en manifest fil kan man benytte sig af en text editor.
I denne editor skriver man så følgende:
" Main-Class: Frame
"
PS: Det er vigtigt, at ende sin fil, med en ny linje, da filen ellers ikke vil blive læst korrekt.
Dette gemmes så som et text dokument f.eks "Manifest.txt" i samme mappe, hvor man har de .class filer, som man gerne vil inkluderer i ens .jar fil.
For at give en jar.exe starter man med at sikrer sig, at man har sat en path til "C:\Program Files (x86)\Java\jdk1.6.0_27\bin" eller hvor din jdk nu måtte befinde sig på din computer. Herefter åbner man en kommandopromt til stien, hvor ens java projekt befinder sig, og til den mappe, hvor man har sine .class filer.
Et billed af cmd, inde i mappen med .class filerneNår man har sikret sig at man har sat sin windows PATH korrekt, og man er inde i den rigtige mappe skal man give ens kommandopromt følgende parametre.
"jar cfm Calculator.jar Manifest.txt *"
Et billed af cmd med parameterne til jar.exeHvor jar er det program du starter og resten er de argumenter du starter programmet med.
"cfm" 'c' står for at man vil lave en .jar file og 'f' indikerer, at du gerne vil have output til en fil i stedet for til stdout, og 'm' står for, at man gerne vil merge information til den eksisterende manifest fil.
"Calculator.jar" er det navn, man giver sin .jar fil.
"Manifest.txt" er den fil man gerne vil merge den eksisterende manifest fil med.
"*" står for at man includerer alle de filer, der er i den mappe man er i til .jar filen.
Et billed af vores mappe, efter vi har lavet vores .jar filHerefter er det blot at kører filen, ved at dobbelt klikke på den, og så kan du nyde din indsats i at lave et helt program fra bunden af

Et billed af vores lommeregner, køre via vores .jar filKonklusion
Tillykke, du har nu lavet din første lommeregner, og har igennem forløbet, lært en masse om swing, og måske også en smule mere java end du kunne før. Efter denne tutorial, af to dele skulle du meget gerne have en grund forståelse af swing, og have lysten til at lave/lære mere med swing.
Med denne viden kan du stort, set lave alle de programmer til din pc, som du ønsker at lave, kun fantasien,computeren og mest af alt, hvor meget tid du vil afsætte sætter grænser for, hvad du kan programmerer.
Dog skal det, nævnes at selvom man kan lave, ting med java og swing, så er det muligt, at der er andre teknologier, der er bedre til at lave andre ting (f.eks) 3D programmering, er swing ikke lige det bedste til.
Forfatters noteTak for din tid til at læse, denne tutorial igennem, jeg håber du har nydt den, at læse den ligeså meget og mere til end jeg har nydt at lave den

. Tiltrods for, at der ikke har været særligt mange billeder, til denne anden del.
Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.
Del også gerne artiklen med dine Facebook venner:
Kommentarer (8)
Er den tredje del på vej??
Selve artikel-titlen må gerne ændres, så den indeholder mellemrum lige som del 1. Og ja, tags mangler også for titlen

ellers en god artikel.
ja, jeg opdagede det først efter, at jeg havde sendt den ind, og var blevet godkendt især det med tagsne

.. Men, da det ville kræve at den skulle godkendes engang til, har jeg tænkt på at vente med at rette fejlene, indtil den næste artikel i serien kommer
ja, jeg opdagede det først efter, at jeg havde sendt den ind, og var blevet godkendt især det med tagsne

.. Men, da det ville kræve at den skulle godkendes engang til, har jeg tænkt på at vente med at rette fejlene, indtil den næste artikel i serien kommer
Bed eventuelt Kasper (admin) om at rette alle fejlene..
Hej Kevin er der en tredje på vej?
Ville gerne vide noget mere om gridbag layout og cardlayout
Når jeg prøver at lave .jar filen siger den:
'jar' is not recognized as an internal or external command,
operable program or batch file.
Jeg har installeret Java SE Development Kit 8u111. Burde den ikke kunne gøre det?
Jeg har fundet ud af det
Du skal være
logget ind for at skrive en kommentar.