Avatar billede macpain Nybegynder
20. juni 2005 - 22:51 Der er 9 kommentarer og
1 løsning

CheckBox i JList

Er der nogen der kan give et godt eksempel på at oprette CheckBoxe i en liste.

Det må meget gerne være således man kan bruge Indices og DefaultListModel, men hvis ikke er det ok.

Det skal først og fremmest bare være let.
Avatar billede mikkelbm Nybegynder
20. juni 2005 - 22:56 #1
// Nedenstående gør så du kan afkrydse din checkbox

dinListe.addMouseListener(new MouseAdapter()
    {
      public void mousePressed(MouseEvent e)
      {
        JList list = (JList) e.getSource();
        if (list.getModel().getSize() > 0)
        {
          JCheckBox checkbox = (JCheckBox)
              list.getModel().getElementAt(list.locationToIndex(e.getPoint()));

          checkbox.grabFocus();
          checkbox.setSelected(!checkbox.isSelected());
          SwingUtilities.invokeLater(new Runnable()
          {
            public void run()
            {
              invalidate();
              repaint();
            }
          });
        }
      }
    });

// Herefter skal der add'es en cellrenderer som fortæller hvordan dine elementer skal tegnes
listPictures.setCellRenderer(new CheckboxListRenderer());


// ...

private class CheckboxListRenderer implements ListCellRenderer
  {
    public Component getListCellRendererComponent (JList list, Object value, int index, boolean isSelected,boolean cellHasFocus)
    {
      Component component = (Component)value;
      component.setBackground (Color.white);
      //component.setForeground (isSelected ? Color.white : Color.black);
      return component;
    }
  }
Avatar billede mikkelbm Nybegynder
20. juni 2005 - 23:07 #2
Her kommer lige et lille køreklart eksempel - måske det giver et bedre indblik:

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

public class TestListCheckBox extends JFrame
{
    private DefaultListModel model = new DefaultListModel ();
    private JList list = new JList (model);
   
    public TestListCheckBox ()
    {
        setSize (300, 300);
        this.getContentPane().add(new JScrollPane(list));
       
        list.addMouseListener(new MouseAdapter()
        {
            public void mousePressed(MouseEvent e)
            {
                JList list = (JList) e.getSource();
                if (list.getModel().getSize() > 0)
                {
                    JCheckBox checkbox = (JCheckBox)
                    list.getModel().getElementAt(list.locationToIndex(e.getPoint()));

                    checkbox.grabFocus();
                    checkbox.setSelected(!checkbox.isSelected());
                    SwingUtilities.invokeLater(new Runnable()
                    {
                        public void run()
                        {
                            invalidate();
                            repaint();
                        }
                    });
                }
            }
        });
       
        list.setCellRenderer(new CheckboxListRenderer());
       
        for (int i = 0; i<10; i++)
            model.addElement(new JCheckBox ("CheckBox " + (i+1)));
    }
   
    private class CheckboxListRenderer implements ListCellRenderer
    {
        public Component getListCellRendererComponent (JList list, Object value, int index, boolean isSelected,boolean cellHasFocus)
        {
            Component component = (Component)value;
            component.setBackground (Color.white);
            return component;
        }
    }
   
    public static void main (String[] args)
    {
        new TestListCheckBox ().setVisible(true);
    }
}
Avatar billede macpain Nybegynder
21. juni 2005 - 08:33 #3
Hvorfor laver den en class cast exception når jeg prøver på dette:

jScrollPane_Destination.getViewport().add(jList_Destinations);
Avatar billede macpain Nybegynder
21. juni 2005 - 08:34 #4
Sludder det er denne fejl:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: mainContainer.DestinationElement

    at mainContainer.CheckboxListRenderer.getListCellRendererComponent(MainContainer.java:906)
Avatar billede macpain Nybegynder
21. juni 2005 - 12:01 #5
Har fundet fejlen, dem er meget simpel. Jeg bruger et nedarvet objet og sætter dette ind i listen.

Det kan Component component = (Component)value; ikke håndtere.

Dog har jeg en gentegningsfejl!!! når jeg selektere en checkbox
Avatar billede mikkelbm Nybegynder
21. juni 2005 - 12:16 #6
Hvilken gentegningsfejl er det?

Har du husket at add'e den mouselistener?
Avatar billede macpain Nybegynder
21. juni 2005 - 13:19 #7
Ja, men den laver en mærkelig tegning af noget bagved liggende når checkboxen bliver selekteret.

Hele test metoden ser ud som følgende:

public void updateDestinationList()
  {
      Vector vec = aHandler.getSelectedElementsFromList(jTable_Assignment);

      Enumeration eAssign = vec.elements();
      DefaultListModel model = (DefaultListModel) eAssign.nextElement();
     
      //Prøve ballon
      DestinationElement de = new DestinationElement("");
      de = (DestinationElement)model.getElementAt(0);
     
      model = new DefaultListModel();
      jList_Destinations = new JList(model);

      jList_Destinations.addMouseListener(new MouseAdapter()
        {
            public void mousePressed(MouseEvent e)
            {
                JList list = (JList) e.getSource();
                if (list.getModel().getSize() > 0)
                {
                    JCheckBox checkbox = (JCheckBox)
                    list.getModel().getElementAt(list.locationToIndex(e.getPoint()));

                    checkbox.grabFocus();
                    checkbox.setSelected(!checkbox.isSelected());
                    SwingUtilities.invokeLater(new Runnable()
                    {
                        public void run()
                        {
                            invalidate();
                            repaint();
                           
                        }
                    });
                }
            }
        });

        jList_Destinations.setCellRenderer(new CheckboxListRenderer());

      //int[] indices = (int[]) eAssign.nextElement();
      //jList_Destinations.setSelectedIndices(indices);

      for (int i = 0; i<2; i++)
            model.addElement(new JCheckBox (de.toString()));

      jScrollPane_Destination.getViewport().add(jList_Destinations);

  }
Avatar billede macpain Nybegynder
21. juni 2005 - 13:24 #8
Løst ved at indsætte  jList_Destinations.invalidate(); efter

jList_Destinations.addMouseListener(new MouseAdapter()
...
..
});
Avatar billede macpain Nybegynder
21. juni 2005 - 14:22 #9
Ikke fordi dit eksempel fejler noget overhovedet. Men jeg har implementeret noget fra et andet eksempel.

Jeg ved ikke om du kan lære noget du ikke ved, men her er linket - se under 10.4-10.5

http://www.javaolympus.com/swing/Chapter10.htm
Avatar billede mikkelbm Nybegynder
21. juni 2005 - 17:45 #10
Så vidt jeg kan se, er det stort set det samme de gør :)
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