Avatar billede trp79 Nybegynder
28. februar 2003 - 13:29 Der er 14 kommentarer og
1 løsning

Arraylist () og Jlist

Hejsa,
Jeg har et arrayliste (Firmaliste), der består af en række objekter(Firma objekter). Nu vil jeg så gerne have det sådan at jeg ud fra variablen navn i firmaobjekterne laver en jlist(eller alternativ). Det skal desuden være sådan at jeg når man så marker et firma i jlisten så skal diverse information omkring firmaet vises. Kan det lade sig gøre, og hvordan (vil blive meget glad for en stump kode!)

Er det ellers muligt at lave en jlist som består af Firmalisten eller dens objekter?

Lad os forestille os at Firma.java ser således ud:
import java.io.*;
import java.util.*;
import java.text.*;//Til DateFormat

public class Firma implements Serializable
{
  private String navn;
  private String land;

  public Firma(String navn,String land)
  {
      this.navn=navn;
      this.land=land;
  }

      public String getNavn(){return navn; }
      public String getLand(){return land; }

      public void setNavn(String navn){this.navn=navn; }
    public void setLand(String land){this.land=land; }

}

På forhånd tak,
mvh
Torben
Avatar billede trp79 Nybegynder
28. februar 2003 - 13:46 #1
Eller bliver man nød til at lave det sådan at man løber Firmalisten igennem og kopier alle navnene over i en String[], for derefter ved en markering af et element i jlisten at søge Firmalisten igennem og vise info omkring firmaet?
Avatar billede viht Nybegynder
28. februar 2003 - 14:10 #2
Du kan nemt lave en liste over Firma objekterne. Det er toString() metoden på Firma der bestemmer hvad der skal vises i listen.

// TestFrame.java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class TestFrame extends JFrame {
   
    public TestFrame() {
        super("Test");
        setSize(400,400);
       
        ArrayList list = new ArrayList();
        list.add(new Firma("Lego", "Danmark"));
        list.add(new Firma("Mærsk", "Danmark"));
        list.add(new Firma("Codecompletion", "Danmark"));
       
        final JList jList = new JList(list.toArray());
        jList.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent event) {
                if( event.getClickCount() == 2 ) {
                    int index = jList.getSelectedIndex();
                    if( index > -1 ) {
                        Firma firma  = (Firma)jList.getModel().getElementAt(index);
                        System.out.println ("Navn: " +firma.getNavn());
                        System.out.println ("Land: " +firma.getLand());
                    }
                }
            }
        });
        setContentPane(new JScrollPane(jList));
    }
}

class TestIt {
    public static void main(String[] args) {
      new TestFrame().show();
  }
}
// Firma.java:import java.io.*;
import java.util.*;
import java.text.*;

public class Firma implements Serializable {
    private String navn;
    private String land;


    public Firma(String navn, String land) {
        this.navn = navn;
        this.land = land;
    }
   
    public void setNavn(String navn) {
        this.navn = navn;
    }

    public void setLand(String land) {
        this.land = land;
    }
    public String getNavn() {
        return (this.navn);
    }

    public String getLand() {
        return (this.land);
    }

    public String toString() {

        StringBuffer toString = new StringBuffer();
        toString.append("Navn = "+navn);
   
        return new String(toString);
    }
}
Avatar billede viht Nybegynder
28. februar 2003 - 14:12 #3
Du kan dobbeltklikke på et element i listen og de fulde informationer printes i konsollen.
Avatar billede viht Nybegynder
28. februar 2003 - 14:16 #4
Det ville dog være bedre at bruge en JTable, der er langt mere dynamisk når det kommer til tilføjelse, sletning mv. Skal jeg lige fikse en TableModel?
Avatar billede trp79 Nybegynder
28. februar 2003 - 14:17 #5
Hvis du vil det vil det være helt kanont! Det bliver nemlig en del sletning og tilføjning! Vi kan evt fikse noget med nogle ekstra points, hvis du vil?
Avatar billede trp79 Nybegynder
28. februar 2003 - 14:20 #6
Nu bliver jeg lidt nysgerrig, så lige for at vende tilbage til jlist... så er jeg ikke lige med på hvad du mener med "Det er toString() metoden på Firma der bestemmer hvad der skal vises i listen." Hvor er det jeg skal kalde denne metode?
Avatar billede viht Nybegynder
28. februar 2003 - 14:40 #7
DU skal ikke kalde toString. Det gør JList selv når den viser objekter i listen. Hvis du kigger på public String toString() {...} på Firma.java, så er det dens returværdi du ser i listen.

