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.
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
// 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; } }
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); } }
Hvorfor laver den en class cast exception når jeg prøver på dette: jScrollPane_Destination.getViewport().add(jList_Destinations);
Sludder det er denne fejl: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: mainContainer.DestinationElement at mainContainer.CheckboxListRenderer.getListCellRendererComponent(MainContainer.java:906)
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
Hvilken gentegningsfejl er det? Har du husket at add'e den mouselistener?
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); }
Løst ved at indsætte jList_Destinations.invalidate(); efter jList_Destinations.addMouseListener(new MouseAdapter() ... .. });
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
21. juni 2005 - 17:45
#10
Så vidt jeg kan se, er det stort set det samme de gør :)
Kurser inden for grundlæggende programmering