Как сделать флажок? - PullRequest
       12

Как сделать флажок?

1 голос
/ 20 апреля 2011

Я использую Глазированные списки, в jTable, где у меня есть столбец, который является логическим.По умолчанию jTable отображает флажок, в котором столбец имеет тип Boolean.Class.Используя Застекленные списки я не могу получить флажок, который необходим.Я рендерил чекбоксы, расширяющие DefaultTableCellRenderer, но я не удовлетворен этим, потому что чекбоксы не «кликабельны».

В списке ошибок GL http://www.glazedlists.com/documentation/faq я нашел:

* В: Как мне указать, чтобы ячейки моей булевой таблицы отображались с флажком?По какой-то причине в Glazed Lists нет метода getColumnClass ().

A: Если вам нужно указать класс столбца, вам нужно реализовать интерфейс AdvancedTableFormat вместо обычного класса TableFormat.Если вы используете фабричный метод GlazedLists.tableFormat (), вы должны указать класс базового объекта для правильной реализации метода AdvancedTableFormat.getColumnClass (). *

Кто-нибудь из вас имел опыт работы с этим?не найти никаких ссылок с примером.Важная ссылка в faq не работает.

Я пытался с этим:

 public class CheckBoxTableModel implements  AdvancedTableFormat {

     public Class getColumnClass(int column) {
         if(column==4)
        return Boolean.class;
         else
             return Object.class;
    }
}

Пожалуйста, помогите!

РЕДАКТИРОВАТЬ: я пытался с этим, формас jtable не показывает

   private class TicketTableFormat implements AdvancedTableFormat<Ticket>  {

        private final String[] cols = new String[]{"Id", "From", "Subject", "Date", "Incomplete"};

        public int getColumnCount() {
            return cols.length;
        }

        public String getColumnName(int colId) {
            return cols[colId];
        }

        public Class getColumnClass(int col) {
            if (col == 4) {
                return Boolean.class;
            } else {
                return Object.class;
            }
        }


        public Object getColumnValue(Ticket ticket, int colId) {

            switch (colId) {
                case 0:
                    return ticket.getId();
                case 1:
                    return ticket.getFrom();
                case 2:
                    return ticket.getSubject();
                case 3:
                    return ticket.getDate();
                case 4:
                    return ticket.getIncomplete();
            }
            return null;
        }

        public boolean isEditable(Ticket e, int col) {
            if (col < 4) {
                return false;
            } else {
                return true;
            }
        }

        public Ticket setColumnValue(Ticket e, Object o, int i) {
            e.setB((Boolean) editedValue);
            return e;           
           }

        public Comparator getColumnComparator(int i) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

    }

я называю это так:

 TicketTableFormat tbFormat = new TicketTableFormat();
 TicketsModel = new EventTableModel(textFilteredTickets, tbFormat);
 ticketTable.setModel(TicketsModel);

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Суть в том, что рендеринг ячеек таблицы и их использование - это две разные вещи.Для рендеринга ячеек таблицы рендерер служит только как «штамп», т. Е. Флажок инициализируется в состояние, которое должно быть визуализировано, и после него таблица берет только изображение рендерера (вызывая метод рисования) и помещает изображение татуировки.в соответствующей ячейке - для визуализации всех ячеек один и тот же экземпляр флажка переконфигурируется снова и снова для представления соответствующего значения ячейки.То, что вы сделали в своем коде, - это определение типа данных модели, так что средство визуализации ячейки таблицы по умолчанию, выбранное таблицей, является средством визуализации флажка.

Чтобы флажок был редактируемым, к ячейке таблицы должен быть прикреплен редактор ячеек (например, путем настройки редактора для определенного столбца).Если ячейка таблицы получает фокус ввода, компонент редактора ячейки таблицы инициализируется и помещается в ячейку таблицы (т. Е. Над изображением, которое было нарисовано средством визуализации ранее).Этот компонент редактора ячеек (в вашем случае это был бы флажок) остается там (принимает ввод пользователя с помощью мыши или клавиатуры) до тех пор, пока пользователь не уйдет от этого конкретного вызова таблицы.В тот момент, когда редактирование заканчивается, у редактора ячеек запрашивается значение, полученное в процессе редактирования (т.е. в редакторе вызывается getCellEditorValue()), и значение hte берется таблицей и записывается обратно в модель таблицы дляэта ячейка.

Короче говоря: средство визуализации только помечает данные в ячейке, т. е. выводит компонент редактора для получения ввода.

1 голос
/ 21 апреля 2011

Реализовали ли вы isEditable (...) & setColumnValue (...) в своей реализации AdvancedTableFormat?

Реализация следующих методов работает для меня.

public int getColumnCount()
public String getColumnName(int column)
public Object getColumnValue(E model, int column)
public boolean isEditable(E model, int column) // For making the checkbox editable
public IFdsModel setColumnValue(E model, Object value, int column)
public Class getColumnClass(int column) // For making it a Checkbox
public Comparator<E> getColumnComparator(int arg0) // for sorting (if you have a SortedList)

Редактировать:пример (быстрый и грязный)

import java.util.Comparator;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.gui.AdvancedTableFormat;
import ca.odell.glazedlists.gui.WritableTableFormat;
import ca.odell.glazedlists.swing.EventTableModel;

public class Tester {

private static class MyBoolean {
    private Boolean b = Boolean.FALSE;

    public Boolean getB() {
        return b;
    }

    public void setB(Boolean b) {
        this.b = b;
    }

}

private static class BooleanTableFormat implements AdvancedTableFormat<MyBoolean>, WritableTableFormat<MyBoolean> {

    @Override
    public int getColumnCount() {
        return 1;
    }

    @Override
    public String getColumnName(int column) {
        return "Bool";
    }

    @Override
    public Object getColumnValue(MyBoolean baseObject, int column) {
        return baseObject.getB();
    }

    @Override
    public Class getColumnClass(int column) {
        return Boolean.class;
    }

    @Override
    public Comparator getColumnComparator(int column) {
        throw new IllegalStateException("Not yet implemented.");
    }

    @Override
    public boolean isEditable(MyBoolean baseObject, int column) {
        return true;
    }

    @Override
    public MyBoolean setColumnValue(MyBoolean baseObject, Object editedValue, int column) {
        baseObject.setB((Boolean) editedValue);
        return baseObject;
    }
}

public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            EventList<MyBoolean> list = new BasicEventList<MyBoolean>();
            list.add(new MyBoolean());
            list.add(new MyBoolean());
            EventTableModel<MyBoolean> etm = new EventTableModel<MyBoolean>(list, new BooleanTableFormat());
            JTable table = new JTable(etm);
            JFrame f = new JFrame("Tester");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(300, 200);
            f.getContentPane().add(new JScrollPane(table));
            f.setVisible(true);
        }
    });

}
}
...