2010-12-01 8 views
24

मैं साझा करने के लिए स्क्रीन के क्षेत्र का चयन करने के उद्देश्य से JWindow पर आधारित कस्टम UI बनाने का प्रयास कर रहा हूं। मैंने JWindow बढ़ाया है और AWTUtilities.setWindowShape() का उपयोग कर विंडो के केंद्र को 'आकार देने' के लिए कोड जोड़ा है।स्विंग जेविंडो को झटके के बिना कैसे बदला जा सकता है?

कोड चलाते समय मुझे झिलमिलाहट का सामना करना पड़ रहा है क्योंकि विंडो को नकारात्मक एक्स और वाई दिशाओं में बदल दिया गया है, यानी ऊपर और बाएं। ऐसा प्रतीत होता है कि घटकों को अद्यतन करने से पहले खिड़की का आकार बदलकर खींचा जाता है। नीचे कोड का एक सरलीकृत संस्करण है। जब ऊपर पैनल चलाया जाता है तो विंडो को ऊपर और बाईं ओर आकार देने के लिए उपयोग किया जा सकता है। खिड़की की पृष्ठभूमि को यह स्पष्ट करने के लिए हरे रंग पर सेट किया गया है कि पिक्सेल जो मैं दिखाना नहीं चाहता हूं।

संपादित करें: विंडो ठीक से एक ComponentListener का उपयोग कर आकार देने के लिए कोड में सुधार और आगे झिलमिलाहट (भी अद्यतन स्क्रीनशॉट) को वर्णन करने के तल पर एक डमी घटक जोड़ा।

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.awt.geom.Area; 

import javax.swing.JPanel; 
import javax.swing.JWindow; 
import javax.swing.border.CompoundBorder; 
import javax.swing.border.EmptyBorder; 
import javax.swing.border.EtchedBorder; 
import javax.swing.border.LineBorder; 

import com.sun.awt.AWTUtilities; 

public class FlickerWindow extends JWindow implements MouseListener, MouseMotionListener{ 

    JPanel controlPanel; 
    JPanel outlinePanel; 
    int mouseX, mouseY; 
    Rectangle windowRect; 
    Rectangle cutoutRect; 
    Area windowArea; 

    public static void main(String[] args) { 
     FlickerWindow fw = new FlickerWindow(); 
    } 

    public FlickerWindow() { 
     super(); 
     setLayout(new BorderLayout()); 
     setBounds(500, 500, 200, 200); 
     setBackground(Color.GREEN); 

     controlPanel = new JPanel(); 
     controlPanel.setBackground(Color.GRAY); 
     controlPanel.setBorder(new EtchedBorder(EtchedBorder.LOWERED)); 
     controlPanel.addMouseListener(this); 
     controlPanel.addMouseMotionListener(this); 

     outlinePanel = new JPanel(); 
     outlinePanel.setBackground(Color.BLUE); 
     outlinePanel.setBorder(new CompoundBorder(new EmptyBorder(2,2,2,2), new LineBorder(Color.RED, 1))); 

     add(outlinePanel, BorderLayout.CENTER); 
     add(controlPanel, BorderLayout.NORTH); 
     add(new JButton("Dummy button"), BorderLayout.SOUTH); 
     setVisible(true); 
     setShape(); 

     addComponentListener(new ComponentAdapter() {   
      @Override 
      public void componentResized(ComponentEvent e) { 
       setShape(); 
      }}); 
    } 


    public void paint(Graphics g) { 
     // un-comment or breakpoint here to see window updates more clearly 
     //try {Thread.sleep(10);} catch (Exception e) {} 
     super.paint(g); 
    } 

    public void setShape() { 
     Rectangle bounds = getBounds(); 
     Rectangle outlineBounds = outlinePanel.getBounds(); 
     Area newShape = new Area (new Rectangle(0, 0, bounds.width, bounds.height)); 
     newShape.subtract(new Area(new Rectangle(3, outlineBounds.y + 3, outlineBounds.width - 6, outlineBounds.height - 6))); 
     setSize(bounds.width, bounds.height); 
     AWTUtilities.setWindowShape(this, newShape); 
    } 

    public void mouseDragged(MouseEvent e) { 
     int dx = e.getXOnScreen() - mouseX; 
     int dy = e.getYOnScreen() - mouseY; 

     Rectangle newBounds = getBounds(); 
     newBounds.translate(dx, dy); 
     newBounds.width -= dx; 
     newBounds.height -= dy; 

     mouseX = e.getXOnScreen(); 
     mouseY = e.getYOnScreen(); 

     setBounds(newBounds); 
    } 

    public void mousePressed(MouseEvent e) { 
     mouseX = e.getXOnScreen(); 
     mouseY = e.getYOnScreen(); 
    } 

