JTable - Drucken

Status
Nicht offen für weitere Antworten.

Sancho

Aktives Mitglied
Hallo zusammen,
ja ich weiß, es gibt schon mehrere Threads zu diesem Thema. Aber nix konnte mir weiterhelfen.

Ich hab eine Tabelle mit 5 Spalten.
Drucke ich diese werden aufgrund ihrer Breite zwei Seiten gedruckt. Die erste Seite mit den ersten drei Spalten und die zweite dementsprechend mit den letzten zwei Spalten. Im Grunde sind die letzten zwei Seiten irrelevant. Daher erzeuge ich vor dem Drucken eine neue Tabelle mit neuem TableModel. Doch wenn ich dann auf drucken gehe, wird nur ein leeres Rechteck gedruckt.

Hier ein bisschen Code:
Code:
table.print(JTable.PrintMode.NORMAL);
Hier funktioniert's bei der Table mit 5 Spalten.


Code:
JTable printTable = new JTable(new PrintTableModel());
			
printTable.print(JTable.PrintMode.NORMAL);

Hier bei der Tabelle mit 3 Spalten wird nur ein leeres Rechteck gedruckt.

Kann es sein das die Druckfunktion bei Java noch nicht so ausgereift ist?
 
Sancho hat gesagt.:
...Kann es sein das die Druckfunktion bei Java noch nicht so ausgereift ist?
Die zu druckende JTable muss sichtbar sein:
Code:
       TableModel save = table.getModel();
        table.setModel(printTableModel);
        try {
            table.print(JTable.PrintMode.NORMAL);
        } catch (PrinterException ex) {
            ex.printStackTrace();
        }
        table.setModel(save);
 
Bist du dir sicher? Das war nämlich auch meine Vermutung, aber ich hab in die API geschaut, und da steht, man könnte JTables sogar im Headless Mode drucken, wenn man die Druckdialoge nicht anzeigen lässt. Und im Headless Mode kann die JTable ja gar nicht sichtbar sein.
 
Illuvatar hat gesagt.:
Bist du dir sicher? Das war nämlich auch meine Vermutung, aber ich hab in die API geschaut, und da steht, man könnte JTables sogar im Headless Mode drucken, wenn man die Druckdialoge nicht anzeigen lässt. Und im Headless Mode kann die JTable ja gar nicht sichtbar sein.
Der Druckdialog kommt jedenfalls auch bei einer unabhängigen JTable, gedruckt wird aber nur ein leeres Rechteck.
Ich bin mir allerdings nicht sicher was hier mit headless mode gemeint ist :bahnhof:
 
jetzt druckt er zwar wieder, aber nur die ersten zwei Spalten auf eine Seite und die dritte Spalte auf die nächste ;-(

Kann ich ihn irgendwie dazu zwingen die drei Spalten auf eine Seite zu drucken.

Wenn ich
table.print(JTable.PrintMode.FIT_WIDTH);
schreibe, druck er sogar nur die erste Spalte auf ein Blatt
 
@Sancho: Kann dir leider nicht helfen... ???:L

@André: Headless Mode bedeutet, dass man die JVM mit -Djava.awt.headless=true (oder so ähnlich 😉) startet. Daraufhin wirft jede Methode, die irgendetwas UI-technisches macht, eine HeadlessException.
API:HeadlessException hat gesagt.:
Thrown when code that is dependent on a keyboard, display, or mouse is called in an environment that does not support a keyboard, display, or mouse.
 
Sancho hat gesagt.:
...Kann ich ihn irgendwie dazu zwingen die drei Spalten auf eine Seite zu drucken...
Code:
       TableModel save = table.getModel();
        int resizeMode = table.getAutoResizeMode();
        table.setModel(printTableModel);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        for (int i = 0; i < 3; i++) {
            table.getColumnModel().getColumn(i).setPreferredWidth(150);
        }
        table.validate();
        try {
            table.print(JTable.PrintMode.NORMAL);
        } catch (PrinterException ex) {
            ex.printStackTrace();
        }
        table.setModel(save);
        table.setAutoResizeMode(resizeMode);
 
Illuvatar hat gesagt.:
...Headless Mode bedeutet, dass man die JVM mit -Djava.awt.headless=true (oder so ähnlich 😉) startet.
Daraufhin wirft jede Methode, die irgendetwas UI-technisches macht, eine HeadlessException...
Danke für die Info, ist sicher gut zu wissen.
Aber ich weiss nicht so richtig wie ich das im vorliegenden Fall anwenden kann.
Ist allerdings jetzt auch nicht mehr so wichtig weil es ja kein Problem mehr ist, die JTable zu drucken.
 
Das bezog sich darauf:
Du meintest, die JTable muss sichtbar sein, damit sie gedruckt werden kann. Laut API kann eine JTable aber auch im Headless Mode gedruckt werden. In diesem kann sie aber sicher nicht sichtbar sein. Also kann es IMO eigentlich keine Probleme machen, dass eine JTable nicht sichtbar ist beim Drucken, auch wenn ich das bisher weder mit noch ohne sichtbar probiert habe.
Ist allerdings jetzt auch nicht mehr so wichtig weil es ja kein Problem mehr ist, die JTable zu drucken. 😀
 
also das ist zwar nicht mehr so wichtig, aber was noch ein bisschen stört ist das der bedruckbare Bereich etwas klein erscheint. Ich hab jetzt 2 Stunden gesucht wie ich das änder. Hab mir die Klassen Paper, Pageformat etc. angeschaut. Dort kann man já den Bereich einstellen. Aber wie übergebe ich dann den Bereich dem print ?
es gibt ja leider keine Methode wie
component.print(Pageformat pf); oder component.print (Paper paper);

Weiß da vielleicht jemand noch weiter ?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben