JTextArea in JTable und die optimale Zeilenhöhe

Romsl

Erfahrenes Mitglied
[BRAUCHE HILFE] JTextArea in JTable und die optimale Zeilenhöhe

Hi,

bin schon seit Tagen dran irgendeine Lösung zu finden, komme aber auf kein aktzeptables Resultat.

Wenn ich die Zeilenhöhe in dieser überschriebenen Methode setze dann habe ich eine Endlosschleife produziert. Suche auch schon vergeblich nach einem Listener oder ähnlichem.

Ich habe eine JTextArea in einem JTable Feld. Jetzt möchte ich, dass sich die Zeilenhöhe genau an diese JTextArea anpasst. Ich weiß aber nicht wo ich dies setzen kann ohne eine Endlosschleife zu bekommen, wie ich dies bemerke wann die Zeilenhöhe neu berechnet werden muss.

Code:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                                                 boolean hasFocus, int row, int column) {

    if (isSelected) {
      setForeground(table.getSelectionForeground());
      setBackground(table.getSelectionBackground());
    }
    else {
      setForeground(table.getForeground());
      setBackground(table.getBackground());
    }
    setFont(table.getFont());
    if (hasFocus) {
      setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
      if (table.isCellEditable(row, column)) {
        setForeground(UIManager.getColor("Table.focusCellForeground"));
        setBackground(UIManager.getColor("Table.focusCellBackground"));
      }
    }
    else {
      setBorder(new EmptyBorder(1, 2, 1, 2));
    }
    setText((value == null) ? "" : value.toString());

    String objString = (String)value;

     if((objString.length() % 20) >= 1) {
       table.setRowHeight(row, (int) (objString.length() / 20) * 15);
     }
     setText(objString);

     //Wenn ich die Zeilenhöhe in dieser Methode setze habe ich eine Endlosschleife
     System.out.println("*");

    return this;
  }

Bin wirklich dankbar über jede noch so kleine Hilfe.

Romsl
 
Zuletzt bearbeitet:
Re: [BRAUCHE HILFE] JTextArea in JTable und die optimale Zeilenhöhe

Original geschrieben von Romsl
Hi,
bin schon seit Tagen dran irgendeine Lösung zu finden, komme aber auf kein aktzeptables Resultat.

Wenn ich die Zeilenhöhe in dieser überschriebenen Methode setze dann habe ich eine Endlosschleife produziert. Suche auch schon vergeblich nach einem Listener oder ähnlichem.

Ich habe eine JTextArea in einem JTable Feld. Jetzt möchte ich, dass sich die Zeilenhöhe genau an diese JTextArea anpasst. Ich weiß aber nicht wo ich dies setzen kann ohne eine Endlosschleife zu bekommen, wie ich dies bemerke wann die Zeilenhöhe neu berechnet werden muss.

Bin wirklich dankbar über jede noch so kleine Hilfe.

Romsl

Hm, evtl. in der setValueAt(...) Methode? Sorry, hab derzeit keine Zeit, mich mit so einem Problem länger und intensiver auseinander zu setzen.
 
Die Ursache für die Endlosschleife ist klar: die Methode setRowHeight() von der JTable bewirkt, dass die Tabelle neu gerendert wird, und da kommt Dein Renderer wieder zum Einsatz und ruft nochmal die Methode setRowHeight() auf, usw...

Probiere doch die Höhe nicht auf die gesamte Tabelle, sondern auf das jeweilige RendererComponent zu setzen. Allerdings weiß ich nicht ob es was bewirkt.
 
Original geschrieben von Vincentius
Die Ursache für die Endlosschleife ist klar: die Methode setRowHeight() von der JTable bewirkt, dass die Tabelle neu gerendert wird, und da kommt Dein Renderer wieder zum Einsatz und ruft nochmal die Methode setRowHeight() auf, usw...

Stimmt auffallend. Wie wäre es prinzipiell, sich im Renderer die RowHeight zu jeder Row zu merken und nur dann neu zu setzen, wenn sie sich auch verändert hat?
 
Wie wäre es prinzipiell, sich im Renderer die RowHeight zu jeder Row zu merken und nur dann neu zu setzen, wenn sie sich auch verändert hat?

Genau das hab ich auch schon versucht. Komischerweise wird bei mir immer der Wert für das selektierte Element dann gespeichert und wenn ich das selbe auf einem anderen Element mache wird mir genau dieser Wert mit den aktuellen überschrieben. Somit hab ich nie verschiedene Werte zu den jeweiligen Elementen.

Hoffe man kanns verstehen, aber weiß mich im Moment nicht besser auszudrücken.

Danke
 
Original geschrieben von Romsl
Genau das hab ich auch schon versucht. Komischerweise wird bei mir immer der Wert für das selektierte Element dann gespeichert und wenn ich das selbe auf einem anderen Element mache wird mir genau dieser Wert mit den aktuellen überschrieben. Somit hab ich nie verschiedene Werte zu den jeweiligen Elementen.

Danke

Dann speicherst Du wohl falsch, schliesslich bekommst Du doch zur eindeutigen Identifizierung bei

getTableCellRendererComponent(...)

alles übergeben.
 
Zurück