Avatar billede thomaaaz Nybegynder
16. december 2003 - 01:13 Der er 17 kommentarer og
2 løsninger

mange genererede JLists, og hvilken tjekker man på?

Hejsa
Jeg sidder med lidt af et problem...
Jeg har en Gui, hvor jeg har genereret en flok JLists og sendt vectorer med til at putte i dem, men de er alle lavet i ét navn JList generelListe = new JList()...
Der er flere ting i det, for jeg vil gerne kunne se hvad der er markeret i alle listerne og sende dette med videre når jeg trykker på en knap.
Jeg vil også gerne kunne afmarkere noget, der allerede er markeret i et felt ved at trykke på det igen...
Generelt vil jeg gerne kunne tjekke på hvad der er markeret, hvilken liste det er markeret i og bare kunne referere til listerne.
Er det for meget forlangt???
Håber der er hjælp at hente - jeg har prøvet med mouselisteners og listSelectionListeners, men jeg kan sgu ikke lige hitte ud af det...
med venlig hilsen
Thomas
Avatar billede arne_v Ekspert
16. december 2003 - 07:43 #1
Umiddelbart vil jeg da mene, at du skal have givet dem forskellige navne.

JList liste1 = new JList();
JList liste2 = new JList();
JList liste3 = new JList();

Muligvis skal de erklæres som instans variable:

private JList liste1;
private JList liste2;
private JList liste3;
...
liste1 = new JList();
liste2 = new JList();
liste3 = new JList();
Avatar billede _carsten Nybegynder
16. december 2003 - 08:13 #2
Jeg har også lidt svært ved at gennemskue den med navnene, med mindre du har lavet et array af JList's

Du kan hente valgte værdier på nedenstående måde


      jList1.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                if(jList1.getValueIsAdjusting()) {

                    String s = "";
                    Object[] obj = jList1.getSelectedValues();
                   
                    for(int i = 0; i < obj.length ; i++){
                        s += obj[i];
                    }
                    System.out.println(s);
                }
            }
        });
    }
Avatar billede _carsten Nybegynder
16. december 2003 - 08:14 #3
Eller sagt på en anden måde, ovenstående metode udskriver valgte værdier når der klikkes i din JList
Avatar billede thomaaaz Nybegynder
16. december 2003 - 12:04 #4
tak for svarene, men det er desværre lidt mere kompliceret end som så.
problemet er at jeg genererer alle listerne med ét navn og derfor ikke kan tjekke på dem enkeltvis - eller kan jeg???
jeg har tænkt på at oprette en Vector, lavJList(Vector hundestatus) kan kaste tilbage, indeholdende alle de JLists, der er blevet oprettet og lade listeneren forsøge med alle listerne... Er det en glidebane eller en god idé?
jeg adder allerede både selectionListener og mouseListener, men får ikke noget ud af at tjekke på mouseListener - selectionListener kan give index tilbage og sådan, men jeg ved ikke hvilke lister der er valgt i!
desuden er det ret vigtigt at man kan vælge de valgte fra igen én efter én...
Her er koden ihvertfald, og man må da gerne grine, men jeg ved sgu ikke lige om der er en bedre løsning...
public void HundestatusLister(Vector hundestatus) {
    Object[] koordinater =
        {
        new Rectangle(20, 90, 180, 220),
        new Rectangle(220, 90, 180, 220),
        new Rectangle(420, 90, 180, 220),
        new Rectangle(20, 340, 180, 220),
        new Rectangle(220, 340, 180, 220),
        new Rectangle(420, 340, 180, 220),
        new Rectangle(820, 90, 180, 290),
        new Rectangle(620, 90, 180, 220),
        new Rectangle(620, 340, 180, 220),
        new Rectangle(620, 590, 180, 90),
        new Rectangle(220, 590, 180, 90),
        new Rectangle(20, 590, 180, 90),
        new Rectangle(820, 410, 180, 270),
        new Rectangle(420, 590, 180, 90)};
    lavJList(koordinater, hundestatus);
}
public void lavJList(Object[] bounds, Vector hundestatus) {
    int antal = bounds.length;
    for (int i = 0; antal > 0; i++) {
    generelListe = new JList((Vector) hundestatus.elementAt(i));
    generelListe.setBorder(
            new javax.swing.border.SoftBevelBorder(
            javax.swing.border.BevelBorder.RAISED));
    generelListe.setFont(new java.awt.Font("Dialog", 0, 12));
    JScrollPane generelRulle = new JScrollPane(generelListe);
    getContentPane().add(generelRulle);
    generelRulle.setBounds((Rectangle) Array.get(bounds, i));
    antal = antal - 1;
    generelListe.addListSelectionListener(this);
    generelListe.addMouseListener(mouseListener);
    }
}

