Avatar billede trp79 Nybegynder
01. juni 2004 - 12:22 Der er 7 kommentarer og
1 løsning

Hvordan bruger jeg en cellrenderer?

Hejsa
Jeg har fået stykket understående klasse sammen ud fra diverse spg og svar her på exp, da jeg gerne vil have en JList med checkboxes i.
package beregnafstand;

import javax.swing.*;
import javax.swing.border.*;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class CheckBoxList extends JList
{
  protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);

  public CheckBoxList()
  {
      setCellRenderer(new CellRenderer());

      addMouseListener(new MouseAdapter()
        {
            public void mousePressed(MouseEvent e)
            {
              int index = locationToIndex(e.getPoint());

              if (index != -1) {
                  JCheckBox checkbox = (JCheckBox)
                              getModel().getElementAt(index);
                  checkbox.setSelected(
                                    !checkbox.isSelected());
                  repaint();
              }
            }
        }
      );

      setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  }

  protected class CellRenderer implements ListCellRenderer
  {
      public Component getListCellRendererComponent(
                    JList list, Object value, int index,
                    boolean isSelected, boolean cellHasFocus)
      {
        JCheckBox checkbox = (JCheckBox) value;
        checkbox.setBackground(isSelected ? getSelectionBackground() : getBackground());
        checkbox.setForeground(isSelected ? getSelectionForeground() : getForeground());
        checkbox.setEnabled(isEnabled());
        checkbox.setFont(getFont());
        checkbox.setFocusPainted(false);
        checkbox.setBorderPainted(true);
        checkbox.setBorder(isSelected ? UIManager.getBorder("List.focusCellHighlightBorder") : noFocusBorder);
        return checkbox;
      }
  }
}

Jeg er i tvivl om, hvordan jeg bruger det. Altså i mit tilfælde siger jeg:
private JList jLRoute = new CheckBoxList();
.....
jLRoute.setModel(routeListModel);

og nu vil jeg så gerne have tilføjet nogle elementer, så der kan afkrydses.
1)Hvordan gør jeg det?
2)Jeg forstår ikke helt hvad der sker i public Component getListCellRendererComponent. Altså der bliver initialiseret nogle objekter og simple datatyper, men de får jo ingen værdi....

Jeg håber nogen kan give mig en uddybende forklaring, mvh
Torben
Avatar billede _carsten Nybegynder
01. juni 2004 - 22:50 #1
Normalt synes jeg det er en bagatel at arbejde med cellRenderer og cellEditorer, men det er det ved gud ikke når det drejer sig om JCheckBox, den eneste måde jeg kan få det til at virke på, er at lade elementerne i JListen bestå af Objecter (klassen Item) som jeg selv konstruerer, og jeg har prøvet et par tusinde forskellige måder de sidste par timer, men det er det eneste jeg kan få til at fungere.

Gem hele koden i én fil, JFrame_1 og kompile

Skal der en uddybende forklaring til, bliver det ikke før i morgen.

Prøv det.


import java.awt.event.MouseListener;
import javax.swing.JCheckBox;
import java.awt.Component;
import java.awt.event.ItemListener;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.UIManager;

public class JFrame_1 extends javax.swing.JFrame implements MouseListener {
   
    public JFrame_1() {
        initComponents();
        jList1.addMouseListener(this);
    }

    private void initComponents() {
        Item[] item = { new Item("A"), new Item("B"), new Item("C"), new Item("D") };
        jList1 = new javax.swing.JList( item );

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

        jList1.setCellRenderer(new MyCheckBoxRenderer());
        getContentPane().add(jList1, java.awt.BorderLayout.CENTER);

        pack();
    }

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

    public static void main(String args[]) {
        new JFrame_1().show();
    }
   
    public void mouseClicked(java.awt.event.MouseEvent e) {}
    public void mouseEntered(java.awt.event.MouseEvent e) {}
    public void mouseExited(java.awt.event.MouseEvent e) {}
    public void mouseReleased(java.awt.event.MouseEvent e) {}
    public void mousePressed(java.awt.event.MouseEvent e) {
        Item it = (Item)jList1.getSelectedValue();

        if(it.isSelected())
            it.setSelected(false);
        else
            it.setSelected(true);
        jList1.repaint();
    }

    private javax.swing.JList jList1;
    private MyCheckBoxRenderer renderer;
}




class MyCheckBoxRenderer extends JCheckBox implements ListCellRenderer{
   
