HTML Tabelle nur so lange erzeugen bis Höhe erreicht

internet

Top Contributor
Hallo zusammen,

ich möchte mir dynamisch eine HTML Tabelle erzeugen.
Um die Tabelle habe ich ein <div>.
Dieses <div> hat eine Höhe, also als Beispiel 10mm: <div height: 10mm>

Also das Gründgerüst sieht so aus:
Code:
<div height: 10mm>
   <table>
     <tr> 
       <td>
       <td>
     <tr>
....

Nun möchte ich in einer Schleife die Tabelle mit den Zeilen nur so lange generieren lassen, bis die Höhe erreicht wurde.

Wie kann ich so etwas machen? Ich komme leider gar nicht weiter.
 
Du musst natürlich wissen, wie hoch eine Zeile der Tabelle ist.
Dann ist das mit einer Schleife leicht realisierbar:

Java:
int zeilenhoehe = 10; 
int gesamthoehe = 100;
int aktuelleHoehe = 0;

while (aktuelleHoehe <= gesamtHoehe)
{
   System.out.println("<tr><td>Zeileninhalt</td></tr>");
   aktuelleHoehe = aktuelleHoehe + zeilenhoehe;
}
 
Ja das ist klar. Das Problem ist, dass ich die Zeile dynamisch erzeuge und somit eine Zeile auch einen Umbruch haben kann wenn der Text länger ist. Daher kann ich die Zeilenhöhe nicht fix angeben
 
Dann wird's deutlich komplizierter.
Du brauchst eine Render-Engine, der du in jedem Schleifendurchlauf die "bisherige Version" übergibst und danach abfragst/prüfst, wie viele Pixel dieser div denn nun Höhe hat.
Damit die Render-Engine aber passabel arbeiten kann, will sie eine "fertige Html-Seite", also _mit_ Tabellen-Abschluss usw. Eine solche Version müsstest du also auch noch "nebenher mitführen".
 
Java:
String getHtmlPage( int hoeheMM ) {
  String html_to_generate = "<html><body>\n<div><!-- height: " + hoeheMM + "mm -->\n<table>\n" ;
  String html_foot = "</table></div></body></html>";
  String html_test ;
  int table_height_mm ;

  do {
    html_to_generate += "<tr><td /></tr>" ;
    html_test = html_to_generate + html_foot ;
    // erzeuge/benutze Render-Engine auf html_test;
    // table_height_mm = render_engine.getTagVerticalSize( "<table>" ); // etwas entsprechendes eben
  } while( table_height_mm < hoeheMM );
  // jetzt ist html_to_generate evtl genau 1 <tr> zu hoch, also wieder entfernen;
  // dann restlichen Seiteninhalt anhaengen.
  return html_to_generate ;
}
In etwa sowas.
Eine Render-Engine ist im Prinzip das Herzstück eines Webbrowsers.
 
Zuletzt bearbeitet:
Weiss nicht, ob es was bringt, aber du könntest den Content in einen JavaFX WebView packen (muss aber angezeigt werden, sonst wird das nichts) und hinterher per JavaScript die Höhe auslesen. Aber trivial ist das nicht und sicher auch nicht performant, denn der WebView muss nach jeder Zeile geupdated werden - und der allerschnellste ist er auch nicht...
 
@arilou
Danke für Deine Antwort.
Aber wie sieht bei Dir die Methode getTagVerticalSize() aus?

Problem ist: Wie bekomme ich pro Schleifendurchlauf die Größe bzw. Höhe der Zeile?
Das ist eigentlich mein Hauptproblem - wie kann ich das lösen?

Für alles andere sehe ich aktuell kein Problem.
 
Problem ist: Wie bekomme ich pro Schleifendurchlauf die Größe bzw. Höhe der Zeile?
Das ist eigentlich mein Hauptproblem - wie kann ich das lösen?
Indem du nach jeder weiteren hinzugefügten Zeile das bisher erstellte Html-Dokument durch einen Webbrowser anzeigen lässt, und dann den Browser fragst "wie hoch ist die Tabelle denn jetzt?".

Anstelle eines kompletten Webbrowsers nimmst du nur dessen "Kernprogramm", die "Render-Engine". Die kann "ein Html-Dokument anzeigen", ohne es auf dem Bildschirm anzuzeigen, also "verborgen". Eine Methode ".getTagVerticalSize()" (oder so ähnlich) muss diese Engine anbieten - vermutlich heißt sie (ganz) anders.

