Как отобразить флажок?

#java #swing #glazedlists

#java #swing #застекленные списки

Вопрос:

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

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

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

Ответ: Если вам нужно указать класс столбца, вам необходимо реализовать интерфейс 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);
  

Комментарии:

1. должно сработать, вы уверены, что 4 — это индекс для логического столбца (индексы основаны на нуле, то есть first == 0)?

2. да, я знаю. :(выводит только значения true / false без флажков :/

3. Не уверен, что это помогает, но мертвая ссылка должна указывать сюда .

4. просто чтобы дважды проверить, что расширенный формат вызывается так, как вы ожидаете: добавьте println (столбец) в блок if (и сделайте его блоком, чтобы быть уверенным, что вы в нем находитесь).

5. Когда я добавляю в EventTableModel (egList,objCheckBoxTableModel), форма, в которой присутствует jtable, не отображается.

Ответ №1:

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

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

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

Ответ №2:

Реализовали ли вы IsEditable(…) amp; 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);
        }
    });

}
}
  

Комментарии:

1. я попробовал на своем примере, который я опубликовал в вопросе как редактировать. Форма, в которой находится jtable, не отображается.

2. Наконец-то я решил проблему. Кай большое спасибо за ваше время и усилия. 🙂