2012-04-11 23 views
5

के साथ पॉपओवर मैं तीर, गोलाकार कोनों के साथ एक Google क्रोम पसंदीदा-शैली पॉपओवर बनाना चाहता हूं और यदि मेरे पास छाया प्रभाव पड़ता है। जावा स्विंग में। सबसे अच्छा तरीका क्या है? SplashScreen? या सिर्फ एक सादा AWT Window? अन्य विचार? धन्यवाद!स्विंग: तीर

उत्तर

7

वहाँ कुछ ही विकल्प हैं और उनमें से प्रत्येक का अपना पक्ष-विपक्ष है ...

  1. एक कस्टम के आकार खिड़की बनाएँ - इस दृष्टिकोण के साथ कुछ सिस्टम के पीछे अतिरिक्त छाया बनाने के लिए सक्षम हो जाएगा आकार की खिड़की, यह भी अधिकांश प्रणालियों पर काम करती है (लिनक्स जेडीके पर भी काम करना चाहिए)। इस दृष्टिकोण के बारे में बुरी चीज (जो वास्तव में इसे अनुपयोगी बनाती है) अनियमित आकार सीमा रेखा है - यदि आप कुछ अंडाकार आकार वाली खिड़की बनाते हैं तो इसके पक्ष किसी न किसी दिखाई देंगे।

  2. खींचे गए आकार के साथ एक गैर-अपारदर्शी अपरिवर्तित विंडो बनाएं - यह दृष्टिकोण (1) दृष्टिकोण की मुख्य समस्या को ठीक करेगा। आप आकार को पूरी तरह से पारदर्शी विंडो पर चित्रित कर सकते हैं। इस बारे में बुरी बात यह है कि यह केवल विन और मैक सिस्टम पर काम करता है। किसी भी लिनक्स सिस्टम पर आपको एक आयताकार परिणामस्वरूप खिड़की और असमर्थित परिचालनों के बारे में त्रुटियों की संख्या मिल जाएगी।

  3. जावा-विंडो के अंदर एक कस्टम आकार के पॉपअप बनाएं और इसे विंडो स्तरित या ग्लास पैनल पर रखें। यह आपको किसी भी संगतता समस्याओं से पूरी तरह से बचने और (2) दृष्टिकोण के लाभ प्राप्त करने की अनुमति देगा। यद्यपि इस दृष्टिकोण के बारे में एक बुरी बात है - आप केवल विंडो रूट फलक सीमाओं में ऐसे पॉपअप प्रदर्शित कर सकते हैं। यह ज्यादातर मामलों में दो अन्य तरीकों से अभी भी बेहतर है, क्योंकि यह कम संसाधनों का उपयोग करता है, अतिरिक्त विंडो नहीं बनाता है और आप पॉपअप के हर हिस्से को नियंत्रित कर सकते हैं।

3 दृष्टिकोण के बारे में - आप TooltipManager जांच कर सकते हैं मैं अपने परियोजना WebLookAndFeel में बनाया है - यह एक छाया प्रभाव के साथ कस्टम के आकार का अर्द्ध पारदर्शी टूलटिप्स प्रदर्शित करने के लिए खिड़की कांच फलक का उपयोग करता है। इसके अलावा जल्द ही मैं विंडो पॉपअपमेनर जोड़ दूंगा जो "आंतरिक" विंडो पॉपअप के त्वरित निर्माण की अनुमति देगा।

यहाँ दृष्टिकोण के कुछ उदाहरण हैं:

कि उदाहरण के सभी में आगे इस्तेमाल किया

विधि आकार बनाने के लिए एक छोटा सा कोड:

private static Area createShape() 
{ 
    Area shape = new Area (new RoundRectangle2D.Double (0, 20, 500, 200, 20, 20)); 

    GeneralPath gp = new GeneralPath (GeneralPath.WIND_EVEN_ODD); 
    gp.moveTo (230, 20); 
    gp.lineTo (250, 0); 
    gp.lineTo (270, 20); 
    gp.closePath(); 
    shape.add (new Area (gp)); 

    return shape; 
} 

माउस एडाप्टर की अनुमति देता है घटक खींचकर विंडो को स्थानांतरित करने के लिए:

public static class WindowMoveAdapter extends MouseAdapter 
{ 
    private boolean dragging = false; 
    private int prevX = -1; 
    private int prevY = -1; 

    public WindowMoveAdapter() 
    { 
     super(); 
    } 

    public void mousePressed (MouseEvent e) 
    { 
     if (SwingUtilities.isLeftMouseButton (e)) 
     { 
      dragging = true; 
     } 
     prevX = e.getXOnScreen(); 
     prevY = e.getYOnScreen(); 
    } 

