Avatar billede frostware Nybegynder
30. juni 2004 - 14:25 Der er 20 kommentarer og
2 løsninger

tilføje elementer til en liste.

Hej

Jeg vil gerne lave en liste, og har kigget på jList (men er ikke sikker på det er rigtigt)
Jeg vil gerne have at teksten fra en textfield bliver tilføjet på listen når man trykker på en knap.
Avatar billede mikkelbm Nybegynder
30. juni 2004 - 14:31 #1
Et lille eksempel du muligvis kan bruge noget fra:

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

public class Test extends JFrame
{
    public Test()
    {
        setSize(400, 200);
       
        final JTextField text = new JTextField(20);
        JButton ok = new JButton("Ok");
        final DefaultListModel model = new DefaultListModel();
        JList list = new JList(model);
       
        JPanel top = new JPanel();
        top.add(text);
        top.add(ok);
       
        ok.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                model.addElement(text.getText());
                text.setText("");   
            }
        });
       
        this.getContentPane().add(top, BorderLayout.NORTH);
        this.getContentPane().add(new JScrollPane(list), BorderLayout.CENTER);
    }
   
    public static void main(String[] args)
    {
        new Test().show();   
    }
}
Avatar billede mikkelbm Nybegynder
30. juni 2004 - 14:33 #2
Samme eksempel - blot med JTextArea istedet for JList:

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

public class Test extends JFrame
{
    public Test()
    {
        setSize(400, 200);
       
        final JTextField text = new JTextField(20);
        JButton ok = new JButton("Ok");
        final JTextArea area = new JTextArea();
       
        JPanel top = new JPanel();
        top.add(text);
        top.add(ok);
       
        ok.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                area.append(text.getText() + "\n");
                text.setText("");   
            }
        });
       
        this.getContentPane().add(top, BorderLayout.NORTH);
        this.getContentPane().add(new JScrollPane(area), BorderLayout.CENTER);
    }
   
    public static void main(String[] args)
    {
        new Test().show();   
    }
}
Avatar billede frostware Nybegynder
30. juni 2004 - 14:39 #3
kan man gøre sådan at den tilføjer i alfabetisk rækkefølge
Avatar billede frostware Nybegynder
30. juni 2004 - 14:47 #4
lige en anden ting. Hvis teksten som tilføjes allerede findes i listen skal den ikke tilføje den igen, men bare overksrive den anden eller lade den være.
Avatar billede mikkelbm Nybegynder
30. juni 2004 - 14:48 #5
Følgende skulle kunne gøre det:

ok.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        model.addElement(text.getText());
        text.setText("");   
        Object[] o = model.toArray();
        Arrays.sort(o);
        model.clear();
        for (int i = 0; i<o.length; i++)
            model.addElement(o[i]);
    }
});
Avatar billede mikkelbm Nybegynder
30. juni 2004 - 14:49 #6
Og til din sidste kommentar:

ok.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                String temp = text.getText();
                if (!model.contains(temp))
                {
                    model.addElement(text.getText());
                    text.setText("");   
                    Object[] o = model.toArray();
                    Arrays.sort(o);
                    model.clear();
                    for (int i = 0; i<o.length; i++)
                        model.addElement(o[i]);
                }
            }
        });
Avatar billede mikkelbm Nybegynder
30. juni 2004 - 14:50 #7
Husk:

import java.util.*;

Det er den pakke Arrays ligger i!
Avatar billede mikkelbm Nybegynder
30. juni 2004 - 15:02 #8
Jeg lægger et svar, i tilfælde af at du kan bruge det :)
Avatar billede frostware Nybegynder
30. juni 2004 - 15:03 #9
indtil videre har det hele virket. Nogen idé til hvordan man får programmet til at huske det til næste gang det køres. Skal det skrives til en fil eller hvordan gør man det?
Avatar billede mikkelbm Nybegynder
30. juni 2004 - 15:05 #10
Det var en mulighed ja... Jeg ser lige om jeg kan lave et eksempel.
Avatar billede mikkelbm Nybegynder
30. juni 2004 - 15:12 #11
Prøv:

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

