JTable Boolean.class

こ雲淡風輕ζ 提交于 2019-11-26 23:39:42

问题


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);
  }

I would like to get the value of column one if I ticked the corresponding row. I have read a lot about this, but I can't just put it to code. Can you code a some one?

Sample scenario, when I ticked row1 checkbox, it will system.out.println() with a result of value1.


回答1:


Your implementation of setValueAt() in your AbstractTableModel fails to fire the event that would notify listeners of the change:

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

Once that is corrected, a TableModelListener will see each change. Try commenting out the fireTableCellUpdated() line to see the difference.

In addition:

  • Swing GUI objects should be constructed and manipulated only on the event dispatch thread.

  • Avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing; setPreferredScrollableViewportSize() is only slightly less perilous.

Code:

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);
        }
    }
}



回答2:


You can use getSelectedRow() to get row which was selected. Then use getValueAt(row, column) where row is the value which you got from getSelectedRow() and column is the column which you want. Try following :-

int row=table.getSelectedRow();

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

where 0 means it will return the value of first column.




回答3:


If only you need to get value of the selected column, try this

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));
        }
});


来源:https://stackoverflow.com/questions/13497276/jtable-boolean-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!