Probleme bei der Column-Breite einer JTable

Dutch_OnE

Mitglied
Ich würde gerne in einer JTable die Breite der einzelnen Spalten individuell anpassen:

Für die JTable habe ich eine eigene Klasse (KundenTableShort.java) geschrieben:
Wie man an der "prepareRenderer"-Methode sehen kann, probiere ich schon alles (?) aus, um eine Spalte größer als die anderen zu machen!

Java:
package view.table;

import java.awt.Color;
import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;

public class KundenTableShort extends JTable {

	private static final long serialVersionUID = 1L;
	private JTableHeader header;
	
	public KundenTableShort() {
		header = getTableHeader();
		header.setBackground(Color.GRAY);
		header.setForeground(Color.BLACK);
		header.setFont(new Font("Arial", Font.CENTER_BASELINE, 13));
	}


	public Component prepareRenderer(TableCellRenderer renderer, int index_row,
			int index_col) {

		Component comp = super.prepareRenderer(renderer, index_row, index_col);

		if (index_col == 3) {
			comp.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
			comp.setPreferredSize(new Dimension(20, 20));
			comp.setMaximumSize(new Dimension(20, 20));
			comp.setMinimumSize(new Dimension(20, 20));
		} else {
			comp.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
			comp.setPreferredSize(new Dimension(200, 20));
			comp.setMaximumSize(new Dimension(200, 20));
			comp.setMinimumSize(new Dimension(200, 20));
		}

		return comp;
	}

}

Das dazugehörige Model falls es interessant sein sollte?!

Java:
package view.table;

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
import model.Kunde;
import util.A;
import view.panel.interneKundenPanel.KundenPanelKundeChange;
import view.panel.interneKundenPanel.KundenPanelKundeLoeschen;
import db.exceptions.DBException;

public class KundenTableModelShort extends AbstractTableModel {

	private static final long serialVersionUID = 1L;
	private ArrayList<Kunde> list;
	private String[] columnNames;
	private Object[][] data;
	private KundenPanelKundeChange kundenPanelKundeChange;
	private KundenPanelKundeLoeschen kundenPanelKundeLoeschen;

	public KundenTableModelShort(KundenPanelKundeChange kundenPanelKundeChange)
			throws DBException {
		this.kundenPanelKundeChange = kundenPanelKundeChange;
		list = kundenPanelKundeChange.getKundenPanel().getMainPanel()
				.getMainFrame().getMediator().getKunden();

		columnNames = A.getJTabelHeadLineShort();

	}

	public KundenTableModelShort(
			KundenPanelKundeLoeschen kundenPanelKundeLoeschen)
			throws DBException {
		this.kundenPanelKundeLoeschen = kundenPanelKundeLoeschen;
		list = kundenPanelKundeLoeschen.getKundenPanel().getMainPanel()
				.getMainFrame().getMediator().getKunden();
		columnNames = A.getJTabelHeadLineShort();

	}


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

	@Override
	public String getColumnName(int column) {
		return columnNames[column];
	}

	@Override
	public int getRowCount() {
		return list.size();
	}

	@Override
	public Object getValueAt(int arg0, int arg1) {
		Kunde k = list.get(arg0);
		arg1++;
		if (arg1 == 0) {
			return k.getAnrede();
		} else if (arg1 == 1) {
			return k.getNachname();
		} else if (arg1 == 2) {
			return k.getVorname();
		} else if (arg1 == 3) {
			return k.getStrasse();
		} else if (arg1 == 4) {
			return k.getPlz();
		} else if (arg1 == 5) {
			return k.getOrt();
		}
		return "";
	}

	public boolean isCellEditable(int row, int col) {
		return false;
	}

	public Object[][] getData() {
		return data;
	}

	public ArrayList<Kunde> getList() {
		return list;
	}

	public KundenPanelKundeChange getKundenPanelKundeChange() {
		return kundenPanelKundeChange;
	}

	public void setList(ArrayList<Kunde> list) {
		this.list = list;
	}

	public KundenPanelKundeLoeschen getKundenPanelKundeLoeschen() {
		return kundenPanelKundeLoeschen;
	}
}

und das Panel das die JTable aufnimmt:

Java:
package view.panel.interneKundenPanel;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableColumn;

import view.listener.KundenTableListenerShort;
import view.panel.GradientPanel;
import view.panel.KundenPanel;
import view.table.KundenTableModelShort;
import view.table.KundenTableShort;
import db.exceptions.DBException;

