Avatar billede jaffafo Nybegynder
28. december 2005 - 04:41 Der er 3 kommentarer og
1 løsning

ComboBox problem

Jeg forsøger at udbygge mit lille program med en ComboBox, hvor jeg vil bestemme via valg i comboboxen hvor mange "lodsedler" mit program skal "lave"..

kode:

package Lotto;
import java.util.Random;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;

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

public class Lotto extends JFrame {
    private JLabel antaltal, tal, klikviser, version;
    private JPanel mainPanel, topPanel, indholdPanel;
    private JComboBox CboxAntalSedler;
    private static int klik = 0;
   
    public Lotto() {
        //Sætter nogle options på JFrame
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new GridLayout(1,1));
        setTitle("Lotto");
        //setBounds(0,20,215,117);
        this.setResizable(false);
        try {
            UIManager.setLookAndFeel(
                UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            System.out.println(e.toString());
        }
       
        //Sætter en button
        JButton knap = new JButton();
        knap.setText("Hent nye tal");
        //knap.setMinimumSize(new Dimension(20,20));
        knap.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                knapklik(evt);
            }
        });
       
        //Laver Combobox
        JComboBox CboxAntalSedler = new JComboBox();
        //CboxAntalSedler.setSize(100,40);
        CboxAntalSedler.addItem(1);
        CboxAntalSedler.addItem(2);
        CboxAntalSedler.addItem(3);
        CboxAntalSedler.addItem(4);
        CboxAntalSedler.addItem(5);
       
        //Laver labels
        antaltal = new JLabel("");
        tal = new JLabel("");
        klikviser = new JLabel("");
        version = new JLabel("");
       
        //Tilføjer tekst til label
        String streng3 = " Version: 0.2";
        version.setText(streng3);
        version.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.black));
       
        //Sætter topPanel
        JPanel topPanel = new JPanel();
        topPanel.setLayout(new GridLayout(1,2));
        topPanel.add(knap);
        topPanel.add(CboxAntalSedler);
       
        //Sætter indholdPanel
        JPanel indholdPanel = new JPanel();
        indholdPanel.setLayout(new GridLayout(4,1));
        //topPanel.setBorder(BorderFactory.createLineBorder(Color.black)); 
        indholdPanel.add(antaltal);
        indholdPanel.add(tal);
        indholdPanel.add(klikviser);
        indholdPanel.add(version);
       
        //Sætter mainPanel
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());
        mainPanel.setVisible(true);
        mainPanel.add(topPanel, BorderLayout.NORTH);
        mainPanel.add(indholdPanel, BorderLayout.SOUTH);
       
        getContentPane().add(mainPanel);

        pack();
    }
   
    private void knapklik(java.awt.event.ActionEvent evt) {
        List liste = talfinder();
        //Tilføjer tekst til labels
        String streng = " Du får " + liste.size() + " rigtige tal.";
        antaltal.setText(streng);
        String streng2 = " Dine lottotal: " + talstreng(liste);
        tal.setText(streng2);
       
        //tilføjer 1 til integer klik og laver den om til en string
        klik++;
        String kliks = String.valueOf(klik);
        klikviser.setText(" Antal lottosedler: " + kliks);
        //pack();
       
        //tjekker hvor mange lottosedler er valgte
        int valgteSedler = Integer.parseInt(CboxAntalSedler.getSelectedItem().toString());
        if (valgteSedler > 0) {
            System.out.println(valgteSedler);
        }
    }
   
    public static void main(String[] args) {
        Lotto f = new Lotto();
        f.setVisible(true);
    }

    private static List talfinder() {
        Random generator = new Random();
        List lst = new ArrayList();
        int tal = 0;
        int a = 7;
        //Finder 7 tal mellem 1 og 36 og fyld det på arraylisten
        for (int i = 0; i < a; i++) {
            int num1 = generator.nextInt(35) + 1;
           
            //Tilføjer tal til arraylisten
            if (lst.size() == 0) {
                //smider det udtrukne tal "num1" i arraylisten
                lst.add(num1);
            } else {
                //tjekker om tallet eksisterer i forvejen
                if (taltjek(num1, lst) == true) {
                    //tallet eksisterer allerede
                    System.out.println("Tallet eksisterer allerede");
                    a++;
                } else {
                    //tallet eksisterer ikke så vi tilføjer det
                    lst.add(num1);
                }
            }
        }
        Collections.sort(lst);
        return lst;
    }
   
    private static boolean taltjek(int nyttal,List lst) {
        //skriver tal i arraylisten ud
        boolean nr = false;
        int tal = 0;
        System.out.println("Næste tal: " + nyttal);
       
        for (int i = 0; i < lst.size(); i++) {
            tal = Integer.parseInt(lst.get(i).toString());

            if (tal == nyttal) {
                nr = true;
            }
        }
        return nr;
    }
   
    private static String talstreng(List lst) {
        //skriver tal i arraylisten ud
        String indexnr = "";
        for (int i = 0; i < lst.size(); i++) {
            if(i > 0) indexnr += ", ";
            indexnr += lst.get(i);
        }
        return indexnr;
    }
}