public class Test extends JFrame
{
    public Test()
    {
        setSize(400, 200);
       
        final JTextField text = new JTextField(20);
        JButton ok = new JButton("Ok");
        JButton save = new JButton("Gem");
        final DefaultListModel model = new DefaultListModel();
        JList list = new JList(model);
       
        try
        {
            Object[] o = (Object[])OpenSave.hent("list.fil");
           
            for (int i = 0; i<o.length; i++)
                model.addElement(o[i]);
        }
        catch (Exception ex)
        {}
               
        JPanel top = new JPanel();
        top.add(text);
        top.add(ok);
        top.add(save);
               
        ok.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                String temp = text.getText();
                if (!model.contains(temp))
                {
                    model.addElement(text.getText());
                    text.setText("");   
                    Object[] o = model.toArray();
                    Arrays.sort(o);
                    model.clear();
                    for (int i = 0; i<o.length; i++)
                        model.addElement(o[i]);
                }
            }
        });
       
        save.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    OpenSave.gem(model.toArray(), "list.fil");
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        });
       
        this.getContentPane().add(top, BorderLayout.NORTH);
        this.getContentPane().add(new JScrollPane(list), BorderLayout.CENTER);
    }
   
    public static void main(String[] args)
    {
        new Test().show();   
    }
}
Avatar billede mikkelbm Nybegynder
30. juni 2004 - 15:13 #12
Ovenstående bruger klassen:

import java.io.*;

public class OpenSave
{
      public static void gem(Object obj, String filnavn) throws Exception
      {
            try
        {
              FileOutputStream datastrøm = new FileOutputStream(filnavn);
              ObjectOutputStream objektstrøm = new ObjectOutputStream(datastrøm);
              objektstrøm.writeObject(obj);
              objektstrøm.close();
        }
        catch (Exception e)
        {
            throw new RuntimeException("Fejl i skrivning af fil");
        }
      }

      public static Object hent(String filnavn) throws Exception
      {
              FileInputStream datastrøm = new FileInputStream(filnavn);
              ObjectInputStream objektstrøm = new ObjectInputStream(datastrøm);
              Object obj = objektstrøm.readObject();
              objektstrøm.close();
              return obj;
      }
}
Avatar billede frostware Nybegynder
30. juni 2004 - 16:38 #13
hmmm....det kan jeg ikke få til at virke. Det kan også være at det hele skal gøres på en anden måde.

Jeg vil have at man indtaster noget tekst i nogle felter, det ene felt hedder overskrift og denne overskrift vil jeg have vist i listen.
Men når man så vælger "overskriften" i listen, skal de oplysninger som jeg har gemt i de andre felter komme frem i felterne igen.
Avatar billede mikkelbm Nybegynder
30. juni 2004 - 17:16 #14
Så skal du ha' lavet en klasse til at indeholde de informationer.

Prøv at granske følgende:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