public class KundenPanelKundeChange extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private KundenTableShort kundenTable;
	private KundenTableModelShort kTModel;
	private KundenTableListenerShort ktlistener;
	private KundenPanel kundenPanel;
	private static final String ID = "CHANGE";

	public KundenPanelKundeChange(KundenPanel kundenPanel) {
		this.kundenPanel = kundenPanel;
		JPanel jp = new GradientPanel();
		setLayout(new GridLayout());

		jp.setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();

		kundenTable = new KundenTableShort();
		try {
			kTModel = new KundenTableModelShort(this);
		} catch (DBException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		kundenTable.setModel(kTModel);

		ktlistener = new KundenTableListenerShort(kundenTable, ID);
		kundenTable.addMouseListener(ktlistener);

		kundenTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);

		TableColumn column = kundenTable.getColumnModel().getColumn(0);
		column.setPreferredWidth(5);
		column.setMinWidth(5);
		column.setMaxWidth(5);

		column = kundenTable.getColumnModel().getColumn(1);
		column.setPreferredWidth(150);
		column.setMinWidth(150);
		column.setMaxWidth(150);
		//	   
		kundenTable.setRowHeight(20);
		// //set specific row height
		kundenTable.setRowHeight(2, 50);
		// //Select single cell

		kundenTable.setAutoscrolls(true);
		kundenTable.setBorder(BorderFactory.createBevelBorder(0));
		kundenTable
				.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
		kundenTable.setAutoCreateRowSorter(true);

		TableColumn colun = kundenTable.getColumn("PLZ");
		colun.setWidth(10);
		colun.setMaxWidth(10);
		colun.setMinWidth(10);
		colun.setPreferredWidth(10);

		colun = kundenTable.getColumn("Name");
		colun.setWidth(200);
		colun.setMaxWidth(200);
		colun.setMinWidth(200);
		colun.setPreferredWidth(200);

		JScrollPane jsp = new JScrollPane(kundenTable);
		c.anchor = GridBagConstraints.NORTH;
		jp.add(jsp, c);
		add(jsp);

	}

	public KundenTableShort getKundenTable() {
		return kundenTable;
	}

	public KundenTableModelShort getKTModel() {
		return kTModel;
	}

	public void setKTModel(KundenTableModelShort model) {
		kTModel = model;
	}

	public static String getID() {
		return ID;
	}

	public void refresh() {
		try {
			kTModel = new KundenTableModelShort(this);
		} catch (DBException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		kundenTable.setModel(kTModel);
		this.validate();
	}

	public KundenTableListenerShort getKtlistener() {
		return ktlistener;
	}

	public void setKtlistener(KundenTableListenerShort ktlistener) {
		this.ktlistener = ktlistener;
	}

	public KundenPanel getKundenPanel() {
		return kundenPanel;
	}

	public void setKundenPanel(KundenPanel kundenPanel) {
		this.kundenPanel = kundenPanel;
	}

	public static long getSerialVersionUID() {
		return serialVersionUID;
	}

	public void setKundenTable(KundenTableShort kundenTable) {
		this.kundenTable = kundenTable;
	}

}

Auch wenn jetzt dort schon viele verschiedene Ansätze ausprobiert worden...(sorry für den schlechten Code), leider zeigt er mir immer gleich große Spalten an!!! 🙁

Irgendjemand eine Idee, woran das liegen könnte...???!!!

PS:
folgender Code funzt bei mir auch...also ich brauche -wenn möglich- genau zu dem o.g. Problem die Lösung.

Java:
public class setRowHightAndColBidth {
	public static void main(String[] args) {
		new setRowHightAndColBidth();
	}

	public setRowHightAndColBidth() {
		JFrame frame = new JFrame("Creating JTable Component Example!");
		JPanel panel = new JPanel();
		String data[][] = { { "vinod", "BCA", "A" }, { "Raju", "MCA", "b" },
				{ "Ranjan", "MBA", "c" }, { "Rinku", "BCA", "d" },
				{ "Rama anuj pathak tiwari", "PGDCA", "e" } };
		String col[] = { "Name", "Course", "Grade" };
		JTable table = new JTable(data, col);
		// first column width
		TableColumn column = table.getColumnModel().getColumn(0);
		column.setPreferredWidth(150);
		// set all rows height
		table.setRowHeight(20);
		// set specific row height
		table.setRowHeight(2, 50);
		// Select single cell
		table.setCellSelectionEnabled(true);
		panel.add(table, BorderLayout.CENTER);
		frame.add(panel);
		frame.setSize(300, 200);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}
 
mit dem Renderer wird das Aussehen einer Zeile bestimmt, die Spaltenbreite setzt man direkt an der TableColumn, die besitzt die Methoden setMinWidth, setMaxWidth und setPreferedWidth
An die einzelnen Spalten kommt man über das TableColumnModel
z.B:
Java:
jTable.getColumnModel().getColumn(0).setPreferredWidth(150);

Edit: das steht ja sogar in Deinem Bsp Code drin!!
 
[java=57]
TableColumn column = kundenTable.getColumnModel().getColumn(0);
column.setPreferredWidth(5);
column.setMinWidth(5);
column.setMaxWidth(5);

column = kundenTable.getColumnModel().getColumn(1);
column.setPreferredWidth(150);
column.setMinWidth(150);
column.setMaxWidth(150);
[/code]

das mache ich doch auch in meinem Panel...oder?
Leider funzt das nicht...alle Spalten haben die gleiche Breite 🙁
 
Hatte mir aufgrund der Erwähung von prepareRenderer in Zusammenhang mit Spaltenbreite Deinen Code nicht angeschaut. Aber mit dem AutoResizeMode, den Du der Tabelle vorgibst, kannst Du die Spaltebreite vorgeben wie Du willst:
Java:
kundenTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
Verwende einen anderen Modus oder deaktiviere das autoresize komplett.
 
Erstmal Danke Michael...,

unsere Lösung ist aber ohne die Deaktivierung des Modus möglich:

Java:
kundenTable.setAutoCreateColumnsFromModel(isPreferredSizeSet());

        TableColumnModel cM = kundenTable.getColumnModel();


        cM.getColumn(0).setPreferredWidth(1000);
        cM.getColumn(1).setPreferredWidth(50);

usw
 

Zurück
Oben