Håber der er nogen der har en løsning eller to :o)
mvh
Thomas
Avatar billede arne_v Ekspert
16. december 2003 - 12:15 #5
Et array af JLst kan sagtens være en mulighed.
Avatar billede arne_v Ekspert
16. december 2003 - 12:17 #6
JList[] generelListe;

public void lavJList(Object[] bounds, Vector hundestatus) {
    int antal = bounds.length;
    generelListe = new JList[antal];
    for (int i = 0; antal > 0; i++) {
    generelListe[i] = new JList((Vector) hundestatus.elementAt(i));
    generelListe[i].setBorder(
            new javax.swing.border.SoftBevelBorder(
            javax.swing.border.BevelBorder.RAISED));
    generelListe[i].setFont(new java.awt.Font("Dialog", 0, 12));
    JScrollPane generelRulle = new JScrollPane(generelListe[i]);
    getContentPane().add(generelRulle);
    generelRulle.setBounds((Rectangle) Array.get(bounds, i));
    antal = antal - 1;
    generelListe[i].addListSelectionListener(this);
    generelListe[i].addMouseListener(mouseListener);
    }
}

eller noget i den stil.
Avatar billede _carsten Nybegynder
16. december 2003 - 12:29 #7
Hvad noget a la nedenstående (har ikke testet)
jList1.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                if(jList1.getValueIsAdjusting()) {

                    ListModel model = jList1.getModel();
                    int size = model.getSize();
                   
                    for(int i = 0; i < size - 1 ; i++){
                        if(model.getElementAt(i).equals(hundestatus.elementAt(i)))
                            System.out.println("BINGO");
                    }

                }
            }
        });