public class Test extends JFrame
{
    public Test()
    {
        setSize(500, 200);
       
        final JTextField overskrift = new JTextField(7);
        final JTextField navn = new JTextField(7);
        final JTextField something = new JTextField(7);
       
        JButton ok = new JButton("Ok");
        JButton save = new JButton("Gem");
        final DefaultListModel model = new DefaultListModel();
        final JList list = new JList(model);
       
        try
        {
            Object[] o = (Object[])OpenSave.hent("list.fil");
           
            for (int i = 0; i<o.length; i++)
                model.addElement(o[i]);
        }
        catch (Exception ex)
        {}
       
        overskrift.setBorder(BorderFactory.createTitledBorder("Overskrift"));
        navn.setBorder(BorderFactory.createTitledBorder("Navn"));
        something.setBorder(BorderFactory.createTitledBorder("Something"));
           
        JPanel top = new JPanel();
        top.add(overskrift);
        top.add(navn);
        top.add(something);
        top.add(ok);
        top.add(save);
               
        ok.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                String temp = overskrift.getText();
                String na = navn.getText();
                String some = something.getText();
               
                Something s = new Something(temp, na, some);
               
                if (!model.contains(s))
                {   
                    model.addElement(s);
                    overskrift.setText("");
                    navn.setText("");
                    something.setText("");
                   
                    Object[] o = model.toArray();
                    Arrays.sort(o);
                    model.clear();
                    for (int i = 0; i<o.length; i++)
                        model.addElement(o[i]);
                }
            }
        });
       
        list.addMouseListener(new MouseAdapter()
        {
            public void mousePressed(MouseEvent e)
            {
                Something s = (Something)list.getSelectedValue();
                overskrift.setText(s.getOverskrift());
                navn.setText(s.getNavn());
                something.setText(s.getSomething());
            }   
        });
       
        save.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    OpenSave.gem(model.toArray(), "list.fil");
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        });
       
        this.getContentPane().add(top, BorderLayout.NORTH);
        this.getContentPane().add(new JScrollPane(list), BorderLayout.CENTER);
    }
   
    public static void main(String[] args)
    {
        new Test().show();   
    }
}

class Something implements Serializable
{
    private String overskrift, navn, something;
   
    public Something(String overskrift, String navn, String something)
    {
        this.something = something;
        this.overskrift = overskrift;
        this.navn = navn;
    }
   
    public String getNavn() {return navn;}
    public String getOverskrift() {return overskrift;}
    public String getSomething() {return something;}
   
    public String toString()
    {
        return navn;
    }
   
    public int compareTo(Object c)
    {
        return navn.compareTo(c.toString());   
    }
}

Jeg har ikke mere tid idag, men vender tilbage imorgen hvis du har flere problemer...
Avatar billede frostware Nybegynder
01. juli 2004 - 11:51 #15
jep det virker, men der er en fejl. Det virker fint når man tilføjer den første, men derefter sker der en fejl når man tilføjer flere.
Selve programmet laver ikke fejl, men jeg kan se i JBuilder at der opstår en eller anden fejl.
Avatar billede mikkelbm Nybegynder
01. juli 2004 - 13:09 #16
Ja, det er mig der har lavet en lille fejl :(
Den er rettet her (og jeg har skrevet kommentar der hvor jeg har rettet):

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

public class Test extends JFrame
{
    public Test()
    {
        setSize(500, 200);
       
        final JTextField overskrift = new JTextField(7);
        final JTextField navn = new JTextField(7);
        final JTextField something = new JTextField(7);
       
        JButton ok = new JButton("Ok");
        JButton save = new JButton("Gem");
        final DefaultListModel model = new DefaultListModel();
        final JList list = new JList(model);
       
        try
        {
            Object[] o = (Object[])OpenSave.hent("list.fil");
           
            for (int i = 0; i<o.length; i++)
                model.addElement(o[i]);
        }
        catch (Exception ex)
        {}
       
        overskrift.setBorder(BorderFactory.createTitledBorder("Overskrift"));
        navn.setBorder(BorderFactory.createTitledBorder("Navn"));
        something.setBorder(BorderFactory.createTitledBorder("Something"));
           
        JPanel top = new JPanel();
        top.add(overskrift);
        top.add(navn);
        top.add(something);
        top.add(ok);
        top.add(save);
               
        ok.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                String temp = overskrift.getText();
                String na = navn.getText();
                String some = something.getText();
               
                Something s = new Something(temp, na, some);
               
                if (!model.contains(s))
                {   
                    model.addElement(s);
                    overskrift.setText("");
                    navn.setText("");
                    something.setText("");
                   
                    Object[] o = model.toArray();
                   
                    // sort metoden får klassen Compare med som parameter, så
                    // den ved hvordan den skal sammenligne objekterne.
                    Arrays.sort(o, new Compare());
                    model.clear();
                    for (int i = 0; i<o.length; i++)
                        model.addElement(o[i]);
                }
            }
        });
       
        list.addMouseListener(new MouseAdapter()
        {
            public void mousePressed(MouseEvent e)
            {
                Something s = (Something)list.getSelectedValue();
                overskrift.setText(s.getOverskrift());
                navn.setText(s.getNavn());
                something.setText(s.getSomething());
            }   
        });
       
        save.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    OpenSave.gem(model.toArray(), "list.fil");
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        });
       
        this.getContentPane().add(top, BorderLayout.NORTH);
        this.getContentPane().add(new JScrollPane(list), BorderLayout.CENTER);
    }
   
    public static void main(String[] args)
    {
        new Test().show();   
    }
}