Jeg har din tabel klar med tilføjning og sletning om ca. 15min.
Avatar billede trp79 Nybegynder
28. februar 2003 - 14:42 #8
Det lyder rigtig godt! Så opretter jeg lige et spørgsmål til dig med en håndfuld points :o)
Avatar billede viht Nybegynder
28. februar 2003 - 14:58 #9
Sådan:

//Firma.java:
import java.io.*;
import java.util.*;
import java.text.*;

public class Firma implements Serializable {
    private String navn;
    private String land;


    public Firma(String navn, String land) {
        this.navn = navn;
        this.land = land;
    }
   
    public void setNavn(String navn) {
        this.navn = navn;
    }

    public void setLand(String land) {
        this.land = land;
    }
    public String getNavn() {
        return (this.navn);
    }

    public String getLand() {
        return (this.land);
    }

    public String toString() {

        StringBuffer toString = new StringBuffer();
        toString.append("Navn = "+navn);
   
        return new String(toString);
    }
}
// TestFrame.java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class TestFrame extends JFrame {
   
    private JTable table;
    private FirmaTableModel tableModel;
    private JPopupMenu popup;
   
    public TestFrame() {
        super("Test");
        setSize(400,400);
       
        tableModel = new FirmaTableModel();
        table = new JTable(tableModel);

        table.addMouseListener(new PopupListener());
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
       
        popup = new JPopupMenu();
        JMenuItem deleteItem = new JMenuItem("Slet");
        popup.add(deleteItem);
       
        deleteItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                deleteElement();
            }
        });
       
        JPanel buttonPanel = new JPanel();
        JButton addButton = new JButton("Tilføj");
        addButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                addElement();
            }
        });
        buttonPanel.add(addButton);
        getContentPane().add(buttonPanel, BorderLayout.SOUTH);
       
        tableModel.addElement(new Firma("Lego", "Danmark"));
        tableModel.addElement(new Firma("Mærsk", "Danmark"));
        tableModel.addElement(new Firma("Codecompletion", "Danmark"));
       
    }
   
    private void deleteElement() {
        tableModel.removeElement(table.getSelectedRow());
    }
    private void addElement() {
        JPanel navnPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JLabel navnLabel = new JLabel("Navn");
        JTextField navnField = new JTextField("",10);
        navnPanel.add(navnLabel);
        navnPanel.add(navnField);
       
        JPanel landPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JLabel landLabel = new JLabel("Land");
        JTextField landField = new JTextField("",10);
        landPanel.add(landLabel);
        landPanel.add(landField);
       
        Object[] messages = new Object[2];
        messages[0] = navnPanel;
        messages[1] = landPanel;
        String[] options = { "Ok", "Annuller" };
               
        int result = JOptionPane.showOptionDialog(this,
                                                                messages,
                                                                  "Indtast",
                                                                  JOptionPane.DEFAULT_OPTION,
                                                                  JOptionPane.INFORMATION_MESSAGE,
                                                                  null,
                                                                  options,
                                                                  options[0] );
        if( result == 0 )
            tableModel.addElement( new Firma(navnField.getText(), landField.getText()) );
    }
    private  class PopupListener extends MouseAdapter {
        public void mousePressed(MouseEvent e) {
            maybeShowPopup(e);
        }

        public void mouseReleased(MouseEvent e) {
            maybeShowPopup(e);
        }

        public void mouseClicked(MouseEvent e) {
          maybeShowPopup(e);
        }

        public void maybeShowPopup(MouseEvent e) {
            if (e.isPopupTrigger()) {
                Point p = new Point(e.getX(), e.getY());
               
              table.setRowSelectionInterval(table.rowAtPoint(p),table.rowAtPoint(p));
            table.setColumnSelectionInterval(table.columnAtPoint(p),table.columnAtPoint(p));
            popup.show(e.getComponent(), e.getX(), e.getY());
            }
        }
    }
}

class TestIt {
    public static void main(String[] args) {
      new TestFrame().show();
  }
}
// FirmaTableModel.java:
import javax.swing.table.AbstractTableModel;
import javax.swing.*;

import java.util.ArrayList;

public class FirmaTableModel extends AbstractTableModel {
    private String[] columns = { "Firmanavn", "Land" };
    private ArrayList data;

    public FirmaTableModel() {
      data = new ArrayList();
    }

    public int getColumnCount() {
        return columns.length;
    }
   
    public int getRowCount() {
        return data.size();
    }
   
    public String getColumnName(int column) {
        return columns[column];
    }

      public Object getValueAt(int row, int column) {
      Firma element = (Firma)data.get(row);

      if( column == 0 )
          return element.getNavn();
      else if( column == 1 )
          return element.getLand();
     
      return "";
      }

    public Class getColumnClass(int column) {
        return getValueAt(0, column).getClass();
    }

    public boolean isCellEditable(int row, int column) {
        return true;
    }

    public void setValueAt(Object value, int row, int column) {
        switch( column ) {
            case 0: {
                ((Firma)data.get(row)).setNavn((String)value);
            } break;
            case 1: {
                ((Firma)data.get(row)).setLand((String)value);
            } break;
        }
        fireTableCellUpdated(row, column);
    }
   
    public void addElement(Firma element) {
        data.add(element);
        fireTableRowsInserted(data.size(), data.size());
    }
   
    public void removeElement(int index) {
        if( !(index == -1) ) {
            data.remove(index);
            fireTableRowsDeleted(index, index);
        }
    }
    public void removeAll() {
        int slut = data.size();
        data.clear();
        fireTableRowsDeleted(0, slut);
    }
}
Avatar billede viht Nybegynder
28. februar 2003 - 15:00 #10
Slet elementer ved at højreklikke på dem.
Avatar billede trp79 Nybegynder
28. februar 2003 - 15:07 #11
Det er helt forrygende det du har lavet! :o)
Jeg har lavet et spg med lidt points til dig:
http://www.eksperten.dk/spm/322945

Jeg vil arbejde lidt videre med det og udvide lidt :o)
Havde slet ikke regnet med så "vild" hjælp, jeg takker.
Mvh
Torben
Avatar billede trp79 Nybegynder
28. februar 2003 - 15:26 #12
Jeg har lige et par spørgsmål, hvis det er fjong?

1)
Jeg er ikke helt med på linie:
Object[] messages = new Object[2];
Hvad gør den? bare det at der er pladser til objekter i messages?

2)
Jeg er ikke helt med på hvad de forskellige parametre betyder i:
JOptionPane.showOptionDialog(this,messages,"Indtast", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, options[0] );

3)Hvad vil det sige når man opretter en metode af typen Object?, at man skal have returneret et Object - det kunne være fx et Firma objekt?
fx her
public Object getValueAt(int row, int column) {
      Firma element = (Firma)data.get(row);

      if( column == 0 )
          return element.getNavn();
      else if( column == 1 )
          return element.getLand();
     
      return "";
      }

Hvad vil det sige når man opretter en metode af typen Class?
som fx her:   
public Class getColumnClass(int column) {
        return getValueAt(0, column).getClass();
    }
Avatar billede viht Nybegynder
28. februar 2003 - 15:40 #13
1) Object arrayet indeholder de komponenter der skal smides på dialogen. De bliver smidt på under hinanden.
2) 0 = ejer container objektet ( den container den skal centreres i )
  1 = arrayet af komponenter der skal på
  2 = Titel
  3 = en int værdi
  4 = en int værdi
  5 = et evt. ikon
  6 = knapperne fornede
  7 = den default valgte knap forneden

3) Object er det objekt alt andet i Java arver fra. Når du returnerer et objekt i en metode betyder det generelt at metoden kan returnere forskellige objekter, der er subklasser til Object (Alle objekter). Netop i getValueAt(...) metoden returnerer den et objekt, fordi celler kan indeholde meget forskelligt.
Class returnerer bare hvilken klasse objektet er en instans af.
Avatar billede trp79 Nybegynder
28. februar 2003 - 15:43 #14
Rigtigt lækkert! Tak for svarene og god weekend

mvh
Torben
Avatar billede trp79 Nybegynder
13. marts 2003 - 11:23 #15
Lige et lille spørgsmål til dig vith, hvis det er okey?
Hvad er det præcis der i din overstående kode gør at selvom man ikke direkte trykker på et element i jlisten (hvis jlisten ikke er fyldt ud og man fx trykke for neden for det nederste element) at det nederste element blot vil blive valgt? Jeg kan ikke helt gemmemsku det :o(
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