событие для флажка в заголовке jtable - PullRequest
3 голосов
/ 30 мая 2011

привет, у меня есть jtable с флажком в столбце и заголовке столбца

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

    String[] columnNames = {"Am", "Pm", "Integer", "String"};
    Object[][] data = {{true, true, 1, "BBB"}, {false, true, 12, "AAA"},
        {true, false, 2, "DDD"}, {false, false, 5, "CCC"},
        {true, true, 3, "EEE"}, {false, false, 6, "GGG"},
        {true, true, 4, "FFF"}, {false, false, 7, "HHH"}};
    DefaultTableModel model = new DefaultTableModel(data, columnNames) {

        @Override
        public Class<?> getColumnClass(int column) {
            return getValueAt(0, column).getClass();
        }
    };
    JTable table = new JTable(model);
    table.getColumnModel().getColumn(0).setHeaderRenderer(
            new HeaderRenderer2(table.getTableHeader()));


    table.getColumnModel().getColumn(1).setHeaderRenderer(
            new HeaderRenderer2(table.getTableHeader()));

я создал средство визуализации ячеек таблицы

public class HeaderRenderer2 implements TableCellRenderer {

private final JCheckBox check = new JCheckBox();

public HeaderRenderer2(JTableHeader header) {
    check.setOpaque(false);
    check.setFont(header.getFont());
    header.addMouseListener(new MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent e) {
            JTable table = ((JTableHeader) e.getSource()).getTable();
            TableColumnModel columnModel = table.getColumnModel();
            int viewColumn = columnModel.getColumnIndexAtX(e.getX());
            int modelColumn = table.convertColumnIndexToModel(viewColumn);
            if (modelColumn == 0) {
                check.setSelected(!check.isSelected());
                TableModel m = table.getModel();
                Boolean f = check.isSelected();
                for (int i = 0; i < m.getRowCount(); i++) {
                    m.setValueAt(f, i, 0);
                }
                ((JTableHeader) e.getSource()).repaint();
            }
        }
    });
}

@Override
public Component getTableCellRendererComponent(
        JTable tbl, Object val, boolean isS, boolean hasF, int row, int col) {
    TableCellRenderer r = tbl.getTableHeader().getDefaultRenderer();
    JLabel l = (JLabel) r.getTableCellRendererComponent(tbl, val, isS, hasF, row, col);
    l.setIcon(new CheckBoxIcon(check));
    return l;
}

private static class CheckBoxIcon implements Icon {

    private final JCheckBox check;

    public CheckBoxIcon(JCheckBox check) {
        this.check = check;
    }

    @Override
    public int getIconWidth() {
        return check.getPreferredSize().width;
    }

    @Override
    public int getIconHeight() {
        return check.getPreferredSize().height;
    }

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        SwingUtilities.paintComponent(
                g, check, (Container) c, x, y, getIconWidth(), getIconHeight());
    }
}
}

изображение вверху ничего не выбрано problem displayed изображение внизу после нажатия на заголовок столбца (AM)

getTableCellRendererComponent происходит до события mouseClicked, поэтому я не могу получить столбец, по которому щелкнули

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 30 мая 2011

Вы должны передать свой индекс столбца в цикле заданного значения

public void mouseClicked(MouseEvent e) {
             JTable table = ((JTableHeader) e.getSource()).getTable();
             TableColumnModel columnModel = table.getColumnModel();
             int viewColumn = columnModel.getColumnIndexAtX(e.getX());
             int modelColumn = table.convertColumnIndexToModel(viewColumn);
             if (modelColumn == 0 || modelColumn == 1) {
                 check.setSelected(!check.isSelected());
                 TableModel m = table.getModel();
                 Boolean f = check.isSelected();
                 for (int i = 0; i < m.getRowCount(); i++) {
                     m.setValueAt(f, i, modelColumn);
                 }
                 ((JTableHeader) e.getSource()).repaint();
             }
         } 
3 голосов
/ 30 мая 2011

Проблема в приемнике мыши. Оба экземпляра перечислены для щелчков мышью по заголовку, который имеет столбец == 0. Поэтому оба будут отмечены или не отмечены при нажатии на этот заголовок.

0 голосов
/ 06 июня 2014

попробуйте

Вы должны указать столбец для изменения

String[] columnNames = {"Am", "Pm", "Integer", "String"};
Object[][] data = {{true, true, 1, "BBB"}, {false, true, 12, "AAA"},
    {true, false, 2, "DDD"}, {false, false, 5, "CCC"},
    {true, true, 3, "EEE"}, {false, false, 6, "GGG"},
    {true, true, 4, "FFF"}, {false, false, 7, "HHH"}};
DefaultTableModel model = new DefaultTableModel(data, columnNames) {

    @Override
    public Class<?> getColumnClass(int column) {
        return getValueAt(0, column).getClass();
    }
};
JTable table = new JTable(model);
table.getColumnModel().getColumn(0).setHeaderRenderer(
        new HeaderRenderer2(table.getTableHeader(), 0));


table.getColumnModel().getColumn(1).setHeaderRenderer(
        new HeaderRenderer2(table.getTableHeader(), 1));

и

public HeaderRenderer2(JTableHeader header, final int index) {

    // index is the column to be modified

    check.setOpaque(false);
    check.setFont(header.getFont());
    header.addMouseListener(new MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent e) {
            JTable table = ((JTableHeader) e.getSource()).getTable();
            TableColumnModel columnModel = table.getColumnModel();
            int viewColumn = columnModel.getColumnIndexAtX(e.getX());
            int modelColumn = table.convertColumnIndexToModel(viewColumn);
            if (modelColumn == index) {
                check.setSelected(!check.isSelected());
                TableModel m = table.getModel();
                Boolean f = check.isSelected();
                for (int i = 0; i < m.getRowCount(); i++) {
                    m.setValueAt(f, i, index);
                }
                ((JTableHeader) e.getSource()).repaint();
            }else return;
        } 
    }
            );
}
...