    public MyCheckBoxRenderer() {
        super();
    }
   
    public Component getListCellRendererComponent(JList list,
                                                Object value,
                                                int index,
                                                boolean isSelected,
                                                boolean cellHasFocus) {
       
        setBackground(isSelected ? list.getSelectionBackground() : list.getBackground());
        setForeground(isSelected ? list.getSelectionForeground() : list.getForeground());
        setFont(getFont());
        setFocusPainted(false);
        setBorderPainted(true);
        setBorder(isSelected ? UIManager.getBorder("List.focusCellHighlightBorder") : null);

        Item it = (Item)value;
        setSelected( it.isSelected() );
        setText( value.toString() == null ? "" : value.toString());

        return this;
    }
}



class Item{
    public Item(){
    }
   
    public Item(String s){
        this.text = s;
    }
   
    public String toString(){
        return text;
    }
   
    public void setSelected(boolean bol){
        select = bol;
    }
   
    public boolean isSelected(){
        return select;
    }
    private String text;
    private boolean select = false;
}
Avatar billede _carsten Nybegynder
02. juni 2004 - 09:35 #2
Lidt forklaring til getListCellRendererComponent()
Metoden getListCellRendererComponent, kaldes hver gang en celle skal gentegnes,
de 5 parametre udgør
    JList list         // Reference til JList instancen
    Object value        // Det object som skal tegnes af renderen
    int index        // Nr i JListen
    boolean isSelected    // true, hvis den aktuelle celle er valgt
    boolean cellHasFocus    // true, hvis den aktuelle celle har focus
   
Eller sagt på en anden måde, en JList vil altid spørge sin cellRenderer
hvordan den skal vise de elementer den indeholder, i ovenstående eksempel
finder JListen altså ud af, at dens cellRenderer er en klasse som hedder
MyCheckBoxRenderer, den forventer at klassen implementerer metoden
getListCellRendererComponent() (hvilket jo er tilfældet), derefter kalder
JListen getListCellRendererComponent() som returnerer en java.awt.Component
(JCheckBox) og den viser så JCheckBox'en i listen.

Du tilføjer elementer til listen, ved at adde flere elementer til Item[]
her burde jeg nok have brugt en Vector istedet for, gør det nemmere at
tilføje elementer.

Håber det rækker !
Avatar billede trp79 Nybegynder
02. juni 2004 - 15:06 #3
Det er helt kanon Carsten! Det lyder til at du har brugt lang tid på det, så jeg smider lige flere point i puljen - det må jo betegnes som et svært spørgsmål så.

Jeg har dog formentligt(kæmper pt.) et par yderligere problemer(i den her forbindelse), er det okay med dig, hvis jeg så holder spørgsmålet åbent og løbende afsætter flere og flere point til dig? Eller ser du helst jeg opretter et spørgsmål på ny?
Avatar billede _carsten Nybegynder
02. juni 2004 - 15:16 #4
Jeg har ikke sat mig voldsomt ind i reglerne her på eksperten, men jeg har ikke noget problem med det, du bestemmer selv.

Men det bliver nok lidt ud på aftenen, før jeg reagerer på noget her inde.
Avatar billede trp79 Nybegynder
02. juni 2004 - 15:18 #5
Det er helt fint, jeg har ikke så travlt :)
Avatar billede trp79 Nybegynder
02. juni 2004 - 16:13 #6
Nå, det gik nu meget smertefrit med resten, så jeg har ikke rigtig flere spørgsmål i den forbindelse.
Jeg ville dog gerne hvis jeg kunne få dig til at uddybe hvad "?" og ":" betyder i fx denne linie: setBackground(isSelected ? list.getSelectionBackground() : list.getBackground());
Avatar billede _carsten Nybegynder
02. juni 2004 - 19:21 #7
Det er det samme som en    if else

udtryk  ?  sand  :  falsk

              udtryk  hvis          sand              ellers    falsk
                  ^      ^            ^                ^          ^ 
setBackground(isSelected ? list.getSelectionBackground() : list.getBackground());

Hvis felt er valgt (isSelected)  så sæt baggrundsfarven (list.getSelectionBackground() ) ellers sæt baggrundsfarven  ( list.getBackground() )
Avatar billede trp79 Nybegynder
02. juni 2004 - 20:06 #8
Så ved jeg også det :)

Mange tak for hjælpen, mvh
Torben
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