JTable- problem z edycją komórki

0

Witam,
mam prblem z JTable a mianowcie mam kolumnę Rabaty w której znajduje się JComboBox w którym znajdują się ceny odpowiednio po rabacie. Ale chciałbym także zrobić tak żeby w tej kolumnie oprócz tego że można wybrać rabat z JComboBox była możliwość ręcznego wpisania ceny po rabacie. Z góry dziękuje za pomoc.
Pozdrawiam</image>

0

Spróbuje Ci pomóc, ale rozpisz dokładniej swój problem. Może wstaw kawałek kodu.

Pozdrawima BookaYashee

0

no więc kod wygla\ąda następująci

JComboBox combo=new JComboBox();
combo.addItem(1);
combo.addItem(2);
TableModel tableModel= new TableMOdel();
JTable table =new JTable();
table.setModel(tableModel);
TableCellEditor editor = new DefaultCellEditor(combo);
TableColumnModel columnModel = table.getColumnModel();
TableColumn column = columnModel.getColumn(tableModel.COLUM_CENA);
column.setCellEditor(editor);

ten fragment kodu powoduje że po klikniecie w kolumne cena mam do wyboru dwie opcje 1 i 2 które sąw combo Boxie. Natomiast chciałbym zrobićtak że oprócz tego że można wybraćceny z combo można je też wpisywaćz ręki czyli jak jest to domyślnie w tablach.

0

pobaw sie Cell renderami i editorami
ponizej przyklad kliku moich klas..

class ProductTableModel extends AbstractTableModel{
	private static final long serialVersionUID = -666L;
	private ArrayList<Product> data;
	private String[] columnNames;
	public ProductTableModel(){
		this.columnNames=new String[]{"ID","Firma","Nazwa"};
		data=new ArrayList<Product>();
	}
	public ProductTableModel(ArrayList<Product> data){
		this.columnNames=new String[]{"ID","Firma","Nazwa"};
		this.data=data;
	}
	public int getRowCount() {
		return data.size();
	}

	public int getColumnCount() {
		return columnNames.length;
	}

	public Object getValueAt(int rowIndex, int columnIndex) {
		Product p=data.get(rowIndex);
		if (p!=null)
		switch (columnIndex){
			case 0:return p.getID();
			case 1:return p.getCompany();
			case 2:return p.getName();
			default: return "";
		}
		else{
			return "";
		}
	}
	public String getColumnName(int index){
		return columnNames[index];
	}
	public void setTableData(ArrayList<Product> data){
		if (data!=null){
			this.data=data;
			fireTableRowsInserted(0,data.size()-1);
		}
		else{
			data=new ArrayList<Product>();
			fireTableRowsInserted(0,-1);
		}
		
	}
	public Class<?> getColumnClass(int columnIndex) {
		return String.class; //TO moze Cie zainteresowac...
	}
	public Product getProductAt(int index){
		return data.get(index);
	}
	
}

class CheckboxRender implements TreeCellRenderer{
	private JCheckBox cbox=new JCheckBox();
	public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
		if (leaf){
			Object obj=((DefaultMutableTreeNode)value).getUserObject();
				if (obj instanceof JCheckBox){
					cbox=(JCheckBox)obj;
					cbox.setEnabled(tree.isEnabled());
					if (selected){
						cbox.setForeground(UIManager.getColor("Tree.selectionForeground"));
						cbox.setBackground(UIManager.getColor("Tree.selectionBackground"));
					}
					else{
						cbox.setForeground(UIManager.getColor("Tree.textForeground"));
						cbox.setBackground(UIManager.getColor("Tree.textBackground"));
					}
				return cbox;
				}
				else
					return new DefaultTreeCellRenderer().getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus);
		}
		else
			return new DefaultTreeCellRenderer().getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus);
	}
}

class CheckboxEditor extends AbstractCellEditor implements TreeCellEditor{
	private static final long serialVersionUID = -666L;
	private JTree tree;
	public CheckboxEditor(JTree tree){
		this.tree=tree;
	}
	public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) {
		return new CheckboxRender().getTreeCellRendererComponent(tree,value,true,expanded,leaf,row,true);
	}

	public Object getCellEditorValue() {
		return new JCheckBox();
	}
	public boolean isCellEditable(EventObject ev){
		if (ev instanceof MouseEvent){
			MouseEvent me=(MouseEvent)ev;
			TreePath path=tree.getPathForLocation(me.getX(),me.getY());
			if (path!=null){
				Object node=path.getLastPathComponent();
				if (node instanceof DefaultMutableTreeNode){
					if (((DefaultMutableTreeNode)node).getUserObject() instanceof JCheckBox)
						return true;
				}	
			}
		}
		return false;
	}
}

pobaw sie i pokombinuj

pozdrawiam

0

Witam.
Mam bardzo podobny problem jak kolega. Próbowałam już różnymi sposobami i nic nie działa. Występuje wyjątek: java.lang.ArrayIndexOutOfBoundsException: 2 >= 0
Chciałabym aby kolumna "ile dni była comboBoxem.

Mój kod:
JTable tbl3=new JTable();

    JComboBox cb=new JComboBox();
    cb.add(1); cb.add(2);

    Vector tbCols=new Vector();        
      tbCols.add("ID");        
      tbCols.add("Tytuł");
      tbCols.add("Ile dni");
    
    tableModel tbMod=new tableModel(tbCols); 

    Vector row=new Vector();        
      row.add (   /* TU ZAPISUJE MI ID */ );
      row.add("JAKIŚ TYTUŁ");
      row.add(cb); //MÓJ ComboBox

    tbMod.addRow(row);

(*) TableColumn colm=tbl3.getColumnModel().getColumn(2);
colm.setCellEditor(new DefaultCellEditor(cb));

    tbl3.setModel(tbMod);

Gdy robię row.add("coś tam" /* zamiast CB w trzeciej kolumnie / ) wtedy działa dobrze i generuje sie tabelka, lecz gdy wstawie cb wyskakuje wyjątek lub komunikat taki jak u kolego wyżej(to zależy gdzie umieszczę kod ()

Prosze o pomoc bo mecze sie juz z tym bardzo długo. Pewnie jakiś głupi błąd robię :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1