आपके पास दो संभावित विकल्प हैं, आप कोशिश कर सकते हैं और कॉलम का आकार बदल सकते हैं ताकि उपलब्ध पृष्ठ चौड़ाई में समान रूप से वितरित हो या आप परिणामी आउटपुट यूपी को स्केल कर सकें ताकि यह पृष्ठ पर फिट हो सके।
स्केलिंग
डिफ़ॉल्ट रूप से, TablePrintable
केवल नीचे स्केल करता है, एक JTable
के लिए बाध्य करता है जो उपलब्ध पृष्ठ आकार (चौड़ाई) में फ़िट होने के लिए बहुत बड़ा है। आप इसे यूपी में भी स्केल करने की अनुमति देने के लिए इसे बदल सकते हैं।
स्केल की गणना करने वाले कोड का टुकड़ा print
. के भीतर होता है TablePrintable
. का क्लास और ऐसा दिखता है...
double sf = 1.0D;
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {
// if not, we would have thrown an acception previously
assert imgWidth > 0;
// it must be, according to the if-condition, since imgWidth > 0
assert totalColWidth > 1;
sf = (double) imgWidth / (double) totalColWidth;
}
जिस भाग में हम रुचि रखते हैं वह है if
स्टेटमेंट, जिसमें लिखा है, "अगर प्रिंटमोड FIT_WIDTH के बराबर है और TotalColWidth पेज की चौड़ाई से अधिक है"... हम इसे ""अगर प्रिंटमोड FIT_WIDTH के बराबर है" पढ़ने के लिए बदलना चाहते हैं...
आप बदल सकते हैं
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {
करने के लिए
if (printMode == JTable.PrintMode.FIT_WIDTH) {
जो अब TablePrintable
. को अनुमति देगा तालिका UP और DOWN दोनों को स्केल करने के लिए...
जिसके परिणामस्वरूप कुछ ऐसा होगा...
- शीर्ष स्क्रीन आउटपुट है
- बाएं वर्तमान परिणाम है
- सही परिणाम स्केल किया गया है
कॉलम का आकार बदलें
यह थोड़ा और मुश्किल है और इसे कभी भी JTable
. पर लागू नहीं किया जाना चाहिए जो पहले से ही स्क्रीन पर है, क्योंकि यह वास्तव में प्रदर्शित होने के तरीके के साथ खिलवाड़ करेगा...
मूल रूप से, जब तालिका मुद्रित होती है, तो हम कॉलम की चौड़ाई को ओवरराइड करने जा रहे हैं ताकि उन्हें पूरे पृष्ठ पर समान स्थान दिया जा सके...
सबसे पहले, हमें totalColWidth
change को बदलना होगा TablePrintable
. में से...
private final int totalColWidth;
करने के लिए
private int totalColWidth;
क्योंकि हमें शुरू होने के बाद मान को संशोधित करने में सक्षम होना चाहिए...
इसके बाद, हमें यह निर्धारित करने के लिए एक ध्वज की आवश्यकता है कि कॉलम संशोधित किए गए हैं या नहीं, क्योंकि हर बार print
उनके आकार को बार-बार अपडेट करना बेकार है। कहा जाता है।
private boolean updateColumnWidths;
TablePrintable
. के क्षेत्रों में (उदाहरण के लिए, private final Font footerFont;
)
अब, जब print
कहा जाता है, हमें कई निर्णय लेने की आवश्यकता है...
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
// for easy access to these values
final int imgWidth = (int) pageFormat.getImageableWidth();
final int imgHeight = (int) pageFormat.getImageableHeight();
if (imgWidth <= 0) {
throw new PrinterException("Width of printable area is too small.");
}
// Have we modified the column widths yet??
if (!updateColumnWidths) {
// Only update the column widths if the current total column width
// is less then the available imgWidth (page width)
if (totalColWidth < imgWidth) {
// Calculate the required column width to allow the columns to
// span the page...
int columnCount = table.getColumnCount();
int columnWidth = (int) (imgWidth / (float) columnCount);
TableColumnModel columnModel = table.getColumnModel();
// Update the columns...
for (int col = 0; col < columnModel.getColumnCount(); col++) {
TableColumn tc = columnModel.getColumn(col);
tc.setMinWidth(columnWidth);
tc.setMaxWidth(columnWidth);
tc.setPreferredWidth(columnWidth);
tc.setWidth(columnWidth);
}
// Update the totalColWidth, this should prevent
// any scaling been applied
totalColWidth = columnModel.getTotalColumnWidth();
}
updateColumnWidths = true;
}
//...
जो कुछ इस तरह उत्पन्न करता है...