2011-08-31 13 views
6

मैंने कुछ समय पढ़ा और प्रयोग किया है, और कुछ दृष्टिकोणों के साथ आ गया है, लेकिन उनमें से कोई भी पूरी तरह से काम करने के लिए नहीं मिला है, इसलिए मैं जानना चाहता हूं कि स्विंग प्रोग्रामर और अधिक अनुभवी क्या करेंगे।जेपीनल पर एक घटक को ओवरले, आकार बदलने और केंद्र कैसे करें?

मेरे आवेदन की मुख्य विंडो में जेपीनल का एक कस्टम उप प्रकार है, जिसका उपयोग गणितीय फ़ंक्शन से गणना की गई छवि को प्रदर्शित करने के लिए किया जाता है। इसमें गणना करने में कुछ समय लग सकता है, इसलिए ऐसा होने पर मैं एक टेक्स्ट संदेश और पैनल के बीच में एक प्रगति पट्टी प्रदर्शित करता हूं। जब पैनल का आकार बदलता है, तो शायद पैनल और चौड़ाई दोनों को उचित रूप से आकार बदलने के लिए, पैनल की चौड़ाई के निरंतर अंश का उपयोग करना चाहूंगा।

इस समय मेरे पास एक और जेपीनल सबटाइप है जिसमें टेक्स्ट और प्रगति पट्टी है, और मैं मुख्य पैनल में यह "प्रगति पैनल" जोड़ता हूं, और जब आवश्यक हो तो इसे दृश्यमान सेट करता हूं। मुख्य पैनल में कोई अन्य घटक नहीं होता है, लेकिन इसकी अपनी पेंट कॉम्पोनेंट() विधि है जो किसी अन्य वर्ग से प्राप्त BufferedImage प्रदर्शित करने के लिए होती है। ,

  • प्रगति पैनल जब यह होना चाहिए दिखाई हमेशा नहीं है शायद कोड है कि स्पष्ट रूप से यह सुनिश्चित करता है कि यह छवि के सामने चित्रित है में कहीं नहीं है क्योंकि वहाँ: इस के साथ कुछ समस्याओं के रूप में यह खड़ा कर रहे हैं।
  • प्रगति पैनल हमेशा एप्लिकेशन पैनल की पूरी चौड़ाई लेता है। यह मुख्य पैनल में बॉक्सलेआउट का उपयोग करके लंबवत रूप से केंद्रित है, जिसमें प्रगति पैनल के पहले और बाद में कुछ ऊर्ध्वाधर गोंद हैं, लेकिन मैं क्षैतिज रूप से काम करने के लिए एक ही चाल प्राप्त करने में कामयाब नहीं रहा हूं, और किसी भी मामले में प्रगति पैनल का पसंदीदा क्षैतिज आकार है जरूरी नहीं है। एक दृष्टिकोण जो लगभग काम करता है, प्रगति पैनल के चारों ओर क्षैतिज और ऊर्ध्वाधर स्ट्रैट्स के साथ सीमावर्ती उपयोग का उपयोग करना है, लेकिन प्रगति पैनल का आकार अभी भी सही नहीं है, और मुख्य पैनल का आकार बदलने पर स्ट्रेट को बदलने की आवश्यकता है।

तो आप क्या करेंगे?

  • मुख्य पैनल में एक अलग लेआउट प्रबंधक का उपयोग करें?
  • किसी भी स्तर पर लेयरपेन या ओवरलेलेआउट का उपयोग करें?
  • छवि पैनल और प्रगति पैनल युक्त रोकथाम पदानुक्रम में एक और परत जोड़ें?
  • उपरोक्त का कुछ संयोजन, या कुछ और?

टेक्स्ट का आकार बदलने के बारे में क्या। पैनल का आकार बदलने पर मुझे स्पष्ट रूप से एक नया फ़ॉन्ट बनाने की ज़रूरत है, या क्या यह स्वचालित रूप से ऐसा करने का कोई तरीका है? -

+0

अच्छे सवाल +1 – mKorbel

+0

