【问题标题】:event for check box in jtable headerjtable 标头中复选框的事件
【发布时间】:2011-09-04 18:42:02
【问题描述】:

嗨,我有一个在列和列标题中带有复选框的 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());
    }
}
}

顶部的图像未选择任何内容 单击列标题(AM)后底部的图像

getTableCellRendererComponent 发生在 mouseClicked 事件之前,所以我无法获得点击的列

有什么想法吗?

【问题讨论】:

    标签: java swing checkbox jtable jtableheader


    【解决方案1】:

    问题出在鼠标监听器上。这两个实例都列出了鼠标单击具有列 ==0 的标题的列表。因此,当您单击该标题时,两者都会被选中或取消选中。

    【讨论】:

    • 您必须告诉类在构造函数中检查哪一列。或者让它找出它是哪个列的渲染器。或者更好地将“检查值存储”拉到另一个类中,就像您的表模型一样充当模型。
    • 在我在论坛上提问之前,我尝试了第一个解决方案,但那不起作用...我没有看到 setValueAt 方法的正确列我不知道您的第二个解决方案是否可行遗憾的是,关于挥杆练习的信息很少
    • @user660503 我在发布的表单中尝试了您的代码,JCheckBox 错过了 CellRenderer,jzd +1
    【解决方案2】:

    你应该在设置值循环中传递你的列索引

    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】:

      试试这个

      您必须指明要修改的列

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

      【讨论】:

        猜你喜欢
        • 2015-03-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-31
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        • 2019-04-22
        • 2010-10-17
        相关资源
        最近更新 更多