2012-04-09 9 views
5

मैंने रैखिक ढाल लगाने के लिए निम्नलिखित उदाहरण की कोशिश की: GradientPaintDemo2Dरैखिक ग्रेडियेंट के साथ जावा स्विंग मैट सीमा?

यह अच्छी तरह से काम करता है, लेकिन मैं जावा स्विंग मैट सीमा में ढाल रंग लागू करना चाहता था।

javax.swing.BorderFactory.createMatteBorder(1, 50, 1, 50, color) 

लेकिन वह केवल Color की एक प्रकार, नहीं GradientPaint लागू करने के लिए है: मैं इस कोशिश की।

जैसा कि हम सभी जानते हैं, GradientPaint में दो रंग मिश्रित होते हैं, जैसा उपर्युक्त उदाहरण में दिखाया गया है। तो इस मामले के लिए वैकल्पिक जवाब क्या है?

उत्तर

8

कैसे नई MatteBorder(int, int, int, int, javax.swing.Icon)

//Another example: 
import java.awt.*; 
import java.awt.geom.*; 
import javax.swing.*; 

public class GradientMatteBorderTest { 
    public JComponent makeUI() { 
    Icon icon = new Icon() { 
     @Override public void paintIcon(Component c, Graphics g, int x, int y) { 
     Graphics2D g2 = (Graphics2D)g.create(); 
     Point2D start = new Point2D.Float(0f, 0f); 
     Point2D end = new Point2D.Float(99f, 0f); 
     float[] dist = {0.0f, 0.5f, 1.0f}; 
     Color[] colors = { Color.RED, Color.YELLOW, Color.GREEN }; 
     g2.setPaint(new LinearGradientPaint(start, end, dist, colors)); 
     g2.fillRect(x, y, 100, 10); 
     g2.dispose(); 
     } 
     @Override public int getIconWidth() { return 100; } 
     @Override public int getIconHeight() { return 10; } 
    }; 
    JLabel label = new JLabel("GradientMatteBorder"); 
    label.setBorder(BorderFactory.createMatteBorder(10,5,10,0,icon)); 
    JPanel p = new JPanel(new BorderLayout()); 
    p.setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); 
    p.add(label, BorderLayout.NORTH); 
    return p; 
    } 
    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 
    public static void createAndShowGUI() { 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    f.getContentPane().add(new GradientMatteBorderTest().makeUI()); 
    f.setSize(320, 240); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
} 
उपयोग के बारे में
10

इस तरह के विशिष्ट मामले के लिए आपको अपना खुद का सीमा बनाना होगा।
यहाँ ढाल सीमा वर्ग के साथ एक उदाहरण है:

public static class GradientBorder implements Border 
{ 
    private Insets margin; 

    public GradientBorder (int top, int left, int bottom, int right) 
    { 
     super(); 
     margin = new Insets (top, left, bottom, right); 
    } 

    public void paintBorder (Component c, Graphics g, int x, int y, int width, int height) 
    { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setPaint (new GradientPaint (x, y, Color.RED, x + width, y, Color.BLUE)); 

     Area border = new Area (new Rectangle (x, y, width, height)); 
     border.subtract (new Area (new Rectangle (x + margin.left, y + margin.top, 
       width - margin.left - margin.right, height - margin.top - margin.bottom))); 
     g2d.fill (border); 
    } 

    public Insets getBorderInsets (Component c) 
    { 
     return margin; 
    } 

    public boolean isBorderOpaque() 
    { 
     return true; 
    } 
} 

बेशक आप किसी भी अन्य ढाल दिशा, रंग निर्दिष्ट कर सकते हैं e.t.c. आप अपनी शुरुआत को कन्स्ट्रक्टर में भी रख सकते हैं (यदि आपको इसकी आवश्यकता है)। इसका इस्तेमाल करने के लिए आपको सिर्फ सीमा निर्धारित करने के लिए (किसी भी JComponent उत्तराधिकारी में) की आवश्यकता होगी:

jComponent.setBorder (new GradientBorder (25, 50, 25, 50)); 

मूल रूप से आप आप किसी भी रंग/एनीमेशन/आकार के साथ इस तरह की तरह किसी भी सीमा बना सकते हैं e.t.c.

और जिस तरह से - isBorderOpaque() विधि सच लौटना चाहिए, आप अर्द्ध पारदर्शी सीमा (अर्द्ध पारदर्शी रंग, गोल कोने और इस तरह के साथ आकार के साथ उदाहरण के लिए) बनाना चाहते हैं, अन्यथा आप से निपटने के लिए होगा घटक पुनर्भुगतान समस्याएं।

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