    public void mouseMoved(MouseEvent e) {} 
    public void mouseClicked(MouseEvent e) {} 
    public void mouseReleased(MouseEvent e) {} 
    public void mouseEntered(MouseEvent e) {} 
    public void mouseExited(MouseEvent e) {} 
} 

अधिरोहित paint() विधि या एक ब्रेकपाइंट के रूप में इस्तेमाल किया जा सकता Thread.sleep() वहाँ uncommented अद्यतन का स्पष्ट स्थिति प्रदान करने के लिए के रूप में यह होता है हो सकता है।

मेरी समस्या setBounds() विधि से स्टेम लगती है जिससे खिड़की को स्क्रीन पर चित्रित करने से पहले चित्रित किया जा सकता है।

alt text


विंडो बड़ा आकार बदलने (अप और बाएं) के रूप में) ओवरराइड paint() विधि पर ब्रेकप्वाइंट पर देखा दौरान:


विंडो का आकार बदलने, के रूप में यह देखना चाहिए से पहले

alt text

छोटे आकार बदलने (नीचे और दाएं) के रूप में ओवरराइड paint() विधि पर ब्रेकप्वाइंट पर देखा दौरान

विंडो):

alt text


दी इन स्क्रीनशॉट आक्रामक माउस खींचें आंदोलनों के दौरान लिया जाता है, लेकिन झिलमिलाहट काफी हो जाता है अधिक मध्यम माउस ड्रैग के लिए भी परेशान।

बड़े स्क्रीनशॉट के आकार में हरा क्षेत्र नई पृष्ठभूमि दिखाता है जो किसी भी चित्रकला/लेआउट से पहले खींचा जाता है, ऐसा लगता है कि अंतर्निहित ComponentPeer या मूल विंडो प्रबंधक में ऐसा लगता है। 'छोटे आकार में' स्क्रीनशॉट पर नीला क्षेत्र JPanel की पृष्ठभूमि को धक्का में दिखाया जा रहा है लेकिन अब पुराना है। यह लिनक्स (उबंटू) और विंडोज एक्सपी के तहत होता है।

क्या किसी को स्क्रीन पर किए गए किसी भी बदलाव से पहले बैक बफर का आकार बदलने के लिए Window या JWindow का कारण बनने का कोई तरीका मिला है और इस प्रकार इस झटकेदार प्रभाव से बचें? शायद java.awt.... सिस्टम प्रॉपर्टी है जिसे इस से बचने के लिए सेट किया जा सकता है, हालांकि मुझे कोई नहीं मिला।


# 2 संपादित करें: टिप्पणी बाहर AWTUtilities.setWindowShape() करने के लिए कॉल (और वैकल्पिक paint() में Thread.sleep(10) लाइन uncomment) तो क्रम में आक्रामक तरीके से चारों ओर शीर्ष पैनल खींचें स्पष्ट रूप से झिलमिलाहट की प्रकृति को देखने के लिए।

संपादित करें # 3: क्या कोई भी विंडोज 7 या मैक ओएसएक्स पर सन जावा के तहत इस व्यवहार का परीक्षण करने में सक्षम है?

+2

@ विल्जक्रोज़: +1, बहुत अच्छी तरह से तैयार प्रश्न। और सभी के लिए: कृपया ** ** ** बिना किसी उत्तर के उत्तर दें ** ALSO ** प्रश्न को ऊपर उठाना। – SyntaxT3rr0r

+1

मैं एक ही प्रश्न का उत्तर जानना चाहता हूं - मैंने इसे वर्षों से नफरत की है, लेकिन कभी भी एक हैकी कामकाज नहीं मिला। विंडोज 7 पर परीक्षण किया गया और हालांकि मुझे काफी प्रभाव नहीं मिलते हैं क्योंकि मुझे कुछ बहुत समान मिलता है। प्रत्येक जावा एप्लिकेशन के लिए कलाकृतियों का आकार बदलना, न केवल आपके उदाहरण के लिए देखा जाता है। उत्सुकता से, एक खिड़की को ठीक से काम करना ठीक है, केवल आकार बदलना बेकार है (संभवतया क्योंकि विंडोज 7 विंडोज़ को ही चलाता है और जावा में आकार बदलता नहीं है - अगर मैं सही ढंग से याद करता हूं तो विंडोज एक्सपी के विपरीत)। – Domchi

+0

@ डोम्ची: विंडोज 7 :-) पर होने की पुष्टि के लिए धन्यवाद। XP पर विंडो को स्थानांतरित करना कोई पश्चाताप के साथ चिकनी लगता है। हो सकता है कि आप XP पर खराब होने पर विंडो 'मरम्मत' का जिक्र कर रहे हों। कंपोजिटिंग डब्लूएम (जैसा कि विस्टा/विन 7, ओएसएक्स और कंपिज़ इत्यादि में लिनक्स पर देखा गया है) पश्चाताप के अनुरोध किए बिना विंडोज के पूर्व अस्पष्ट हिस्सों की 'मरम्मत' को संभालता है, यह वह जगह है जहां मुझे लगता है कि एक्सपी गिर सकता है। – willjcroz