D.h. du musst dir ergoogeln oder sonstwie herausfinden, was es für Render-Engines gibt, welche davon sich halbwegs einfach in dein Programm einbauen lässt, wie man sie aufruft, wie man von ihr Auskünfte über das gerenderte Ergebnis abfragt, ...

Das hört sich kompliziert und nach viel Arbeit an. Und ist es auch - sowohl kompliziert als auch viel Arbeit.

Außerdem stimmt das Ergebnis dann auch nur (halbwegs sicher) für Webbrowser, die auf genau dieser Engine beruhen. Andere Webbrowser zeigen das Ergebnis ggf. etwas anders an, weil sie z.B. CSS-Angaben ein wenig anders interpretieren, oder eine andere Schriftart verwenden, oder der Benutzer die Anzeige auf "125% Größe" eingestellt hat, oder oder oder.

Mich wundert immer wieder, wie Menschen einfach nicht verstehen wollen, dass Html gerade nicht dafür geschaffen wurde, "überall gleich" angezeigt zu werden... Dafür gibt's PDF.
 
arilou hat gesagt.:
Außerdem stimmt das Ergebnis dann auch nur (halbwegs sicher) für Webbrowser, die auf genau dieser Engine beruhen. Andere Webbrowser zeigen das Ergebnis ggf. etwas anders an, weil sie z.B. CSS-Angaben ein wenig anders interpretieren, oder eine andere Schriftart verwenden, oder der Benutzer die Anzeige auf "125% Größe" eingestellt hat, oder oder oder.

Mich wundert immer wieder, wie Menschen einfach nicht verstehen wollen, dass Html gerade nicht dafür geschaffen wurde, "überall gleich" angezeigt zu werden... Dafür gibt's PDF.
Dem stimme ich völlig zu!

---------------------------------------------------------------------

arilou hat gesagt.:
Indem du nach jeder weiteren hinzugefügten Zeile das bisher erstellte Html-Dokument durch einen Webbrowser anzeigen lässt, und dann den Browser fragst "wie hoch ist die Tabelle denn jetzt?".

Anstelle eines kompletten Webbrowsers nimmst du nur dessen "Kernprogramm", die "Render-Engine". Die kann "ein Html-Dokument anzeigen", ohne es auf dem Bildschirm anzuzeigen, also "verborgen". Eine Methode ".getTagVerticalSize()" (oder so ähnlich) muss diese Engine anbieten - vermutlich heißt sie (ganz) anders.

D.h. du musst dir ergoogeln oder sonstwie herausfinden, was es für Render-Engines gibt, welche davon sich halbwegs einfach in dein Programm einbauen lässt, wie man sie aufruft, wie man von ihr Auskünfte über das gerenderte Ergebnis abfragt, ...

Das hört sich kompliziert und nach viel Arbeit an. Und ist es auch - sowohl kompliziert als auch viel Arbeit.
Auch hier stimme ich wieder zu. Ich hatte nur weiter oben dazu bereits eine Idee gepostet. Ich zitiere mich daher mal selbst, um es noch einmal vorzikramen...
meinereiner hat gesagt.:
Weiss nicht, ob es was bringt, aber du könntest den Content in einen JavaFX WebView packen (muss aber angezeigt werden, sonst wird das nichts) und hinterher per JavaScript die Höhe auslesen. Aber trivial ist das nicht und sicher auch nicht performant, denn der WebView muss nach jeder Zeile geupdated werden - und der allerschnellste ist er auch nicht...
Ich würde es einfach mal versuchen. Wie gesagt: Ob das eine gerader optimaler Ansatz ist, weiss ich nicht, aber es ist eine Idee.
Bezüglich der Performance fällt mir noch gerade ein, dass du vielleicht auch eine Dependency zu SWT (JAR des SWT-Interfaces selbst, sowie noch zu der Platform - z.B. swt-win32.jar oder so) nutzen könntest. Dort wird der System-Browser (oder Mozilla oder WebKit - wenn man es so konfiguriert) vom Browser-Widget gewrappt. Könnte also vielleicht performanter sein - aber noch frikeliger.
 

Zurück
Oben