    public void mouseDragged (MouseEvent e) 
    { 
     if (prevX != -1 && prevY != -1 && dragging) 
     { 
      Window w = SwingUtilities.getWindowAncestor (e.getComponent()); 
      if (w != null && w.isShowing()) 
      { 
       Rectangle rect = w.getBounds(); 
       w.setBounds (rect.x + (e.getXOnScreen() - prevX), 
         rect.y + (e.getYOnScreen() - prevY), rect.width, rect.height); 
      } 
     } 
     prevX = e.getXOnScreen(); 
     prevY = e.getYOnScreen(); 
    } 

    public void mouseReleased (MouseEvent e) 
    { 
     dragging = false; 
    } 
} 

1 दृष्टिकोण उदाहरण: -:

public static void main (String[] args) 
{ 
    JFrame frame = new JFrame(); 
    frame.setUndecorated (true); 

    final Area shape = createShape(); 
    JPanel panel = new JPanel() 
    { 
     protected void paintComponent (Graphics g) 
     { 
      super.paintComponent (g); 

      Graphics2D g2d = (Graphics2D) g; 
      g2d.setRenderingHint (RenderingHints.KEY_ANTIALIASING, 
        RenderingHints.VALUE_ANTIALIAS_ON); 

      g2d.setPaint (Color.BLACK); 
      g2d.fill (shape); 
     } 
    }; 
    panel.setOpaque (false); 
    WindowMoveAdapter wma = new WindowMoveAdapter(); 
    panel.addMouseListener (wma); 
    panel.addMouseMotionListener (wma); 
    frame.getContentPane().add (panel); 

    AWTUtilities.setWindowOpaque (frame, false); 
    frame.setSize (shape.getBounds().getSize()); 
    frame.setLocationRelativeTo (null); 

    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    frame.setVisible (true); 
} 

अब

public static void main (String[] args) 
{ 
    JFrame frame = new JFrame(); 
    frame.setUndecorated (true); 

    JPanel panel = new JPanel(); 
    panel.setBackground (Color.BLACK); 
    WindowMoveAdapter wma = new WindowMoveAdapter(); 
    panel.addMouseListener (wma); 
    panel.addMouseMotionListener (wma); 
    frame.getContentPane().add (panel); 

    Area shape = createShape(); 
    AWTUtilities.setWindowShape (frame, shape); 
    frame.setSize (shape.getBounds().getSize()); 
    frame.setLocationRelativeTo (null); 

    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    frame.setVisible (true); 
} 

आप देख सकते हैं गोल आकार के कोनों सुंदर किसी न किसी और अच्छे दिखने वाले

2 दृष्टिकोण नहीं हैं यह सही दिखना चाहिए - एकमात्र समस्या यह ठीक से विंडोज और मैक पर काम करेगी (कम से कम 1.6.x जेडीके में)। कम से कम एक महीने पहले जब मैंने पिछली बार इसे विभिन्न ओएस पर चेक किया था।

3 दृष्टिकोण

public static void main (String[] args) 
{ 
    JFrame frame = new JFrame(); 

    JPanel panel = new JPanel (new BorderLayout()); 
    panel.setOpaque (false); 
    WindowMoveAdapter wma = new WindowMoveAdapter(); 
    panel.addMouseListener (wma); 
    panel.addMouseMotionListener (wma); 
    frame.getContentPane().add (panel); 

    panel.add (new JButton ("Test")); 

    final Area shape = createShape(); 

    JPanel glassPane = new JPanel (null) 
    { 
     public boolean contains (int x, int y) 
     { 
      // This is to avoid cursor and mouse-events troubles 
      return shape.contains (x, y); 
     } 
    }; 
    glassPane.setOpaque (false); 
    frame.setGlassPane (glassPane); 
    glassPane.setVisible (true); 

    JComponent popup = new JComponent() 
    { 
     protected void paintComponent (Graphics g) 
     { 
      super.paintComponent (g); 

      Graphics2D g2d = (Graphics2D) g; 
      g2d.setRenderingHint (RenderingHints.KEY_ANTIALIASING, 
        RenderingHints.VALUE_ANTIALIAS_ON); 

      g2d.setPaint (Color.BLACK); 
      g2d.fill (shape); 
     } 
    }; 
    popup.addMouseListener (new MouseAdapter() 
    { 
     // To block events on the popup 
    }); 
    glassPane.add (popup); 
    popup.setBounds (shape.getBounds()); 
    popup.setVisible (true); 

    frame.setSize (800, 500); 
    frame.setLocationRelativeTo (null); 

    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    frame.setVisible (true); 
} 

इस पॉपअप कांच फलक पर रखा का एक सरल उदाहरण है। जैसा कि आप देख सकते हैं कि यह केवल जेएफआरएएम के अंदर मौजूद है, लेकिन एलियाड पक्ष है और किसी भी प्रकार के ओएस पर ठीक से काम करता है।

+0

बहुत अच्छा जवाब +1 – mKorbel

+0

मैंने सभी दृष्टिकोणों के लिए कोड नमूने जोड़े हैं –

+0

मैंने पहले ही समस्या देखी है और पाठ बदल दिया है, लेकिन टिप के लिए धन्यवाद :) –