Probablemente un noob la pregunta, pero soy nuevo en java. Tengo una necesidad para una casilla de verificación de la lista de los que he encontrado no es compatible con el swing, pero me he encontrado con este control personalizado aquí

http://www.devx.com/tips/Tip/5342

Así que he creado un archivo de clase denominado CheckBoxList, y copiar el código desde el enlace en él:

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
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;
}
}
}

El problema es que no sé cómo ponerlo en práctica en mi GUI archivo. He intentado un montón de código, pero nunca se mostró un ejemplo. Sólo

Utilizar la clase, simplemente instancia, a continuación, pasar una matriz de
JCheckBox de objetos (o subclases de objetos JCheckBox) llamando
setListData

Así que eso no significa que no voy a ver el control en el Diseño Gráfico de la vista? Mi cliente quiere ser capaz de editar a sí mismo y agregar cosas así quiero que sea fácil y gráfica, si es posible. Si alguien podría mostrar un ejemplo de ilustrar o dar un buen consejo te lo agradecería. Gracias!

InformationsquelleAutor FrostyFire | 2014-01-26

2 Comentarios

  1. 3

    Puede usted decirme cómo?

    El uso de una columna de JTable y un adecuado representador y editor. Basado en este ejemplo, el siguiente código se basa en el procesador predeterminado para un valor de datos de tipo Boolean.Class. Un ejemplo más general es citado aquí.

    Cómo implementar la casilla de verificación lista de java

    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.GridLayout;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Set;
    import java.util.TreeSet;
    import javax.swing.BorderFactory;
    import javax.swing.DefaultListModel;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.TableCellRenderer;
    /** @see https://stackoverflow.com/a/13919878/230513 */
    public class CheckTable {
    private static final CheckModel model = new CheckModel(5000);
    private static final JTable table = new JTable(model) {
    @Override
    public Dimension getPreferredScrollableViewportSize() {
    return new Dimension(150, 300);
    }
    @Override
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
    JCheckBox jcb = (JCheckBox) super.prepareRenderer(renderer, row, column);
    jcb.setHorizontalTextPosition(JCheckBox.LEADING);
    jcb.setText(String.valueOf(row));
    return jcb;
    }
    };
    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
    JFrame f = new JFrame("CheckTable");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setLayout(new GridLayout(1, 0));
    f.add(new JScrollPane(table));
    f.add(new DisplayPanel(model));
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
    }
    });
    }
    private static class DisplayPanel extends JPanel {
    private DefaultListModel dlm = new DefaultListModel();
    private JList list = new JList(dlm);
    public DisplayPanel(final CheckModel model) {
    super(new GridLayout());
    this.setBorder(BorderFactory.createTitledBorder("Checked"));
    this.add(new JScrollPane(list));
    model.addTableModelListener(new TableModelListener() {
    @Override
    public void tableChanged(TableModelEvent e) {
    dlm.removeAllElements();
    for (Integer integer : model.checked) {
    dlm.addElement(integer);
    }
    }
    });
    }
    }
    private static class CheckModel extends AbstractTableModel {
    private final int rows;
    private List<Boolean> rowList;
    private Set<Integer> checked = new TreeSet<Integer>();
    public CheckModel(int rows) {
    this.rows = rows;
    rowList = new ArrayList<Boolean>(rows);
    for (int i = 0; i < rows; i++) {
    rowList.add(Boolean.FALSE);
    }
    }
    @Override
    public int getRowCount() {
    return rows;
    }
    @Override
    public int getColumnCount() {
    return 1;
    }
    @Override
    public String getColumnName(int col) {
    return "Column " + col;
    }
    @Override
    public Object getValueAt(int row, int col) {
    return rowList.get(row);
    }
    @Override
    public void setValueAt(Object aValue, int row, int col) {
    boolean b = (Boolean) aValue;
    rowList.set(row, b);
    if (b) {
    checked.add(row);
    } else {
    checked.remove(row);
    }
    fireTableRowsUpdated(row, row);
    }
    @Override
    public Class<?> getColumnClass(int col) {
    return getValueAt(0, col).getClass();
    }
    @Override
    public boolean isCellEditable(int row, int col) {
    return true;
    }
    }
    }
    • Lo que hizo que el viento usando? ¿Te acuerdas?
    • Yo trato de ir con el procesador predeterminado & editor, recurrir a una implementación personalizada sólo cuando sea necesario.
  2. 2

    El código está a la espera de una lista de objetos JCheckBox – así que esto funciona

    CheckBoxList cbList = new CheckBoxList();  //the class you have
    JCheckBox check1 = new JCheckBox("One");
    JCheckBox check2 = new JCheckBox("two");
    JCheckBox[] myList = { check1, check2};    list of checkbox object
    cbList.setListData(myList);   //set the list data for the object

    Pequeño Swing programa utilizando su clase por debajo

     util;
    import javax.swing.*;
    public class HelloWorldSwing {
    private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("HelloWorldSwing");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    CheckBoxList cbList = new CheckBoxList();
    JCheckBox check1 = new JCheckBox("One");
    JCheckBox check2 = new JCheckBox("two");
    JCheckBox[] myList = { check1, check2};
    cbList.setListData(myList);
    frame.getContentPane().add(cbList);
    //Display the window.
    frame.pack();
    frame.setVisible(true);
    }
    public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    createAndShowGUI();
    }
    });
    }

    }

Dejar respuesta

Please enter your comment!
Please enter your name here