Newsgroup: it.comp.java
Titolo: Problemi con una JTable + JComboBox

E' ormai 5 ore che ho questo problema ma non riesco a capire come
risolverlo. Il problema è questo:
Devo costruire una JTable con 4 colonne: "ID","Scelta 1","ID","Scelta
2".
Nella colonna Scelta 1 e Scelta 2 devo metterci un JComboBox che tre
possibili scelte ("Uno","Due","Tre"). Dipende la scelta fatta a
sinistra (nella colonna ID) deve spuntare il numero scelto.
I porblemi sono questi:
1. Non capisco perchè la terza colonno non è allineata al centro.
2. Non capisco perchè quando faccio la scelta nel JComboBox la
tabbella non viene aggiornata.
Il problema 1 non so come risolverlo.
Per il problema 2 ho provato a fare un table.updateUI() e funziona
tutto, ma alcune volte il programma entra in una misteriosa eccezione
di tipo NullPointerException!
Ringrazio tutti quelli che mi vorranno aiutare.
Posto qui di seguito l'intero codice del programma:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class Tabella extends JDialog {
	public Tabella(JFrame owner) {
		super(owner,"Tabella",true);
 
		String[] names = new String[] {"ID","Scelta
1","ID","Scelta 2"};
		Object[][] data = new Object[2][names.length];
		for(int j=0;j<data.length;j++)
			data[j] = new Object[] {new Integer(0),new
String("Scegli..."),new Integer(0),new String("Scegli...")};
		JTable table = createTable(data,names);
 
		Container contentPane = this.getContentPane();
		contentPane.add(new JScrollPane(table));
 
		this.pack();
		this.setResizable(false);
	}
 
	private JTable createTable(final Object[][] data,final
String[] names) {
		TableModel dataModel = new AbstractTableModel() {
			public String getColumnName(int col) {return
names[col];}
			public int getRowCount() {return data.length;}
			public int getColumnCount() {return
names.length;}
			public Object getValueAt(int row,int col)
{return data[row][col];}
			public Class getColumnClass(int c) {return
getValueAt(0,c).getClass();}
			public boolean isCellEditable(int r,int c)
{return c==1||c==3;}
			public void setValueAt(Object aValue,int r,int
c) {data[r][c]=aValue;}
		};			
		final JTable table = new JTable(dataModel);
		JComboBox combo = new JComboBox(new String[]
{"Uno","Due","Tre"});
		combo.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				JComboBox combo =
(JComboBox)e.getSource();
				table.setValueAt(new
Integer(combo.getSelectedIndex()+1),table.getSelectedRow(),table.getSelectedColumn()-1);
			}
		});
		int tableWidth = 0;
		for(int column=0;column<names.length;column++) {
			TableColumn tc =
table.getColumn(names[column]);
			if(column==1||column==3) tc.setCellEditor(new
DefaultCellEditor(combo));
			DefaultTableCellRenderer cr = new
DefaultTableCellRenderer();
			int minWidth;
			switch(column) {
				case 1:
				case 3: {
cr.setHorizontalAlignment(JLabel.LEFT);
					minWidth = 150;
					break;
				}
				default: {
cr.setHorizontalAlignment(JLabel.CENTER);
					minWidth = 50;
				}
			}		
			tc.setCellRenderer(cr);
			tc.setMinWidth(minWidth);
			tableWidth+=minWidth;
		}
		table.setPreferredScrollableViewportSize(new
Dimension(tableWidth,data.length*table.getRowHeight()));
		return table;		
	}
 
	public static void main(String[] argv) {
		Tabella t = new Tabella(null);
		t.setVisible(true);
	}
}
--
Marco "Duff" Palermo
http://www.marcoduff.com/

ciao Marco ho aggiunto qualcosina nel codice:
1) fireTableDataChanged() nella setValue() della TableDataModel.
2) un controllo se la colonna selezionata e' 1 o 3 all'interno
dell'ItemStateChanged().
ps:
	ti ricordo che ItemStateChanged viene richiamata solo se e' 	cambiato 
l'item selezionato nella combo.Quindi se selezioni Uno come prima volta 
nella combo non c'e' stato alcun cambiamento.
3) il problema riguardante l'accentramento della 2 colonna id e' che 
appunto hai chiamato tutte e due le colonne con lo stesso nome (ID) ed 
ogni volta lui applica l'accentramento sulla prima che trova.
Non so se mi sono spiegato bene ma non ho avuto molto tempo..
Spero che ti sia stato utile
Ps:
il codice corretto e':
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class Tabella extends JDialog {
	public Tabella(JFrame owner) {
		super(owner,"Tabella",true);
 
		String[] names = new String[] {"ID","Scelta1","ID2","Scelta 2"};
		Object[][] data = new Object[2][names.length];
		for(int j=0;j<data.length;j++)
			data[j] = new Object[] {new Integer(0),new String("Scegli.."),
									new Integer(0),new String("Scegli...")};
		JTable table = createTable(data,names);
 
		Container contentPane = this.getContentPane();
		contentPane.add(new JScrollPane(table));
 
		this.pack();
		this.setResizable(false);
	}
 
	private JTable createTable(final Object[][] data,final String[] names) {
	   TableModel dataModel = new AbstractTableModel()
	   		{
			public String getColumnName(int col) {return names[col];}
			public int getRowCount() {return data.length;}
			public int getColumnCount() {return names.length;}
			public Object getValueAt(int row,int col){return data[row][col];}
			public Class getColumnClass(int c) {return getValueAt(0,c).getClass();}
			public boolean isCellEditable(int r,int c){return c==1||c==3;}
			public void setValueAt(Object aValue,int r,int c) {
						data[r][c]=aValue;
						fireTableDataChanged();
						}
			};			
		final JTable table = new JTable(dataModel);
		JComboBox combo = new JComboBox(new String[]{"Uno","Due","Tre"});
		combo.addItemListener(new ItemListener()
		{
		public void itemStateChanged(ItemEvent e)
		{
		JComboBox combo =(JComboBox)e.getSource();
		int c=table.getSelectedColumn();
		if(c==1|c==3)
		table.setValueAt(new 
String(""+(combo.getSelectedIndex()+1)),table.getSelectedRow(),c-1);
		}
		});
		int tableWidth = 0;
		for(int column=0;column<names.length;column++) {
			TableColumn tc =table.getColumn(names[column]);
			DefaultTableCellRenderer cr = new DefaultTableCellRenderer();
			int minWidth=0;
			switch(column) {
				case 0:
				{
				cr.setHorizontalAlignment(JLabel.CENTER);
			System.out.println(column);
				minWidth = 50;
					break;
				}
				case 1:
					{
			System.out.println(column);
					cr.setHorizontalAlignment(JLabel.LEFT);
					minWidth = 150;
					break;
					}
				case 2:
				{
			System.out.println(column);
				cr.setHorizontalAlignment(JLabel.CENTER);
				minWidth = 50;
					break;
				}
				case 3:
					{
			System.out.println(column);
					cr.setHorizontalAlignment(JLabel.LEFT);
					minWidth = 50;
					break;
					}
				default: break;
			}		
			if(column==1||column==3) tc.setCellEditor(new DefaultCellEditor(combo));


Spero che ti sia stato utile
[CUT]
Grazie per il prezioso aiuto, adesso è tutto risolto!
