JTable Boolean.class [英] JTable Boolean.class

查看:151
本文介绍了JTable Boolean.class的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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?

示例场景,当我勾选 row1 复选框时,它将 system.out.println(),结果为 value1

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

推荐答案

您的 AbstractTableModel 中的 setValueAt()的实现无法触发事件这将通知侦听器更改:

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

一旦更正, TableModelListener 会看到每个变化。尝试注释 fireTableCellUpdated()行以查看差异。

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

此外:

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

避免使用Java中的 设置(首选|最大|最小)大小 方法摇摆; setPreferredScrollableViewportSize()只是稍微危险一点。

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

代码:

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

这篇关于JTable Boolean.class的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