class Something implements Serializable
{
    private String overskrift, navn, something;
   
    public Something(String overskrift, String navn, String something)
    {
        this.something = something;
        this.overskrift = overskrift;
        this.navn = navn;
    }
   
    public String getNavn() {return navn;}
    public String getOverskrift() {return overskrift;}
    public String getSomething() {return something;}
   
    public String toString()
    {
        return overskrift;
    }
}

/*
* Denne klasse sammenligner de to objekter - caster dem til klassen Something og
* sammenligner overskrifterne.
*/
class Compare implements Comparator
{
    public int compare(Object o1, Object o2)
    {
        return (((Something)o1).getOverskrift().compareToIgnoreCase(((Something)o2).getOverskrift()));   
    }   
}
Avatar billede frostware Nybegynder
01. juli 2004 - 18:01 #17
hurtig og effektiv hjælp det må jeg sige. Du skal have mange tak! :-) . Det ville dog være rart hvis du kunne knytte et par kommentarer ned igennem scriptet, så jeg ved hvad der foregår. Hvis du ikke "gider" det så bare lige smid et svar mere så accepterer jeg.
Avatar billede mikkelbm Nybegynder
01. juli 2004 - 18:17 #18
Du får lidt flere kommentar :)

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

public class Test extends JFrame
{
    public Test()
    {
        setSize(500, 200);
       
        final JTextField overskrift = new JTextField(7);
        final JTextField navn = new JTextField(7);
        final JTextField something = new JTextField(7);
       
        JButton ok = new JButton("Ok");
        JButton save = new JButton("Gem");
        final DefaultListModel model = new DefaultListModel();
        final JList list = new JList(model);
       
        // Siger måske lidt sig selv, men det er her den gemte liste bliver gemt,
        // hvis sådan en findes. Ellers bliver den fanget i "catch" og listen er
        // bare tom.
        try
        {
            Object[] o = (Object[])OpenSave.hent("list.fil");
           
            for (int i = 0; i<o.length; i++)
                model.addElement(o[i]);
        }
        catch (Exception ex)
        {}
       
        overskrift.setBorder(BorderFactory.createTitledBorder("Overskrift"));
        navn.setBorder(BorderFactory.createTitledBorder("Navn"));
        something.setBorder(BorderFactory.createTitledBorder("Something"));
           
        JPanel top = new JPanel();
        top.add(overskrift);
        top.add(navn);
        top.add(something);
        top.add(ok);
        top.add(save);
               
        ok.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                String temp = overskrift.getText();
                String na = navn.getText();
                String some = something.getText();
               
                Something s = new Something(temp, na, some);
               
                // Hvis IKKE allerede der findes en instans af klassen Something
                // i listen tilføjes denne.
                // Nede i Something-klassen overrides equals metoden, så der bliver
                // spurgt på overskriften istedet for adressen. Dette bevirker at
                // det er muligt at bruge metoden "contains" i DefaultListModel.
                if (!model.contains(s))
                {   
                    model.addElement(s);
                    overskrift.setText("");
                    navn.setText("");
                    something.setText("");
                   
                    Object[] o = model.toArray();
                   
                    // sort metoden får klassen Compare med som parameter, så
                    // den ved hvordan den skal sammenligne objekterne.
                    Arrays.sort(o, new Compare());
                   
                    // Tømmer listen.
                    model.clear();
                   
                    // Alle de sorterede elementer smides tilbage i listen.
                    for (int i = 0; i<o.length; i++)
                        model.addElement(o[i]);
                }
            }
        });
       
        // MouseListener, der lytter på om der trykkes på listen.
        // Hvis dette er tilfældet, hentes det objekt ud, som der er trykket på.
        // JTextFields udfyldes med de nødvendige oplysninger.
        list.addMouseListener(new MouseAdapter()
        {
            public void mousePressed(MouseEvent e)
            {
                Something s = (Something)list.getSelectedValue();
                overskrift.setText(s.getOverskrift());
                navn.setText(s.getNavn());
                something.setText(s.getSomething());
            }   
        });
       
        // ActionListener til "save" knappen.
        // Gemmer Elementerne i JListen som en fil.
        // BEMÆRK!!!
        // Da det er hele objekter der gemmes (indeholdende datastruktur o.lign.)
        // vil det ikke være muligt at hente disse ud igen, hvis der ændres i
        // strukturen af objekterne.
        // Dvs. at hvis du har gemt nogle oplysninger i en fil - eksempelvis
        // listen vi arbejder med her, vil du, hvis du ændrer i klassen Something
        // ikke kunne hente de tidligere gemte ind igen.
        // Dette er en af ulemperne ved at bruge flade filer. Så hvis det er oplysninger
        // der skal gemmes over en længere periode, er det værd at overveje
        // en database istedet!
        save.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    OpenSave.gem(model.toArray(), "list.fil");
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        });
       
        this.getContentPane().add(top, BorderLayout.NORTH);
        this.getContentPane().add(new JScrollPane(list), BorderLayout.CENTER);
    }
   
    public static void main(String[] args)
    {
        new Test().show();   
    }
}