उत्तर

1

मैंने अभी आपके उदाहरण की कोशिश की है। खिड़की का आकार बदलते समय मैंने वास्तव में कुछ छोटे फ्लिकिंग देखा। मैं द्वारा

setSize(newBounds.width, newBounds.height); 

AWTUtilities.setWindowShape(this, newShape); पर कोड टुकड़ा setBounds() से शुरू और खत्म की जगह करने की कोशिश की और देखा कि flicking गायब हो गया। इसलिए, मैं आपको इस समाधान का सुझाव दूंगा जब तक कि आपके पास setBounds का उपयोग करने के कोई विशेष कारण न हों।

+0

आपके इनपुट के लिए धन्यवाद। सही आकार बदलने का व्यवहार प्राप्त करने के लिए (यह उदाहरण ऊपर और बाईं ओर आकार बदलने के उपयोग के मामले का प्रतिनिधित्व करता है) मुझे खिड़की को स्थानांतरित करने और इसे आकार देने की आवश्यकता है ('JWindow' की शीर्ष-बाएं मूल को बदलने की जरूरत है) इसलिए इसका उपयोग 'setBounds()'। – willjcroz

+1

@AlexR: ठीक है लेकिन कई अन्य प्लेटफार्म AWTUtilities.setWindowShape (यह, नया आकार); काम नहीं कर रहा है बस कोशिश की और असफल रहा। फेडोरा लिनक्स/उबंटू और ओपनजेडीके। – YumYumYum

1

उपयोगकर्ता के चित्रकला से पहले खींचने/आकार बदलने के लिए प्रतीक्षा करने का एक और तरीका हो सकता है। उपयोगकर्ता को आकार बदलने के बाद उपयोगकर्ता को विंडो का आकार दिखाने के लिए बाध्यकारी बॉक्स का उपयोग करें।

मैंने देखा है कि बहुत सारे खिड़की वाले अनुप्रयोग या तो उस दृष्टिकोण को ले लेंगे या झटके से निपटेंगे। बस उन सभी ऐप्स के बारे में मैंने एक आक्रामक आकार बदलने की कोशिश की है, जिसमें एक ही समस्या है (गैर-जावा) ताकि समस्या स्वयं स्विंग के बजाए ग्राफ़िक उपप्रणाली के साथ झूठ बोल सके।

+0

हां, मैं वर्तमान में बाध्यकारी बॉक्स दृष्टिकोण पर विचार कर रहा हूं, इसके साथ एकमात्र समस्या यह है कि उपयोगकर्ता को सटीकता की आवश्यकता होती है (स्क्रीन के सटीक क्षेत्र का चयन करना) और इसलिए दो राज्यों के बीच इंटरफ़ेस परिवर्तन करना अवांछनीय है। अन्य ऐप्स के लिए आपने एक्लिप्स में आकार बदलने का प्रयास किया है? इसके जटिल लेआउट के बावजूद मेरे लिए शून्य झिलमिलाहट है, झटकेदार हां लेकिन झिलमिलाहट मुक्त! यह मुझे यह सोचने के लिए प्रेरित कर रहा है कि मुझे बेहतर भाग्य सीखना और एसडब्ल्यूटी का उपयोग करना पड़ सकता है। – willjcroz

+2

हाँ, मुझे लगता है कि झटकेदार/झिलमिलाहट मेरे लिए एक हैं। किसी भी पुनर्भुगतान को देखने के लिए यह अवांछनीय तरीका है। मैं अपनी आईडी लिख रहा था, जबकि मैं अपनी टिप्पणी लिख रहा था - तो मुझे लगता है कि हम एक ही पृष्ठ पर थे। मैं काम पर कुछ एसडब्ल्यूटी/आरसीपी ऐप्स के साथ काम करता हूं, जितना अधिक यह एक अच्छा अच्छा ढांचा प्रदान करता है लेकिन विस्तारशीलता के मामले में वांछित होने के लिए बहुत कुछ छोड़ देता है। जिस इवेंट मॉडल का उपयोग करता है वह भी काम करने के लिए बहुत अनुकूल नहीं है। क्या आपने नेटबीन मंच की जांच करने की कोशिश की है? मुझे लगता है कि यह एक स्विंग आधारित फ्रेम है जो देखने लायक हो सकता है। –

+0

