JTableHeader zur Laufzeit vergrößern/verkleinern - JTable zoomen

Moin,

ich habe mir einen JTable-Typ geschrieben, bei dem ich den Inhalt zoomen kann. Der Code kann also zur Laufzeit die Schriftgröße in der Tabelle und die umgebenden Zellen in ihrer Größe dem Text anpassen.
Leider scheitere ich beim Versuch, das mit dem JTableHeader der Tabelle zu erreichen. Das klappt nur beim Instanziieren der JTable, also in deren Konstruktor.
Kann mir jemand einen Tipp geben, oder ein KSKB schreiben?

Danke!

Also wenn dann musst schon du das KSKB schreiben, sonst ist ja nicht klar um was es da eigentlich geht. Wenns darum geht ob es überhaupt möglich ist, ja ist es:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTable;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.DefaultTableModel;

public class HeaderKSKB {

	public static void main(String args[]) {
		EventQueue.invokeLater(new Runnable() {

			@Override
			public void run() {
				JFrame frame = new JFrame();
				Vector<String> v = new Vector<String>();
				v.add("Hallo");
				v.add("Welt");
				final JTable table = new JTable(new DefaultTableModel(v, 3));

				frame.add(new JScrollPane(table), BorderLayout.CENTER);

				JPanel panel = new JPanel();
				panel.add(new JLabel("Schriftgröße:"));
				final SpinnerNumberModel model = new SpinnerNumberModel();
				JSpinner spinner = new JSpinner(model);

				model.setValue(table.getTableHeader().getFont().getSize());

				spinner.addChangeListener(new ChangeListener() {

					@Override
					public void stateChanged(ChangeEvent arg0) {
						Font font = table.getTableHeader().getFont()
								.deriveFont(model.getNumber().floatValue());
						table.getTableHeader().setFont(font);
						table.repaint();
					}
				});
				panel.add(spinner);

				frame.add(panel, BorderLayout.SOUTH);
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.pack();
				frame.setVisible(true);
			}
		});
	}
}

Danke bERt0r, das hat mir sehr gut weiter geholfen. Ich bin gerade dabei, mich mal näher mit JTable zu befassen, bisher brauchte ich das nicht.
Ich habe 'ne Menge Blödsinn probiert. Deine Lösung ist dabei noch recht einfach.

Wie würdest du den JTable-Inhalt zoomen?
Ich habe das dumpfe Gefühl, dass ich auch hier über das Ziel hinaus geschossen bin. Ich arbeite auch mit einem JSpinner, der Prozentwerte anzeigt.
Diese rechne ich in float-Werte um, welche ich der Methode setZoom() in meinem JTable-Typ übergebe.

    public void setZoom(float zoomFactor) {
        FontMetrics fm = this.getFontMetrics(this.getFont());
        this.setFont(this.getFont().deriveFont(originalSize * zoomFactor));
        super.setRowHeight((int)(originalRowHeight * zoomFactor));
    }

Das funktioniert zwar. Aber vielleicht geht es noch einfacher?

Naja FontMetrics brauchst du in dem Fall nicht wirklich. Das wird erst notwendig, wenn du z.B die Breite der Columns an den Inhalt anpassen willst:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.geom.Rectangle2D;
import java.util.Enumeration;
import java.util.Vector;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.*;

public class TableZoom
{	
	
	class MyCellEditor extends DefaultCellEditor
	{

		public MyCellEditor(JTextField textField)
		{
			super(textField);
		}
		
		public void setFont(Font f)
		{
			this.getComponent().setFont(f);
		}
		
	}
	
	public void createAndShowGUI()
	{
		EventQueue.invokeLater(new Runnable()
		{
			
			@Override
			public void run()
			{
				JFrame frame = new JFrame();
				Vector<String> v = new Vector<String>();
				v.add("Hallo");
				v.add("Welt");
				final JTable table = new JTable(new DefaultTableModel(v, 3));
				table.getModel().addTableModelListener(new TableModelListener(){

					@Override
					public void tableChanged(TableModelEvent e)
					{
						resizeTableColumns(table);
					}
					
				});
				final MyCellEditor editor= new MyCellEditor(new JTextField());
				
				for(int i=0;i<table.getColumnCount();i++)
				{
					table.getColumnModel().getColumn(i).setCellEditor(editor);
				}
				
				table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
				
				frame.add(new JScrollPane(table), BorderLayout.CENTER);
				
				JPanel panel = new JPanel();
				panel.add(new JLabel("Schriftgröße:"));
				final SpinnerNumberModel model = new SpinnerNumberModel();
				JSpinner spinner = new JSpinner(model);
				
				model.setValue(table.getTableHeader().getFont().getSize());
				
				spinner.addChangeListener(new ChangeListener()
					{
						
						@Override
						public void stateChanged(ChangeEvent arg0)
						{
							Font font = table.getTableHeader().getFont().deriveFont(model.getNumber().floatValue());
							table.getTableHeader().setFont(font);
							table.setFont(font);
							editor.setFont(font);
							
							resizeTableColumns(table);
							table.revalidate();
						}
					});
				panel.add(spinner);
				
				frame.add(panel, BorderLayout.SOUTH);
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.pack();
				frame.setVisible(true);
			}
		});
	}
	
	public static void main(String args[])
	{
		TableZoom t = new TableZoom();
		t.createAndShowGUI();
	}
	
	private void resizeTableColumns(JTable table)
	{
		TableColumnModel columnModel = table.getColumnModel();
		TableModel tableModel = table.getModel();
		JTableHeader header = table.getTableHeader();
		FontMetrics headerFontMetrics = table.getFontMetrics(table.getTableHeader().getFont());
		FontMetrics tableFontMetrics = table.getFontMetrics(table.getFont());
		
		table.setRowHeight(tableFontMetrics.getHeight());
		
		Enumeration<TableColumn> e = columnModel.getColumns();
		while (e.hasMoreElements())
		{
			TableColumn c = e.nextElement();
			String headerVal = c.getHeaderValue().toString();
			Rectangle2D bounds = headerFontMetrics.getStringBounds(headerVal, table.getGraphics());
			
			int preferredWidth = (int) (bounds.getWidth()*1.5);
			
			for (int j = 0; j < tableModel.getRowCount(); j++)
			{
				Object val = tableModel.getValueAt(j, c.getModelIndex());
				if (val != null)
				{
					bounds = tableFontMetrics.getStringBounds(val.toString(), table.getGraphics());
					if (preferredWidth < bounds.getWidth())
					{
						preferredWidth = (int) (bounds.getWidth()+10);
					}
				}
			}
			c.setPreferredWidth(preferredWidth);
		}
	}
}```

Danke, das werde ich mal in Ruhe auseinander nehmen und sehen, was du da genau gemacht hast.
Das kommt jedenfalls dem ziemlich nahe, was ich erreichen möchte.