Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

JTable, JCheckBox TableCellRenderer - Not doing Mouse Event& CheckBox probl

843807Jun 1 2010 — edited Jun 7 2010
For some reason the TableCellRenderer won't do the mouse event.
I don't get why. It works on my custom made Table Header, and sometimes you have to click twice, in order for the box to change state. That happens all the time if you change the position of the column (drag-and-drop). sometimes if you wan't to sellect a checkbox, after you click it, it will select it, but direct afterwards, even if you don't click one more time, it will deselect the checkbox (the opposite happens too).
I really don't get all these problems. Please Help.
	class CheckBoxCellRendererListener implements ItemListener {  
    	public void itemStateChanged(ItemEvent e) {  e.getItem();
    		Object source = e.getSource();  
    		if (source instanceof AbstractButton == false) return;
    		boolean checked = e.getStateChange() == ItemEvent.SELECTED;

    		MyTableCellRenderer CheckBoxCellRenderer = (MyTableCellRenderer)e.getItem();
    		System.out.println(CheckBoxCellRenderer);
    		JCheckBox checkBox = (JCheckBox)(e.getSource()); 
    		JTable table = (JTable)(checkBox.getParent());
    		table.setValueAt(new Boolean(checked), CheckBoxCellRenderer.getRow(), CheckBoxCellRenderer.getColumn());
    	}  
	}
	
	
	class MyTableCellRenderer extends JCheckBox implements TableCellRenderer, MouseListener{
		JTable table;
		//JCheckBox checkBox = new JCheckBox();
		protected boolean mousePressed = false;
		protected int column;
		protected int row;
		MyTableCellRenderer(ItemListener itemListener, JTable table){
			this.table=table;
			this.addItemListener(itemListener);
		}

		@Override
		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column) {
			if (table != null) {
				MyTableCellRenderer tableCellRenderer = (MyTableCellRenderer) table.getCellRenderer(row, column);
				tableCellRenderer.addMouseListener(this);  
				this.setBackground(isSelected? UIManager.getColor("Table.selectionBackground") : UIManager.getColor("Table.background"));
				//this.setSelected(Boolean.TRUE.equals(value));
			}
            setColumn(column);
            setRow(row);
            return this;
		}
		
		protected void setColumn(int column) {  
			this.column = column;  
		}  
		public int getColumn() {  
			return column;  
		}
		
		protected void setRow(int column) {  
			this.row = row;  
		}  
		public int getRow() {  
			return row;  
		}

		protected void handleClickEvent(MouseEvent e) {  
			if (mousePressed) {  
				mousePressed=false;  
				JTableHeader header = (JTableHeader)(e.getSource());  
				JTable tableView = header.getTable();  
				TableColumnModel columnModel = tableView.getColumnModel();  
				int viewColumn = columnModel.getColumnIndexAtX(e.getX());  
				int column = tableView.convertColumnIndexToModel(viewColumn);  

				if (viewColumn == this.column && e.getClickCount() > 0 && column != -1) {  
					this.doClick();  
				}  
			}
		}
		
		@Override
		public void mouseClicked(MouseEvent e) {
			// TODO Auto-generated method stub
			boolean active=true; 
			switch (e.getID()) {
			case MouseEvent.MOUSE_CLICKED:
			case MouseEvent.MOUSE_PRESSED:
			case MouseEvent.MOUSE_RELEASED:
				JTable tableView = table;
				
				TableColumnModel columnModel = tableView.getColumnModel();
				int viewColumn = columnModel.getColumnIndexAtX(e.getX());
				int column = tableView.convertColumnIndexToModel(viewColumn);
				Rectangle bounds = tableView.getCellRect(-1, viewColumn, true);
				if (e.getX() > bounds.x + 16) {
					if (e.getID() == MouseEvent.MOUSE_CLICKED) {
						active = false;
					}
				}else{
					active=true;
				}
			}
			if(active){
				handleClickEvent(e);  
				((JTableHeader)e.getSource()).repaint();
			}
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub
			mousePressed = true;
		}

		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
	}
Edited by: Naco88 on Jun 1, 2010 1:12 PM
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jul 5 2010
Added on Jun 1 2010
9 comments
2,079 views