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>
Spróbuje Ci pomóc, ale rozpisz dokładniej swój problem. Może wstaw kawałek kodu.
Pozdrawima BookaYashee
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.
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
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ę :(