Проблема с JCheckbox в моей таблице, которая расширяет AbstractTableModel - PullRequest
0 голосов
/ 25 октября 2018

Класс FileSystemModel дает мне список файлов из системы.Я хочу использовать флажок для выбора файлов для загрузки, но я не могу изменить этот флажок.Я прошу подсказку о том, что я делаю неправильно.

MyTableModel.java

public class MyTableModel extends AbstractTableModel{
private File dir;
private String[] filenames;
private static final long serialVersionUID = -2929662905556163705L;

public DownloadTableModel(File dir) {
    this.dir = dir;
    this.filenames = dir.list();
}

private ResourceBundle resourceBundle = ResourceBundle.getBundle("MessageBundle", Locale.forLanguageTag("pl"));

protected String[] columns = new String[] {"fileName","fileSize","checked","progress"};

@SuppressWarnings("rawtypes")

protected Class[] columnClasses = {FileSystemModel.class , Long.class, JCheckBox.class, JProgressBar.class};

Класс FileSystemModel дает мне список файлов из системы.

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

public int getRowCount() {
    return filenames.length;
}

public String getColumnName(int col) {
    return columns[col].toString();
}

public Class getColumnClass(int c) {
    switch (c) {
    case 0:
        return String.class;
    case 1:
        return Long.class;
    case 2:
        return Boolean.class;
    case 3:
        return Float.class;
    default:
        return null;
    }
}

public Object getValueAt(int row, int col) {
    File f = new File(dir, filenames[row]);

    switch (col) {
    case 0:
        return filenames[row];
    case 1:
        return new Long(f.length());
    case 2:
        return new Boolean(false);
    case 3:
        return new Float(50);
    default:
        return null;
    }
}

public boolean isCellEditable(int row, int col) {
    switch (col) {
    case 0:
        return false;
    case 1:
        return false;
    case 2:
        return true;
    case 3:
        return false;
    default:
        return false;
    }
}   

public void setValueAt(String aValue, int row, int column) {
      if ( column == 2) {
        filenames[row] = aValue;
        fireTableCellUpdated(row, column);
        System.out.println(aValue + " " + row);
      }
    }

}

CheckBoxRenderer.java

public class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {

private static final long serialVersionUID = -1892085041343659845L;

private static final Border NO_FOCUS = BorderFactory.createEmptyBorder(1, 1, 1, 1);

public CheckBoxRenderer() {
    super();
    setHorizontalAlignment(JCheckBox.CENTER);
    setBorderPainted(true);
    setOpaque(true);
}

public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {

    Color alternate = UIManager.getColor("Table.alternateRowColor");
    Color normal = new Color(table.getBackground().getRGB());

    if (isSelected) {
        setForeground(table.getSelectionForeground());
        setBackground(table.getSelectionBackground());
    } else {
        setForeground(table.getForeground());
        setBackground(alternate != null && row % 2 == 0 ? normal : alternate);
    }

    setEnabled(table.isCellEditable(row, column));
    setSelected(value != null && (Boolean) value);

    if (hasFocus) {
        setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
    } else {
        setBorder(NO_FOCUS);
    }

    return this;
}
}

MainGUI

В главном интерфейсе я добавляю его на панель

fileDir = new File(System.getProperty("user.dir"));
    myTableModel = new MyTableModel(fileDir);
    jTable = new JTable(downloadModel);

введите описание изображения здесь

1 Ответ

0 голосов
/ 25 октября 2018

Я не вижу, где вы храните данные в TableModel.Все, что у вас есть, это массив имен файлов.Вы не сохраняете логическое значение для каждой строки, чтобы знать, выбран он или нет.

File f = new File(dir, filenames[row]);

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

Таким образом, метод getValueAt(...) должен быть максимально эффективным.

Итак, что бы я сделал:

  1. создайте пользовательскую TableModel, которая содержит все значения, которые вы хотите отобразить в вашей таблице, плюс логическое значение для флажка.

  2. забудьте о пользовательском рендерере / редакторе.Сначала приведите логику в рабочее состояние, используя рендерер / редактор по умолчанию для логического столбца.Докажите, что основная логика работает.Затем, если вы считаете, что вам нужно сделать рендеринг более привлекательным, вы создадите пользовательский рендер.Тогда, если у вас есть проблемы, вы знаете, где они есть.

Вы можете проверить Модель таблицы строк для пошагового примера создания TableModel на основепользовательский объект.

...