IMHO यह फ़ॉन्ट आकार पैमाने पर करने के रूप में एक विंडो में नियंत्रण का आकार बदला जाता है ठेठ नहीं है। यह नहीं कह रहा कि यह एक बुरा विचार है, लेकिन यह निश्चित रूप से स्विंग में बेक्ड नहीं है। प्रदर्शन आकारों की विविधता को देखते हुए, हालांकि, मैं यूआई की सराहना करता हूं जो पाठ आकार को ला-ला आधुनिक ब्राउज़र बदलने की अनुमति देता है। इसलिए शायद यह एक अलग सुविधा है जिसे आप इस भाग के बाद काम कर सकते हैं: CTRL +/- फ़ॉन्ट आकार बदलने के लिए। –

उत्तर

2

मुझे पता है कि यह एक लेआउट प्रश्न है, लेकिन SwingWorker आपके पास उपयोगी अंतरिम परिणाम होने पर समस्या को आसान बना सकता है। मैं कभी-कभी इस example से शुरू करता हूं।

+0

धन्यवाद। मैं छवि की गणना करने और प्रगति पट्टी के मूल्य को निर्धारित करने के लिए पहले से ही 'स्विंगवर्कर' का उपयोग कर रहा हूं। किसी बिंदु पर मैं अपूर्ण छवि को प्रस्तुत करने की आशा करता हूं क्योंकि यह बनाया गया है। यह सिर्फ एक खिलौना परियोजना है जिसका उपयोग मैं स्विंग के बारे में अपने ज्ञान को बेहतर बनाने के लिए कर रहा हूं। – Ben

+0

अच्छा उदाहरण। :-) – trashgod

3

JProgressBar का पसंदीदा आकार UI प्रतिनिधि, BasicProgressBarUI द्वारा निर्दिष्ट किया गया है। नीचे दिया गया उदाहरण विभिन्न लेआउट प्रबंधकों के प्रभाव को दर्शाता है। FlowLayout बस UIManager डिफ़ॉल्ट, ProgressBar.horizontalSize का उपयोग करता है, जबकि GridLayout और BorderLayout.CENTER उपलब्ध स्थान भरें। BoxLayout, फ्लैंकिंग गोंद के साथ, फ्रेम का आकार बदलने के रूप में आनुपातिक रूप से समायोजित करता है।

मैं पहले से ही एक SwingWorker

अपने सुरक्षित SwingWorker होना चाहिए की process() विधि से जीयूआई अद्यतन कर रहा है उपयोग कर रहा हूँ। आप परतों को बदल सकते हैं या घटकों को भी हटा सकते हैं, लेकिन मैं अत्यधिक जटिल से सावधान रहूंगा।

PreogressTest

परिशिष्ट: यहाँ प्रासंगिक डिफ़ॉल्ट है।

System.out.println(UIManager.get("ProgressBar.horizontalSize")); 
 
javax.swing.plaf.DimensionUIResource[width=146,height=12] 

कोड:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.LayoutManager; 
import javax.swing.BorderFactory; 
import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 

/** @see http://stackoverflow.com/questions/7256775 */ 
public class ProgressTest { 

    private static final Color border = Color.gray; 

    private static void display() { 
     JFrame f = new JFrame("ProgressTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLayout(new GridLayout(0, 1)); 
     f.add(createPanel(new FlowLayout())); 
     f.add(createPanel(new GridLayout())); 
     f.add(createPanel(new BorderLayout())); 

     JPanel p = new JPanel(); 
     p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); 
     p.setBorder(BorderFactory.createLineBorder(border)); 
     JProgressBar jpb = new JProgressBar(); 
     p.add(Box.createHorizontalGlue()); 
     p.add(jpb); 
     p.add(Box.createHorizontalGlue()); 
     jpb.setIndeterminate(true); 
     f.add(p); 

     f.pack(); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private static JPanel createPanel(LayoutManager layout) { 
     JPanel p = new JPanel(); 
     p.setBorder(BorderFactory.createLineBorder(border)); 
     p.setLayout(layout); 
     JProgressBar jpb = new JProgressBar(); 
     jpb.setIndeterminate(true); 
     p.add(jpb); 
     return p; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       display(); 
      } 
     }); 
    } 
} 
संबंधित मुद्दे