Programmet starter fint og kører også fint, men jeg får nogle mærkelig "fejlbeskeder" i NetBeans (4.1) + min System.out.println(antalSedler); bliver ikke skrevet ud...

Fejlbesked:

init:
deps-jar:
Compiling 1 source file to "STI"\build\classes
Note: "STI"\Lotto.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
compile:
Næste tal: 14
Næste tal: 19
Næste tal: 5
Næste tal: 7
Næste tal: 28
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
Næste tal: 14
        at Lotto.Lotto.knapklik(Lotto.java:104)
Tallet eksisterer allerede
Næste tal: 23
        at Lotto.Lotto.access$000(Lotto.java:12)
        at Lotto.Lotto$1.actionPerformed(Lotto.java:38)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:234)
        at java.awt.Component.processMouseEvent(Component.java:5488)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
        at java.awt.Component.processEvent(Component.java:5253)
        at java.awt.Container.processEvent(Container.java:1966)
        at java.awt.Component.dispatchEventImpl(Component.java:3955)
        at java.awt.Container.dispatchEventImpl(Container.java:2024)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
        at java.awt.Container.dispatchEventImpl(Container.java:2010)
        at java.awt.Window.dispatchEventImpl(Window.java:1774)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
debug:
BUILD SUCCESSFUL (total time: 45 seconds)
Avatar billede _carsten Nybegynder
28. december 2005 - 19:22 #1
Se her:

public class Lotto extends JFrame {
    private JLabel antaltal, tal, klikviser, version;
    private JPanel mainPanel, topPanel, indholdPanel;
    private JComboBox CboxAntalSedler;  // instance variabel som ALDRIG bliver initieret


        //Laver Combobox
        JComboBox CboxAntalSedler = new JComboBox(); /// LOKAL VARIABEL !!!
        //CboxAntalSedler.setSize(100,40);
        CboxAntalSedler.addItem(1);
        CboxAntalSedler.addItem(2);
        CboxAntalSedler.addItem(3);
        CboxAntalSedler.addItem(4);
        CboxAntalSedler.addItem(5);

// Her bruger du din instance variabel som aldrig er initieret
int valgteSedler = Integer.parseInt(CboxAntalSedler.getSelectedItem().toString());


SÅDAN:
        CboxAntalSedler = new JComboBox(); /// INITIER INSTANCE VARIABEL !!!
        //CboxAntalSedler.setSize(100,40);

I øvrigt bør du udskifte din NetBeans 4.1 med 5.0 beta den er væsentlig bedre eller vente 3 uger så hedder den ikke "beta" mere.
Avatar billede jaffafo Nybegynder
29. december 2005 - 00:58 #2
jamen det var jo lige det jeg søgte ;)

Dvs jeg "laver" en instance af JComboBox i toppen, men nede i koden opretter jeg så en ny lokal JComboBox istedet for at bruge den jeg lavede i toppen??

Sorry hvis jeg ingen mening giver, men jeg er jo ny i faget ;)
Avatar billede _carsten Nybegynder
29. december 2005 - 08:28 #3
Ja - det er tæt på at være korrekt

Men da du er ny faget, må vi hellere formulere det lidt anderledes

- "laver" = erklærer CboxAntalSedler som en instance variabel af typen JComboBox
            instance variabel = har scope i hele klassen

- lokal varibel har kun scope indenfor den metode hvor i den er erklæret


- "istedet for at bruge den jeg lavede i toppen??"
Du bruger den du erklærede i toppen, den er bare ikke initieret (new), og derfor er den null
Den lokale CboxAntalSedler som du erklærer og initierer i din constructor kan kun anvendes indenfor constructoren.

Det er kun fordi du er ny, at jeg pensler det lidt ud, vi kan jo lige så godt få dig ind på sporet med det samme :)
Avatar billede jaffafo Nybegynder
29. december 2005 - 17:07 #4
ahh..  nu fatter jeg det.. :)

takker..  du får points ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester