Avatar billede trp79 Nybegynder
05. marts 2003 - 17:19 Der er 10 kommentarer og
1 løsning

Sætte værdier i Jlist ud fra værdi i en anden jlist

Hejsa,
Jeg har en firma klasse og en omsætnings klasse. Et objekt af firma klassen består af en række strenge. Objekter af omsætnings klassen består af en række strenge og et firma objekt (da en omsætning er tilknyttet et firma)

Jeg har en firma-jlist hvis indhold kommer udfra en arraylist hvori der ligger firmaobjekterne.
Jeg har så også en arraylist som består af alle omsætningsobjekterne. I en omsætnings jlist'en vil jeg så gerne vise netop de omsætninger som er høre til det firma der er markeret i den firma-jlisten. Hvordan gøres det lettes?

Det er meningen at man skal kunne rette i omsætningerne.
Er det bedst blot at lave en søgning som laver en ny arrayliste eller?
Avatar billede viht Nybegynder
05. marts 2003 - 19:03 #1
Jeg har en klar til dig om en halv times tid.. med drag and drop.
Avatar billede trp79 Nybegynder
05. marts 2003 - 19:31 #2
Det lyder lækkert! :D
Jeg kan også poste den kode jeg har hvis det er? Men det tager selvfølgelig også en del tid at sætte sig ind i det...
Avatar billede viht Nybegynder
05. marts 2003 - 19:31 #3
Ok, here goes.

Træk firmanavne fra venstre over i listen til højre og deres omsætninger vises.

// TestFrame.java
import javax.swing.*;

import java.util.*;

import java.io.Serializable;
import java.io.IOException;

import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.datatransfer.*;

public class TestFrame extends JFrame {
   
    private DragList firmaListe;
    private DefaultListModel model;
    private JList omsætningListe;
   
    private ArrayList firmaer;
    private ArrayList omsætninger;
   
    public TestFrame() {
       
        super("Test");
        setSize(600,400);
       
        firmaer = new ArrayList();
        omsætninger = new ArrayList();
       
        Firma firma1 = new Firma("Lego", "Danmark");
        Firma firma2 = new Firma("Mærsk", "Danmark");
        Firma firma3 = new Firma("Codecompletion", "Danmark");
        Firma firma4 = new Firma("Tartan Pub", "Danmark");
        Firma firma5 = new Firma("Buddy Holly", "Danmark");
       
        firmaer.add(firma1);
        firmaer.add(firma2);
        firmaer.add(firma3);
        firmaer.add(firma4);
        firmaer.add(firma5);
       
        omsætninger.add(new Omsætning(firma1, "239830923820"));
        omsætninger.add(new Omsætning(firma1, "239830923820"));
        omsætninger.add(new Omsætning(firma1, "239830923820"));
        omsætninger.add(new Omsætning(firma1, "239830923820"));
        omsætninger.add(new Omsætning(firma1, "239830923820"));
        omsætninger.add(new Omsætning(firma2, "239830923820"));
        omsætninger.add(new Omsætning(firma2, "239830923820"));
        omsætninger.add(new Omsætning(firma2, "239830923820"));
        omsætninger.add(new Omsætning(firma2, "239830923820"));
        omsætninger.add(new Omsætning(firma2, "239830923820"));
        omsætninger.add(new Omsætning(firma3, "239830923820"));
        omsætninger.add(new Omsætning(firma3, "239830923820"));
        omsætninger.add(new Omsætning(firma3, "239830923820"));
        omsætninger.add(new Omsætning(firma3, "239830923820"));
        omsætninger.add(new Omsætning(firma4, "239830923820"));
        omsætninger.add(new Omsætning(firma4, "239830923820"));
        omsætninger.add(new Omsætning(firma5, "239830923820"));
        omsætninger.add(new Omsætning(firma5, "239830923820"));
       
        firmaListe = new DragList(firmaer.toArray());
        model = new DefaultListModel();
        omsætningListe = new JList(model);
       
        JSplitPane pane = new JSplitPane    (    JSplitPane.HORIZONTAL_SPLIT,
                                                        true,
                                                        new JScrollPane(firmaListe),
                                                        new JScrollPane(omsætningListe)
                                                    );
                                                   
        new DropTarget(omsætningListe, DnDConstants.ACTION_COPY_OR_MOVE, new OmsætningDnDListener());

        getContentPane().add(pane, BorderLayout.CENTER);
    }
   
    private String getFirmaIndex() {
        return ""+firmaListe.getSelectedIndex();
    }
   
    private class DragList extends JList implements DragGestureListener {
       
        public DragList(Object[] elements) {
            super(elements);
            DragSource dragSource = DragSource.getDefaultDragSource();

            dragSource.createDefaultDragGestureRecognizer(
                                                                            this,
                                                                            DnDConstants.ACTION_COPY_OR_MOVE,
                                                                            this
                                                                        );
        }
        public void dragGestureRecognized(DragGestureEvent e) {
            e.startDrag    (    DragSource.DefaultCopyDrop,
                                new StringSelection(getFirmaIndex())
                            );
        }
    }
   
    private class OmsætningDnDListener implements DropTargetListener {
        public void drop(DropTargetDropEvent e) {
            DataFlavor stringFlavor = DataFlavor.stringFlavor;
            if(e.isDataFlavorSupported(stringFlavor)) {
                try {
                    e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
                    Transferable t = e.getTransferable();
                    int index = Integer.parseInt((String)t.getTransferData(stringFlavor));
                    model.removeAllElements();
                    Firma firma = (Firma)firmaListe.getModel().getElementAt(firmaListe.getSelectedIndex());
                    for( int i = 0; i < omsætninger.size(); i++ ) {
                        Omsætning oms = (Omsætning)omsætninger.get(i);
                        if( oms.getFirma() == firma ) // samme memory adresse
                            model.addElement(oms);
                    }
                }
                catch(UnsupportedFlavorException ufe) {
                    ufe.printStackTrace();
                    e.dropComplete(false);
                }
                catch( IOException ioe ) {
                    ioe.printStackTrace();
                }
            }
            else {
                e.rejectDrop();
                e.dropComplete(false);
            }
        }
       
        public void dragEnter(DropTargetDragEvent e) {
            e.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
        }
      public void dragExit(DropTargetEvent e) {}
      public void dragOver(DropTargetDragEvent e) {}
      public void dropActionChanged(DropTargetDragEvent e){}
    }
   
    private 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 +" ["+land+"]");
           
            return new String(toString);
        }
    }
       
    private class Omsætning implements Serializable {
   
        private Firma firma;
        private String omsætning;
   
   
        public Omsætning(Firma firma, String omsætning) {
            this.firma = firma;
            this.omsætning = omsætning;
        }
       
        public void setFirma(Firma firma) { this.firma = firma; }
        public void setOmsætning(String omsætning) { this.omsætning = omsætning; }
        public Firma getFirma() { return (this.firma); }
        public String getOmsætning() { return (this.omsætning); }
   
        public String toString() {
   
            StringBuffer toString = new StringBuffer();
            toString.append(firma.getNavn() +" [Oms: "+omsætning+"]");
            return new String(toString);
        }
    }
}
class Go {
    public static void main(String[] args) {
      new TestFrame().show();
  }
}
Avatar billede trp79 Nybegynder
05. marts 2003 - 19:36 #4
Forrygende! Det gik sku stærkt. Jeg kigger lige lidt på det... :D
Avatar billede trp79 Nybegynder
05. marts 2003 - 19:48 #5
Er det meget svært at lave det sådan at når man marker et firma så vises dets omsætning istedet?
Der er masser af elementer i din kode som jeg slet ikke kender. Jeg er ret newbie hvad angår java og især GUI.

Du skriver fx:
for( int i = 0; i < omsætninger.size(); i++ ) {
                        Omsætning oms = (Omsætning)omsætninger.get(i);
                        if( oms.getFirma() == firma ) // samme memory adresse
                            model.addElement(oms);

Der kopier man så de omsætnings elementer som passer på et firma i og smider dem over i listen. Men hvis man så vil rettet i omsætninger i omsætningsJlisten, så bliver man vel nød til at at foretage en søgning tilbage udfra de eksisterende oplysninger i den oprindelige omsætnings-arraylist og sende der parametre med som skal ændre. Eller er jeg helt galt på den?
Avatar billede viht Nybegynder
05. marts 2003 - 19:56 #6
Hvad overvejer du da at ændre på Omsætningen? Du kan nemt finde det markede Omsætning objekt udfra klik på omsætning listen.
Avatar billede trp79 Nybegynder
05. marts 2003 - 20:09 #7
Det eneste jeg ønsker at ændre er omsætning for det indeværende år, altså så man løbende kan opdater omsætningen for iår.
Det er sådan at når jeg marker et firma firmaJlisten med musen så vises info om firmaet, og derfor vil jeg så gerne have lavet det sådan at også omsætningerne vises. Det kan man også sagtens lave ud fra den kode du har postet. Jeg tænkte bare om der var en mulighed for at undgå søgninger og direkte ændre i objekterne. Men det er klart at man er nød til at søge omsætningslisten igennem for de firmaer der matcher det firma der er vist i firmaJlisten.
Avatar billede trp79 Nybegynder
05. marts 2003 - 20:15 #8
Det er måske lidt nemmere at følge min tankegang ved at se hvordan det pt ser ud:
http://www.confunded.dk/tp/test.JPG
Avatar billede viht Nybegynder
05. marts 2003 - 20:27 #9
Hvis et firma har mange omsætninger,så er det nødvendigt, ja. Ellers må du gemme omsætning objekterne på de forskellige firmaer.
Avatar billede trp79 Nybegynder
05. marts 2003 - 20:37 #10
Jeg prøver at lave det ud fra søgning. Jeg takker i hvert fald for hjælpen :o)
Avatar billede viht Nybegynder
05. marts 2003 - 20:52 #11
Søgningen er ikke slem, du traverserer blot en liste til O(n) og getter elementer til O(1)
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