दिलचस्प पोस्ट
NSString को NSDate में परिवर्तित करना (और वापस दोबारा) स्विफ्ट 4 समाधान उपलब्ध है सीएसएस मिनेफ़ायर के लिए कोई सिफारिशें? आप बाहरी जावा वर्गों को गतिशील रूप से कैसे संकलित और लोड करते हैं? घुंघराले ब्रेसिज़ में सी कोड के ब्लॉक क्यों संलग्न हैं? "X / i $ pc" के साथ GDB में 16-बिट x86 बूट सेक्टर कोड को कैसे अलग करना है? इसे 32-बिट के रूप में माना जाता है जावा, दो तिथियों के बीच के दिनों की संख्या की गणना करें किसी पृष्ठ पर खर्च किए गए समय को मापने के लिए कैसे? क्यों है UICollectionViewCell के आउटलेट शून्य? जावास्क्रिप्ट का उपयोग करते हुए फ़ाइल (उपयोगकर्ता निर्देशिका) में कैसे लिखें? कोयोनर 2 @ व्यूबिल * एनजीआईफ़ में नोटपैड ++ में सीआरएलएफ खोजें JVM की डिफ़ॉल्ट एन्कोडिंग क्या है? एक जावा विधि से कई ऑब्जेक्ट कैसे लौटाएंगे? C # में स्ट्रिंग फ़ॉर्मेटिंग नामांकित एक्सएसएस के खिलाफ आम सुरक्षा क्या हैं?

बड़े स्विंग घटक छपाई

मेरे पास JScrollPane (यह सिर्फ एक जेपीएनएल है, जेटेबल उप-वर्ग नहीं है) के अंदर एक कस्टम तालिका के साथ एक स्विंग फ़ॉर्म है, और मैं इसे प्रिंट करने की कोशिश कर रहा हूं। अगर मैं प्रिंटर पर पूरी फ़्रेम भेजता हूं, तो स्क्रॉल फलक बंद हो जाता है, और अगर मैं स्क्रॉल फलक की सामग्री के आकार को फ्रेम का आकार बदलता हूं, तो किसी प्रकार की आंतरिक बाधा JFrame को करीब 1100 पिक्सल लंबा से अधिक हो जाती है

एक अन्य विकल्प रूट जेफैम को संलग्न किए बिना संवाद के कंटेंट फलक बनाने के लिए होगा, क्योंकि उस स्थिति में जेपीएनएल का आकार सीमित नहीं है। लेकिन घटकों को स्वयं को बाहर रखने और उनके उचित आकारों के आकार में लाने के लिए, मुझे पैनल को प्रदर्शित करने योग्य बनाने की आवश्यकता होती है, जिसका मतलब है कि बहुत कम से कम इसे JFrame में जोड़कर और JFrame.pack () को बुलाते हैं, लेकिन फिर, 1100 पिक्सेल सीमा वापस आती है

घटक मुद्रित करने के लिए यहां मेरा कोड है:

public static void print(final Component comp) { final float SCALE = .5f; PrinterJob job = PrinterJob.getPrinterJob(); job.setPrintable(new Printable() { public int print(Graphics g, PageFormat pf, int page) throws PrinterException { if (page * pf.getImageableHeight() >= SCALE * comp.getHeight()) return NO_SUCH_PAGE; ((Graphics2D)g).translate(pf.getImageableX(), pf.getImageableY() - page * pf.getImageableHeight()); ((Graphics2D)g).scale(SCALE, SCALE); comp.printAll(g); return PAGE_EXISTS; } }); if (job.printDialog()) try { job.print(); } catch (PrinterException ex) {} } 

अगर मैं ऐसा करता हूं, तो घटक का आकार शून्य है:

 JPanel c = createPanel(); // This JPanel has a JScrollPane in it with its // preferredSize equal to that of its viewport component // (which is not what I do to show the dialog normally) print(c); 

अगर मैं ऐसा करता हूं, तो घटक का सही आकार होता है, लेकिन ठोस भूरे रंग के रूप में प्रिंट होता है क्योंकि उप-घटकों को नहीं रखा गया है:

 JPanel c = createPanel(); c.setSize(c.getPeferredSize()); print(c); 

ये कोई फर्क नहीं पड़ता है:

 JPanel c = createPanel(); c.validate(); c.revalidate(); c.repaint(); print(c); 