Avatar billede thomaaaz Nybegynder
16. december 2003 - 13:02 #8
Det ser rigtigt fornuftigt ud arne, men hvad skal jeg tjekke på og hvordan i listeners og det? jeg er ikke en turbohaj i listenere - ved faktisk ikke særlig meget om dem :(
Carsten - jeg har prøvet ovenstående, men får ikke så meget andet end fejl ud af det :(
hvis jeg med Arnes metode vil prøve at teste på hvilken JList der vælges på og hvis det valgte er valgt på forhånd, hvordan kan man det?
Avatar billede _carsten Nybegynder
16. december 2003 - 13:17 #9
Har ellers lige testet og her virker det fint, skyldes sikkert at du ikke får fat i vectoren hundestatus

Jeg forstår bare ikke måden du gør det på, det må give dig 11 JList's med ét element i hver, i stedet for én JList indeholdene 11 elementer.
Og så et det, at jeg overhovedet ikke kan følge ideen med en JList
Avatar billede arne_v Ekspert
16. december 2003 - 13:28 #10
carsten>

new JList((Vector) hundestatus.elementAt(i));

antyder ret kraftigt at hundestatus er en Vector som indeholder Vector'er
(ellr vil man få en class cats exception).
Avatar billede _carsten Nybegynder
16. december 2003 - 13:39 #11
Jeg må nok erkende, jeg kan ikke lige skrue mig ind på ideen her
Avatar billede _carsten Nybegynder
16. december 2003 - 13:44 #12
Men - selvfølgelig, du har ret mht. den vector

Den overså jeg lige i farten
Avatar billede thomaaaz Nybegynder
16. december 2003 - 14:44 #13
Hejsa
Ja godt spottet Arne - Det skulle jeg nok lige have nævnt, men programmet skal holde styr på spande med hunde til slædekørsel, og det er meningen at man skal kunne vælge én hund og se dens oplysninger, men også at man skal kunne vælge flere hunde og skrive hvilke vacciner man har givet dem og hvornår... Man skal således kunne vælge og fravælge på listerne og der skal tjekkes på hvor mange der er valgt og hvilke der er valgt, da dette skal gøre nogen knapper enabled og andre disabled...
Håber det gav lidt mere forståelse for problemet.
mvh. Thomas
Avatar billede _carsten Nybegynder
16. december 2003 - 20:46 #14
Har lige siddet og rodet lidt med det, men jeg synes det er noget hø, kan ikke være rigtigt at det skal se sådan ud - prøv det (kompiler og kør)

import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.lang.reflect.*;


public class JFrame_8 extends javax.swing.JFrame {
    private Vector hundestatus = new Vector();
    private Vector hund = new Vector();
    private JList[] generelListe;
    private JScrollPane[] generelRulle;
    private JTextField text = new JTextField(25);

    public JFrame_8() {
        for(int x = 0; x < 14; x++){
            hund.addElement("Navn " + x);
        }
     
        for(int i = 0; i < 14;i++){
            hundestatus.add(hund);
        }

        initComponents();

        HundestatusLister(hundestatus);
        getContentPane().add(text);
        setSize(550,500);
    }
   
    public void HundestatusLister(Vector hundestatus) {
    Object[] koordinater =
        {
        new Rectangle(20, 90, 180, 220),
        new Rectangle(220, 90, 180, 220),
        new Rectangle(420, 90, 180, 220),
        new Rectangle(20, 340, 180, 220),
        new Rectangle(220, 340, 180, 220),
        new Rectangle(420, 340, 180, 220),
        new Rectangle(820, 90, 180, 290),
        new Rectangle(620, 90, 180, 220),
        new Rectangle(620, 340, 180, 220),
        new Rectangle(620, 590, 180, 90),
        new Rectangle(220, 590, 180, 90),
        new Rectangle(20, 590, 180, 90),
        new Rectangle(820, 410, 180, 270),
        new Rectangle(420, 590, 180, 90)};
       
        lavJList(koordinater, hundestatus);
    }



    public void lavJList(Object[] bounds, Vector hundestatus) {
        int antal = bounds.length;

        generelListe = new JList[antal];
        generelRulle = new JScrollPane[antal];
        for (int i = 0; i < antal; i++) {
           
            generelListe[i] = new JList((Vector) hundestatus.elementAt(i));
            generelListe[i].setBorder(
                new javax.swing.border.SoftBevelBorder(
                javax.swing.border.BevelBorder.RAISED));
            generelListe[i].setFont(new java.awt.Font("Dialog", 0, 12));
            JScrollPane generelRulle = new JScrollPane(generelListe[i]);
            getContentPane().add(generelRulle);
            generelRulle.setBounds((Rectangle) Array.get(bounds, i));
            generelListe[i].addListSelectionListener(new Listener());
        }
    }

    private void initComponents() {

        getContentPane().setLayout(new java.awt.FlowLayout());

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        pack();
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new JFrame_8().show();
    }
   
   
   
    class Listener implements javax.swing.event.ListSelectionListener {
        public void valueChanged(javax.swing.event.ListSelectionEvent e) {
            if(e.getValueIsAdjusting()) {
                    JList list = (JList)e.getSource();
                        text.setText("Nr. " + list.getSelectedIndex() +
                                        " er valgt, teksten er: " +
                                            list.getSelectedValue());
                    /**
                    *  Det er her du checke om de er ens
                    *  Lidt svært for mig med de værdier
                    *  jeg har i de JList's
                    */
            }
        }
    } 
}
Avatar billede thomaaaz Nybegynder
16. december 2003 - 21:06 #15
Det du gør giver masser af mening Carsten - Det funker. Jeg vidste ikke at man kunne bruge getSource på den måde, men det er jo fedt. Jeg vælger dog nok stadig at bruge noget fra Arnes metoder, så I får sgu 50/50 (hvis bare jeg vidste hvordan man gav points for der er ikke en acceptermulighed...)
Det eneste er bare at jeg gerne skulle kunne fravælge de valgte igen, således at der bliver checket på om der allerede er valgt der hvor man forsøger at vælge igen, for så skal det fravælges. jeg slår den op i et nyt indlæg og så kan I jo kigge på det også hvis I har lyst.
Avatar billede thomaaaz Nybegynder
16. december 2003 - 21:07 #16
hvis I begge lige kommer med et svar, kan I lige få en deler!
Avatar billede arne_v Ekspert
16. december 2003 - 21:08 #17
svar
Avatar billede _carsten Nybegynder
16. december 2003 - 21:19 #18
OK - Det er faktisk Arne's metode jeg har brugt

Hvis du indsætter      generelListe[i].setName("" + i);   
før getContentPane().add(generelRulle);  i lavJList() metoden, kan du bruge det til at spore hvilken JList der blev klikket på

Her efter ændrer du classen Listener til følgende
  class Listener implements javax.swing.event.ListSelectionListener {
        public void valueChanged(javax.swing.event.ListSelectionEvent e) {
            if(e.getValueIsAdjusting()) {
                    JList list = (JList)e.getSource();
                        text.setText("Der blev klikket på JList nr. "
                                        + list.getName() +
                                        " item nr. " +
                                        list.getSelectedIndex() +
                                        "teksten er: " +
                                        list.getSelectedValue()
                                            );

                        //  generelListe[Integer.parseInt(list.getName()]
            }
        }
    }
Avatar billede thomaaaz Nybegynder
16. december 2003 - 21:28 #19
Så er den accepteret, men af ren nysgerrighed (eller det er det jo ikke helt...) hvis man vil styre en knap på samme måde, således at det er muligt at trykke på nogle knapper hvis ingen hunde er valgt, og muligt at trykke på nogle andre hvis 1 hund er valgt og muligt med nogle andre igen, hvis flere er valgt? Altså sådan at man i samme ombæring som der hvor man finder ud af hvad der er trykket på, lige undersøger om der er en eller flere, og så kalder metoden disableKnap for de knapper det drejer sig om...
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