Java Swing Matte Border พร้อมการไล่ระดับสีเชิงเส้น?

ฉันลองใช้ตัวอย่างต่อไปนี้เพื่อใช้การไล่ระดับสีเชิงเส้น: GradientPaintDemo2D.

มันใช้งานได้ดี แต่ฉันต้องการให้ใช้สีไล่ระดับสีกับขอบด้านของ Java Swing ฉันลองสิ่งนี้:

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

แต่นั่นใช้สำหรับการใช้ หนึ่ง ประเภท Color ไม่ใช่ GradientPaint

ดังที่เราทุกคนทราบ GradientPaint มีสองสีผสมกัน ดังที่แสดงในตัวอย่างที่ลิงก์ด้านบน แล้วคำตอบอื่นสำหรับกรณีนี้คืออะไร?


person gumuruh    schedule 09.04.2012    source แหล่งที่มา


คำตอบ (2)


แล้วการใช้ 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);
  }
}
person aterai    schedule 09.04.2012

สำหรับกรณีเฉพาะดังกล่าว คุณจะต้องสร้างเส้นขอบของคุณเอง
นี่คือตัวอย่างที่มีคลาสเส้นขอบแบบไล่ระดับสี:

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;
    }
}

แน่นอนว่าคุณสามารถระบุทิศทางการไล่ระดับสี สี ฯลฯ ได้ คุณสามารถใส่การเริ่มต้นลงในตัวสร้างได้เช่นกัน (ถ้าคุณต้องการ) หากต้องการใช้งานคุณจะต้องตั้งค่าเส้นขอบ (ในตัวต่อจาก JComponent):

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

โดยพื้นฐานแล้ว คุณสามารถสร้างเส้นขอบตามที่คุณต้องการด้วยวิธีนี้ด้วยการระบายสี/แอนิเมชัน/รูปร่างต่างๆ เป็นต้น

และโดยวิธีการ - วิธีการ isBorderOpaque () ควรคืนค่าเป็นจริงหากคุณต้องการสร้างเส้นขอบกึ่งโปร่งใส (เช่นด้วยสีกึ่งโปร่งใสรูปร่างที่มีมุมโค้งมนและอื่น ๆ ) มิฉะนั้นคุณจะต้องจัดการกับปัญหาการทาสีส่วนประกอบใหม่

person Mikle Garin    schedule 09.04.2012