यह पैनल को बड़ा बनाता है, लेकिन यह लगभग एक पृष्ठ और एक आधे बड़े (1100px) पर बंद हो जाता है:

 JPanel c = createPanel(); JFrame f = new JFrame(); f.setContentPane(c); f.pack(); print(c); 

मैं यहाँ क्रमांतरों से बाहर चल रहा हूँ क्या किसी को भी या तो (ए) कैसे ओएस अधिकतम फ्रेम आकार को बदलने के लिए, (बी) एक ऑफ स्क्रीन घटक लेआउट और पेंट करने के लिए कैसे, या (सी) कैसे यह पेंट करने के बिना, स्विंग घटक सीधे मुद्रित करने के लिए? । मदद की सराहना की है

वेब के समाधान से एकत्रित समाधान "बड़े स्विंग घटक छपाई"

अपने कस्टम पैनल के paint() विधि का उपयोग करते हुए, सामग्री को एक BufferedImage में प्रस्तुत करना।

परिशिष्ट: यह दृष्टिकोण का एक अधिक संपूर्ण उदाहरण है, जो आधे से घटक को तराजू करता है। आप अपने वास्तविक आवेदन में पहलू अनुपात को संरक्षित करना चाहेंगे।

यहां छवि विवरण दर्ज करें

 import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; /** @see https://stackoverflow.com/questions/7026822 */ public class PanelPaint extends JPanel { private static final double SCALE = 0.5; public PanelPaint() { super(new GridLayout(0, 1)); final MyPanel panel = new MyPanel(); JScrollPane scroll = new JScrollPane(panel); scroll.getViewport().setPreferredSize(new Dimension(320, 240)); this.add(scroll); EventQueue.invokeLater(new Runnable() { @Override public void run() { add(new JLabel(new ImageIcon(createImage(panel)))); } }); } private BufferedImage createImage(MyPanel panel) { Dimension size = panel.getPreferredSize(); BufferedImage image = new BufferedImage( size.width, size.height, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = image.createGraphics(); panel.paint(g2d); g2d.dispose(); AffineTransform at = new AffineTransform(); at.scale(SCALE, SCALE); AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); return scaleOp.filter(image, null); } private static class MyPanel extends JPanel { private static final int N = 16; public MyPanel() { super(true); this.setLayout(new GridLayout(N, N)); for (int i = 0; i < N * N; i++) { this.add(new JLabel(String.valueOf(i) + " ")); } } } private void display() { JFrame f = new JFrame("PanelPaint"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new PanelPaint().display(); } }); } } 

जैसा कि यहां दिखाया गया है , आप गंतव्य की MediaPrintableArea फिट करने के लिए प्रस्तुतीकरण को स्केल कर सकते हैं, या सामग्री प्राप्त करने के लिए getSubimage() का प्रयोग करें पृष्ठों में वांछित रूप में विभाजित कर सकते हैं

आपको स्कॉलपैन के बिना घटक प्रिंट करना होगा। स्क्रॉलपैन हमेशा केवल दृश्य सामग्री प्रिंट करेगा

यदि आप createPanel () विधि तक पहुंच की इजाजत देते हैं, और इस विधि से पैनल में केवल स्क्रॉलपैन है, तो आप उस घटक को प्राप्त कर सकते हैं, जो स्क्रॉलपैन में निम्न प्रकार से है:

 JPanel panel = createPanel(); print(((JScrollPane)panel.getComponents()[0]).getViewport()); 

लेकिन यदि आपका डेटा तालिका के रूप में प्रारूप है, तो आप JTable का उपयोग करने के बारे में भी कर सकते हैं। JTable के पास एक शक्तिशाली प्रिंट () विधि है। http://download.oracle.com/javase/tutorial/uiswing/misc/printtable.html पर अधिक infos

चूंकि JScrollPane में एक घटक मनमाने ढंग से आकार ले सकता है, इसके बाद भी इसे डिस्प्लेबल बनाया जा सकता है, मेरा समाधान यह कोशिश करना है:

 JPanel c = createPanel(); JFrame f = new JFrame(); f.getContentPane().add(new JScrollPane(c)); f.pack(); print(c); 

ताकि मैं जेपीएनेल को बिना आकार के एक JFrame के अधिकतम आकार तक सीमित कर सकता हूं। इसमें "असीमित रिज़ॉल्यूशन" भी है, जो कि टंकशॉड्ड जैसे द्वि-बफरिंग के बिना घटकों को सीधे प्रिंट करने से प्राप्त फोंट और चीजों को देखते हैं