Zeilenubruch im Spaltenname einer JTable

Athro

Mitglied
Hallo,
ich habe die Spaltengröße meiner Tabelle mit der folgende Funktion erstellt, die Spaltengrö-ße werden richtig erzeugt aber die Spaltennamen sind zu lang, deshalb habe ich eine private Funktion erstellt die mir die Spaltennamen an die Spaltengröße anpasst, mit dem Debuger scheint das richtig, aber die Tabelle zeigt die angepassten Spaltennamen nicht?
Wie kann ich die Spaltennamen an die Spaltengröße anpassen bzw. kann ich ein Zeilenum-bruch im Spaltenname einsetzen?

Code:
     private void setDefaultTableColumn(){
       int fenBreite = getFensterBreite();
       int zahlSpalten = spaltenNamen.length;
       int kleineSpaltePix = pixelProStelle * kleineSpalStell;
       // 10 kleine Spalten
       int groseSpaltenPix = (fenBreite - (zahlKleineSpal * kleineSpaltePix)) / zahlGrosseSpal;
       String spaltName = "";
       int spalteBreite = 0;
       TableColumn col = new TableColumn();
       int j = 0;
       for (int i = 0; i < zahlSpalten; ++i) {
         if (i == kleineSpalten[j]) {
           spalteBreite = kleineSpaltePix;
           if (j < kleineSpalten.length - 1)
             j++;
         }
         else {
             spalteBreite = groseSpaltenPix;
         }
         spaltName = spaltenNamen[i];
         if (spaltName.length() > spalteBreite)
           spaltenNamen[i] = zerlegeZelle(spaltName, spalteBreite);           meinTabelle.getColumnModel().getColumn(i).setPreferredWidth(spalteBreite); 
       }
     }
    private String zerlegeZelle(String inputStr, int zeleBreite){
      String OutputStr = "", teilStr = "";
      int i = 0, inputLenght = 0, restStrLength = 0;
      inputLenght = inputStr.length();
      restStrLength = inputLenght;
      String trenZeichen = "\n";
      // 6 Pixel = 1 Buchstab
      zeleBreite = zeleBreite;

      while (restStrLength > zeleBreite){
        // Teile die Input String in der Breite-2, weil es wird am Endes
        // des Teilstringes -\n eingefugt.
        teilStr = inputStr.substring(i, i+zeleBreite-2);
        // Ist das letze BuchStab ein Lehrzeichen oder "-" braucht man beim Zeilenumbruch keine "-" am Ende
        // des Wortes einzufügen.
        if (teilStr.charAt(teilStr.length()-1) == '\r' || teilStr.charAt(teilStr.length()-1) == ' ' ||
            teilStr.charAt(teilStr.length()-1) == '-')
            trenZeichen = "\n";
        else
            trenZeichen = "-\n";
          OutputStr += teilStr.trim() + trenZeichen;
          i += zeleBreite-2;
          restStrLength = inputLenght - i;
      }
      if (restStrLength > 0)
        OutputStr += inputStr.substring(i, i+restStrLength).trim();
      return OutputStr;
    }
 
Hallo Athro,

hier ein möglicher Ansatz:

Java:
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.PrintStream;

import javax.swing.*;
import javax.swing.text.BadLocationException;
import javax.swing.text.Utilities;

public class WrappedTableHeadersExample extends JFrame{

	private static PrintStream o = System.out;

	private String[][] rowData = { { "A", "1", "Smart" }, { "B", "2","A3"},{ "C", "3","Corsa"} };

	private String[] columnNames = { "Alphabet Buchstaben",
			"Zahlen eins zwei drei vier fünf sechs", "Autos Mercedes Audi" };

	private JTable table = new JTable(rowData, columnNames);

	private int heightofTableHeader = 0;
	
	public WrappedTableHeadersExample() {
		super("WrappedTableHeadersExample");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationByPlatform(true);
		this.setAlwaysOnTop(true);
		this.setSize(400,300);
		this.addComponentListener(new ComponentAdapter(){
			public void componentResized(ComponentEvent e) {
				wrappTableHeaders();
			}
		});

		this.add(new JScrollPane(table));
		
		this.setVisible(true);
		
		wrappTableHeaders();
		
		table.updateUI();
	}

	public static void main(String[] args) {
		new WrappedTableHeadersExample();
	}

	public void wrappTableHeaders(){
		heightofTableHeader = 0;
		table.getColumnModel().getColumn(0).setHeaderValue(getWrappedText(0));
		table.getColumnModel().getColumn(1).setHeaderValue(getWrappedText(1));
		table.getColumnModel().getColumn(2).setHeaderValue(getWrappedText(2));
		table.getTableHeader().setPreferredSize(new Dimension(table.getTableHeader().getWidth(),heightofTableHeader));
		table.updateUI();
	}
	
	public String getWrappedText(int columnIndex) {
		JTextArea c = new JTextArea(table.getColumnName(columnIndex));
		c.setPreferredSize(new Dimension(table.getColumnModel().getColumn(columnIndex).getWidth(),100));
		c.setLineWrap(true);
		c.setWrapStyleWord(true);
		c.setFont(table.getFont());
		JWindow win = new JWindow();
		win.add(c);
		win.pack();
		
		int len = c.getDocument().getLength();
		int offset = 0;
		StringBuffer buf = new StringBuffer((int) (len * 1.30));
		String s = "";
		try {
			while (offset < len) {
				int end = Utilities.getRowEnd(c, offset);
				if (end < 0) {
					break;
				}
				end = Math.min(end + 1, len);
				s = c.getDocument().getText(offset, end - offset);
				buf.append(s);
				if (!s.endsWith("\n")) {
					buf.append('\n');
				}
				offset = end;
			}
		} catch (BadLocationException e) {
			e.printStackTrace();
		}
		
		s = buf.toString();
		
		c.setText(s);
		int height = c.getLineCount() * table.getFontMetrics(table.getFont()).getHeight();
		if (height > heightofTableHeader)
			heightofTableHeader = height;
		
		s = s.replaceAll("\n","<BR>");
		
		s = "<HTML><P ALIGN=\"CENTER\">" + s + "</P><HTML>";

		try {
			return s;
		} finally {
			buf = null;
			s = null;
			c = null;
			win = null;
		}
	}
}


Vg Erdal
 
Hallo Erdal,
ich habe dein Beispiel an meinem Code angepasst und es hat geklappt, Vielen Dank für dei-ne Hilfe.
mfg
Athro
 
Zurück