JTable Boolean.класс

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

class ColorTableModel extends AbstractTableModel {

  Object rowData[][] = { { "value1", Boolean.FALSE },
      { "value1", Boolean.FALSE }, { "value1", Boolean.FALSE },
      { "value1", Boolean.FALSE}, { "value1", Boolean.FALSE }, };

  String columnNames[] = { "English", "Boolean" };

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

  public String getColumnName(int column) {
    return columnNames[column];
  }

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

  public Object getValueAt(int row, int column) {
    return rowData[row][column];
  }

  public Class getColumnClass(int column) {
    return (getValueAt(0, column).getClass());
  }

  public void setValueAt(Object value, int row, int column) {
    rowData[row][column] = value;
  }

  public boolean isCellEditable(int row, int column) {
    return (column != 0);
  }
}

public class EditableColorColumn {

  public static void main(String args[]) {
    JFrame frame = new JFrame("Editable Color Table");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    TableModel model = new ColorTableModel();
    JTable table = new JTable(model);
    // TableColumn column = table.getColumnModel().getColumn(3);
    // column.setCellRenderer(renderer);
    // column.setCellEditor(editor);

    JScrollPane scrollPane = new JScrollPane(table);
    frame.add(scrollPane, BorderLayout.CENTER);
    frame.setSize(400, 150);
    frame.setVisible(true);
  }

Я хотел бы получить значение столбца один, если бы я отметил соответствующую строку. Я много читал об этом, но не могу просто записать это в код. Можете ли вы закодировать какой-нибудь?

Пример сценария, когда я установил флажок row1, он будет system.out.println() с результатом value1.


person Jong    schedule 21.11.2012    source источник


Ответы (3)


Ваша реализация setValueAt() в вашем AbstractTableModel не может запустить событие, которое уведомит слушателей об изменении:

@Override
public void setValueAt(Object value, int row, int column) {
    rowData[row][column] = value;
    fireTableCellUpdated(row, column);
}

Как только это будет исправлено, TableModelListener увидит каждое изменение. Попробуйте закомментировать строку fireTableCellUpdated(), чтобы увидеть разницу.

Кроме того:

Код:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
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.TableModel;

/**
 * @see https://stackoverflow.com/q/13497276/230513
 */
public class EditableColorColumn {

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new EditableColorColumn().display();
            }
        });
    }

    private void display() {
        JFrame frame = new JFrame("Editable Color Table");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final TableModel model = new ColorTableModel();
        JTable table = new JTable(model);
        table.setPreferredScrollableViewportSize(new Dimension(400, 150));
        table.getModel().addTableModelListener(new TableModelListener() {

            @Override
            public void tableChanged(TableModelEvent e) {
                System.out.println(model.getValueAt(e.getFirstRow(), 0)
                    + " " + model.getValueAt(e.getFirstRow(), 1));
            }
        });

        frame.add(new JScrollPane(table), BorderLayout.CENTER);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private static class ColorTableModel extends AbstractTableModel {

        String columnNames[] = {"English", "Boolean"};
        Object rowData[][] = {
            {"value1", Boolean.FALSE},
            {"value2", Boolean.TRUE},
            {"value3", Boolean.FALSE},
            {"value4", Boolean.TRUE},
            {"value5", Boolean.FALSE},};

        @Override
        public int getColumnCount() {
            return columnNames.length;
        }

        @Override
        public String getColumnName(int column) {
            return columnNames[column];
        }

        @Override
        public int getRowCount() {
            return rowData.length;
        }

        @Override
        public Object getValueAt(int row, int column) {
            return rowData[row][column];
        }

        @Override
        public Class getColumnClass(int column) {
            return (getValueAt(0, column).getClass());
        }

        @Override
        public void setValueAt(Object value, int row, int column) {
            rowData[row][column] = value;
            fireTableCellUpdated(row, column);
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            return (column != 0);
        }
    }
}
person trashgod    schedule 21.11.2012

Вы можете использовать getSelectedRow() для получения выбранной строки. Затем используйте getValueAt(строка, столбец), где строка — это значение, которое вы получили от getSelectedRow(), а столбец — это столбец, который вы хотите. Попробуйте следующее: -

int row=table.getSelectedRow();

String value=table.getValueAt(row, 0).toString();

где 0 означает, что он вернет значение первого столбца.

person Addict    schedule 21.11.2012
comment
int row=table.getSelectedRow(); Строковое значение = table.getValueAt (строка, 0).toString(); - person Addict; 21.11.2012
comment
Сначала вы должны определить функцию MouseListner для jtable. Только тогда вы сможете фиксировать клики на вашем jtable. - person Addict; 21.11.2012
comment
даже когда я щелкаю ячейку без флажка, это system.out.println значение ячейки. Как я могу избавиться от этого? Это должен быть только столбец с флажком. - person Jong; 21.11.2012
comment
Вы можете использовать getSelectedColumn(), чтобы узнать, какой столбец был нажат. И тогда вы можете использовать простой цикл if, чтобы что-то сделать, только если был нажат конкретный столбец. - person Addict; 21.11.2012
comment
Но функция флажка не работает, если это так, я могу получить значение строки, даже если я снимаю флажок, которого не должно быть. Я хотел получить значение, если флажок установлен. - person Jong; 21.11.2012
comment
Это очень просто. Если вам нужно значение только при нажатии флажка, просто добавьте логику, чтобы убедиться, что код выполняется только в том случае, если значение флажка истинно. - person Addict; 21.11.2012
comment
Спасибо Аддикт. Так и есть, простая логика. :( Я работал над этим в последние дни, и я копаю слишком глубоко из-за большого количества кодов, которые я видел. Но не думал о том, что вы предложили. Спасибо. - person Jong; 21.11.2012

Если вам нужно только получить значение выбранного столбца, попробуйте это

table.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            int row = table.getSelectedRow();
            System.out.println("Selected Row ; " + row );
            System.out.println("Velue : " + model.getValueAt(row, 0));
        }
});
person vels4j    schedule 21.11.2012