Perbatasan Java Swing Matte dengan Gradien Linier?

Saya mencoba contoh berikut untuk menerapkan gradien linier: GradientPaintDemo2D.

Ini berfungsi dengan baik, tapi saya ingin warna gradien diterapkan ke perbatasan matte Java Swing. Saya mencoba ini:

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

Namun itu hanya untuk menerapkan satu jenis Color, bukan GradientPaint.

Seperti yang kita ketahui bersama, GradientPaint berisi dua warna yang dicampur sekaligus, seperti yang ditunjukkan pada contoh tautan di atas. Lalu apa jawaban alternatif untuk kasus ini?


person gumuruh    schedule 09.04.2012    source sumber


Jawaban (2)


Bagaimana kalau menggunakan 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

Untuk kasus khusus seperti ini, Anda perlu membuat Perbatasan Anda sendiri.
Berikut adalah contoh dengan kelas batas gradien:

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

Tentu saja Anda dapat menentukan arah gradien lainnya, warna, dll. Anda juga dapat memasukkan inisialisasinya ke dalam konstruktor (jika Anda membutuhkannya). Untuk menggunakannya, Anda hanya perlu mengatur batas (di penerus JComponent mana pun):

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

Pada dasarnya Anda dapat membuat batas apa pun yang Anda suka dengan cara ini dengan pewarnaan/animasi/bentuk apa pun, dll.

Dan omong-omong - metode isBorderOpaque () harus mengembalikan nilai true, jika Anda ingin membuat batas semi-transparan (misalnya dengan warna semi-transparan, dibentuk dengan sudut membulat dan semacamnya), jika tidak, Anda harus berurusan dengan masalah pengecatan ulang komponen.

person Mikle Garin    schedule 09.04.2012