// Lille klasse der indeholder de oplysninger der er nødvendige.
// ikke så meget mere at sige om den.
// To Vigtige ting!!
// 1. Bemærk at toString metoden overrides - det du returnere her, vil være det
//      du ser i JListen
// 2. equalsmetoden overrides - beskrevet længere oppe.
class Something implements Serializable
{
    private String overskrift, navn, something;
   
    public Something(String overskrift, String navn, String something)
    {
        this.something = something;
        this.overskrift = overskrift;
        this.navn = navn;
    }
   
    public String getNavn() {return navn;}
    public String getOverskrift() {return overskrift;}
    public String getSomething() {return something;}
   
    public String toString()
    {
        return overskrift;
    }
   
    public boolean equals(Object o)
    {
        return this.getOverskrift().equalsIgnoreCase(((Something)o).getOverskrift());   
    }
}

/*
* Denne klasse sammenligner de to objekter - caster dem til klassen Something og
* sammenligner overskrifterne.
*/
class Compare implements Comparator
{
    public int compare(Object o1, Object o2)
    {
        return (((Something)o1).getOverskrift().compareToIgnoreCase(((Something)o2).getOverskrift()));   
    }   
}
Avatar billede mikkelbm Nybegynder
01. juli 2004 - 18:19 #19
// Siger måske lidt sig selv, men det er her den gemte liste bliver gemt,
// hvis sådan en findes. Ellers bliver den fanget i "catch" og listen er
// bare tom.

Skal nok lige ændres til:
                                                                      !! 
// Siger måske lidt sig selv, men det er her den gemte liste bliver hentet,
// hvis sådan en findes. Ellers bliver den fanget i "catch" og listen er
// bare tom.
Avatar billede frostware Nybegynder
01. juli 2004 - 18:23 #20
tak
Avatar billede frostware Nybegynder
01. juli 2004 - 21:02 #21
den stopper altså ikke hvis man tilføjer den samme to gange. Kan du komme med et hint til hvad jeg skal gøre?
Avatar billede frostware Nybegynder
01. juli 2004 - 21:31 #22
undskyld havde lavet en fejl
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