Avatar billede backupmand Nybegynder
09. oktober 2003 - 22:33 Der er 2 kommentarer og
1 løsning

JCheckBox vil ikke enables

Jeg har en JList, hvor jeg definerer min egen renderer til... CheckBoxRenderer a=new CheckBoxRenderer();
Den klasse extender JCheckBox og implementerer ListCellRenderer og derfor implementeres også metoden
getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected,    boolean cellHasFocus)
{ // kode }
CheckBoksen vises fint nok i JListen, men der er ikke mulighed for at afkrydse i den. Det vil jeg gerne. Jeg har forsøgt setEnabled(true) både på a - referencen og så har jeg forsøgt nede i selve CheckBoxRenderer klassen, men man kan stadig ikke få lov til at krydse af i boxen ... hvad kan der være galt?
Avatar billede _carsten Nybegynder
10. oktober 2003 - 09:47 #1
Det lyder jo rigtig nok, men alligevel ikke nemt at se, ej heller
gennemskue hvad og hvordan du egentligt gør, så du får lige et
færdigt eksempel som jeg havde liggende - så må du tage den derfra.

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


public class CheckListExample2 extends JFrame {
 
  public CheckListExample2() {
    super("CheckList Example");
    String[] strs = {"swing", "home", "basic", "metal", "JList"};   
                                           
    final JList list = new JList( createData(strs) );
   
    list.setCellRenderer(new CheckListRenderer());
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    list.setBorder(new EmptyBorder(0,4,0,0));
    list.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        int index = list.locationToIndex(e.getPoint());
        CheckableItem item = (CheckableItem)list.getModel().getElementAt(index);
        item.setSelected(! item.isSelected());
        Rectangle rect = list.getCellBounds(index, index);
        list.repaint(rect);
      }
    }); 
    JScrollPane sp = new JScrollPane(list); 
   
    final JTextArea textArea = new JTextArea(3,10);
    JScrollPane textPanel = new JScrollPane(textArea);
    JButton printButton = new JButton("print");
    printButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        ListModel model = list.getModel();
        int n = model.getSize();
        for (int i=0;i<n;i++) {
          CheckableItem item = (CheckableItem)model.getElementAt(i);
          if (item.isSelected()) {
            textArea.append(item.toString());
            textArea.append(System.getProperty("line.separator"));
          }
        }
      }
    });
    JButton clearButton = new JButton("clear");
    clearButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        textArea.setText("");
      }
    });
    JPanel panel = new JPanel(new GridLayout(2,1));
    panel.add(printButton);
    panel.add(clearButton);
   
    getContentPane().add(sp,    BorderLayout.CENTER);
    getContentPane().add(panel, BorderLayout.EAST);
    getContentPane().add(textPanel, BorderLayout.SOUTH);
  }
 
  private CheckableItem[] createData(String[] strs) {
    int n = strs.length;
    CheckableItem[] items = new CheckableItem[n];
    for (int i=0;i<n;i++) {
      items[i] = new CheckableItem(strs[i]);
    }
    return items;
  }
 
  class CheckableItem {
    private String  str;
    private boolean isSelected;
   
    public CheckableItem(String str) {
      this.str = str;
      isSelected = false;
    }
   
    public void setSelected(boolean b) {
      isSelected = b;
    }
   
    public boolean isSelected() {
      return isSelected;
    }
   
    public String toString() {
      return str;
    }
  }
 
  class CheckListRenderer extends JCheckBox implements ListCellRenderer {
   
    public CheckListRenderer() {
      setBackground(UIManager.getColor("List.textBackground"));
      setForeground(UIManager.getColor("List.textForeground"));
    }

    public Component getListCellRendererComponent(JList list, Object value,
              int index, boolean isSelected, boolean hasFocus) {
      setEnabled(list.isEnabled());
      setSelected(((CheckableItem)value).isSelected());
      setFont(list.getFont());
      setText(value.toString());
      return this;
    }
  }

  public static void main(String args[]) {
    CheckListExample2 frame = new CheckListExample2();
    frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {System.exit(0);}
    });
    frame.setSize(300, 200);
    frame.setVisible(true);
  }
}
Avatar billede backupmand Nybegynder
10. oktober 2003 - 13:35 #2
Dit eksempel virker godt, så jeg kigger lige på mit eget og så vender jeg tilbage med en forklaring på hvad der gik galt (i mit eget).
Avatar billede backupmand Nybegynder
10. oktober 2003 - 16:06 #3
Hm med en mellemting af din kode og min egen kode virker det, med nogle små justeringer rundt omkring. Min udfordring lå i, at oprette en JList med checkbox items og antal items (og længden af listen) afhænger af data der kommer fra en database ved tryk på en anden knap, så min checkboxes i Jlisten skulle oprettes dynamisk.

På en eller anden sjov måde har jeg fået sat JList selection'en i forgrunden for JCheckBox .. så den blev overridet og det var kun selection fra JList der fungerede ... dette er hvad jeg TROR jeg havde gjort. Derudover har der sikkert også været noget med hvornår jeg kaldte de forskellige metoder ... hvis jeg finder et klarer svar, hvilket jeg nok ikke gør inden for en overskuelig fremtid (det skal bare virke nu, kender du det?), så vender jeg tilbage, men jeg siger tak hjælpen lige nu.
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