पीएस: मैं आपकी पुरानी जांच करने के लिए पुरानी मशीन का उपयोग कर रहा था और एक फिक्स (विंडोज एक्सपी के साथ 2.0 सिंगल कोर) के लिए प्रयास कर रहा था - जब भी मैंने कोई आकार बदल दिया तो मैं अभी भी झिलमिलाहट/झटके देख सकता था। बाउंडिंग बॉक्स विचार के लिए –

2

मैं मानता हूं कि यह एक विशेष रूप से सहायक उत्तर नहीं है, लेकिन यह समझना कि वास्तव में स्विंग क्या मदद कर सकती है।

देखें, स्विंग अपने सभी काम करता है, वास्तव में ओएस से आकर्षित करने के लिए थोड़ा सा स्थान प्राप्त करने से कम। सभी ड्राइंग, विजेट, आदि जावा कोड हैं। यह इतना नहीं है कि यह धीरे-धीरे चल रहा है, क्योंकि यह 2 डी ग्राफिक्स कार्ड त्वरण और ओएस प्रतिपादन चाल के लाभ के बिना चल रहा है।

DirectDraw याद रखें? सबकुछ आजकल है, और खिड़की के ऑप्स मक्खन-चिकनी हैं। लेकिन अगर आपने कभी ऐसा कंप्यूटर पकड़ लिया है जिसके पास किसी कारण से नहीं है (कहें, कोई ड्राइवर नहीं है तो एक्सपी इंस्टॉल करें) आप बिल्कुल इस प्रकार की मंदी देखते हैं।

स्विंग के साथ, क्योंकि यह अपनी सभी जगहों का प्रबंधन करता है, ओएस आपकी मदद करने के लिए इनमें से कोई भी प्रतिपादन चाल नहीं कर सकता है।

कोई आपके ऑप्टिमाइज़ेशन के साथ आ सकता है जो आपके कंप्यूटर पर आपकी समस्या को हल करता है, लेकिन मुझे चिंता है कि यह वास्तव में मूल समस्या को ठीक करने वाला नहीं है - स्विंग धीमी है और तेजी से नहीं मिल सकती है।

आपको मूल टूलकिट में देखना चाहिए। एडब्ल्यूटी ठीक है, लेकिन बहुत सारे विजेट/आदि गायब हैं। यह मूल है, और अंतर्निहित है, इसलिए यदि आपको बस इतना ही चाहिए तो यह बहुत तेज़ होना चाहिए। मैं एसडब्ल्यूटी के आंशिक हूं, जो एक्लिप्स, वीज़ (दूसरों के बीच) का उपयोग करता है। यह स्विंग की आसानी और सुविधाओं के साथ एडब्ल्यूटी की देशी-नस्ल को जोड़ती है, और निश्चित रूप से हर जगह चलती है।

संपादित करें: आपकी कुछ और टिप्पणियां पढ़ने के बाद यह बहुत स्पष्ट है कि आप पूरी तरह से समझते हैं कि खिड़की कैसे होती है - मैं संवेदना के रूप में नहीं आना चाहता हूं। इतना ही नहीं, लेकिन आप आकार बदलने में अधिक रुचि रखते हैं, जिसकी मेरी टिप्पणी के साथ इतना कुछ नहीं है। मैं अभी भी एसडब्ल्यूटी की सिफारिश करता हूं क्योंकि यह मूल कोड और तेज़ है, लेकिन यह ऊपर दिए गए एक से अलग जवाब है।

+0

आपके विचारों के लिए धन्यवाद, चिंता न करें मुझे संरक्षित महसूस नहीं हुआ;)। हां एसडब्ल्यूटी कुछ भविष्य की परियोजना के लिए इसे पाने के लिए एक तरह से दिखता है। लेकिन चूंकि इस परियोजना में एक आसन्न समय सीमा है और तथ्य यह है कि यह यूआई पहलू एक ऐपलेट के भीतर है जिसके लिए तेज़ लोडिंग समय की आवश्यकता होती है, एसडब्ल्यूटी मुझे अभी कोई समाधान नहीं दे रहा है। – willjcroz

+0

भी समस्या वास्तव में स्विंग के 'JWindow' अंतर्निहित एडब्ल्यूटी परत के भीतर मौजूद है। विशेष रूप से देशी सहकर्मी, 'घटक पीयर', और इसके संबंधित मूल कोड स्क्रीन डिवाइस के किसी भी अपडेट से पहले एक बफर में स्वयं को पेंट करने के लिए बच्चे घटक को पूछने का कोई तरीका नहीं प्रदान करता है। इसलिए यह सभी शीर्ष स्तर एडब्ल्यूटी और (हेवीवेट) स्विंग घटकों के लिए एक मुद्दा प्रतीत होता है। आपके सुझावों के लिए – willjcroz

+0

+1 – willjcroz

संबंधित मुद्दे

 संबंधित मुद्दे