30. juni 2004 - 14:25Der 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.
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);
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.
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?
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]); } } });
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.
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) {}
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.
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) {}
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()); } });
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())); } }
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.
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) {}
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(); } } });
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 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())); } }
// 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.
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.