Entra

View Full Version : [Java] Impostare nome ad una colonna JTable


bobby1112
17-02-2010, 16:05
salve ragazzi ho questo problemasto creando una JDialog che contiene 2 Tabelle(con 1 colonna) con i rispettivi modelli ma non riesco ad impostare il nome alle colonne
package view.dialogs.checkDatatypeDialogs;

import java.awt.Color;
import java.awt.Component;
import java.util.LinkedList;
import java.util.List;

import javax.swing.Box;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;



import model.program.Attribute;
import model.program.Entity;
import model.program.SourceEntity;
import model.utilities.ModelUtilities;


public class CheckDialog extends JDialog{

private JList databasetype;
private JList typtype;
private JTable tableTypeDatabase=new JTable();
private JTable tableTypeTyp=new JTable();
private TableModelDatabase model=new TableModelDatabase();
private TableModelTyp model2=new TableModelTyp();


public CheckDialog(JFrame owner,String [][] datatype,SourceEntity typdatatype)
{
super(owner);
this.setName("Check DataType");


model.setEntity(typdatatype);
model2.setEntity(datatype);

tableTypeDatabase.setModel(model);
tableTypeTyp.setModel(model2);


this.setSize(350,200);
if (owner != null){
int x = (owner.getWidth() - this.getWidth()) / 2;
int y = (owner.getHeight() - this.getHeight()) / 2;;
this.setLocation(x, y);
}
Box top=Box.createVerticalBox();
top.add(Box.createVerticalStrut(30));
Box table1=Box.createHorizontalBox();
top.add(table1);
table1.add(tableTypeDatabase);
top.add(Box.createHorizontalStrut(30));
table1.add(tableTypeTyp);


JPanel panel = new JPanel();
panel.add(top);
getContentPane().add(panel);


this.setVisible(true);

}




private class TableModelDatabase extends AbstractTableModel{
/**
*
*/
private static final long serialVersionUID = 1L;
private SourceEntity entity = null;
private String [] columnName={"Database"};

public void setEntity(SourceEntity entity){
this.entity = entity;
}

public int getColumnCount() {
return 1;
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
if (columnIndex == 2){
return true;
}
return false;
}

public int getRowCount() {
if (entity != null){
return entity.getAttributes().size();
}else{
return 1;
}
}

public Object getValueAt(int rowIndex, int columnIndex) {
if (entity != null){
Attribute attribute = entity.getAttributes().get(rowIndex);
if (columnIndex == 0){
return attribute.getOriginalType();
}else if (columnIndex == 1){
return attribute.getOriginalType();
}else{
return attribute.getImportedType();
}
}else{
return null;
}
}
public String getColumnName(int column) {

return columnName[0];

}

//Selezionare il tipo con menu a tendina
@Override
public void setValueAt(Object arg0, int arg1, int arg2) {
super.setValueAt(arg0, arg1, arg2);
if (arg2 == 2){
entity.getAttributes().get(arg1).setImportedType(arg0);
}
}
}

private class TableModelTyp extends AbstractTableModel{

private String [][] entity=null;

public void setEntity(String [][] entity){
this.entity = entity;
}
@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return 1;
}

@Override
public int getRowCount() {
// TODO Auto-generated method stub
return entity.length;
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if(columnIndex==0)
return entity[rowIndex][1];
return null;
}
public String getColumnName(int column) {

if(column==0)
return "Typ";
else if (column!=0);
return ".Typ";

}

}

}

PGI-Bis
18-02-2010, 01:48
Il codice è ok - nel senso che è corretto il modo in cui assegni un nome alle colonne attraverso il modello.

La magagna è visuale.

JTable è fatta due parti, il corpo (JTable) e l'intestazione (jtable.getTableHeader).

Normalmente una jtable è inserita in un JScrollPane. JScrollPane ha il "trucco": quando si vede arrivare una tabella mette il corpo nello scroller e l'intestazione nell'intestazione dello scroller.

Se nel tuo codice scrivi al posto di:

table1.add(tableTypeDatabase);

metti:

table1.add(new JScrollPane(tableTypeDatabase))

vedrai apparire le intestazioni. Si può fare anche senza JScrollPane, devi semplicemente aggiungere alla tua interfaccia sia il corpo sia l'intestazione della tabella. Ad esempio:

JPanel panel = new JPanel(new BorderLayout());
panel.add(table.getTableHeader(), BorderLayout.NORTH);
panel.add(table, BorderLayout.CENTER);

Ci sono alcune differenze tra usare o non usare un JScrollPane. A parte le barre di scorrimento, JScrollPane crea una superficie un po' più alta di quanto strettamente necessario a mostrare le righe della tabella. Inserendo direttamente il corpo (e l'intestazione) la tabella assume una dimensione minima sufficiente a visualizzare righe e colonne attualmente esistenti.

bobby1112
18-02-2010, 09:58
ok per il nome della colonna sono riuscito ad impostarlo adesso ho questo problema usando lo scrollPane

table1.add(new JScrollPane(tableTypeDatabase))

adesso devo settare le dimensioni della tabella

1-se faccio in questo modo

tableTypeDatabase.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tableTypeDatabase.getColumnModel().getColumn(0).setPreferredWidth(100);

mi rimane lo spazio grigio vuoto dello scrollPane

2-se invece faccio

scrollPane.setPreferredSize(new Dimension(300,200));

è tutto ok ma di nuovo non vedo il nome sulla colonna


spero di essermi spiegato Grazie

bobby1112
18-02-2010, 11:20
per il momento ho risolto in questo modo

tableTypeDatabase.setPreferredScrollableViewportSize(new Dimension(200, 150));