JButton
グラデーションの色を変更したいのですが、これを見つけました http://Java2everyone.blogspot.com/2009/01/set-jbutton-gradient-color.html ですが、すべてのボタンではなく、1つのボタンのみのグラデーションを変更したい
JButton
インスタンスの paintComponent メソッドをオーバーライドし、その Graphics オブジェクトを Paint を実装する次のクラスのいずれかでペイントできます。 =インターフェース:
import Java.awt.Color;
import Java.awt.Dimension;
import Java.awt.FlowLayout;
import Java.awt.GradientPaint;
import Java.awt.Graphics;
import Java.awt.Graphics2D;
import Java.awt.Point;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public final class JGradientButtonDemo {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI() {
final JFrame frame = new JFrame("Gradient JButton Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new FlowLayout());
frame.add(JGradientButton.newInstance());
frame.setSize(new Dimension(300, 150)); // used for demonstration
//frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static class JGradientButton extends JButton {
private JGradientButton() {
super("Gradient Button");
setContentAreaFilled(false);
setFocusPainted(false); // used for demonstration
}
@Override
protected void paintComponent(Graphics g) {
final Graphics2D g2 = (Graphics2D) g.create();
g2.setPaint(new GradientPaint(
new Point(0, 0),
Color.WHITE,
new Point(0, getHeight()),
Color.PINK.darker()));
g2.fillRect(0, 0, getWidth(), getHeight());
g2.dispose();
super.paintComponent(g);
}
public static JGradientButton newInstance() {
return new JGradientButton();
}
}
}
Mreの答えよりも少し改善:
private static final class JGradientButton extends JButton{
private JGradientButton(String text){
super(text);
setContentAreaFilled(false);
}
@Override
protected void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g.create();
g2.setPaint(new GradientPaint(
new Point(0, 0),
getBackground(),
new Point(0, getHeight()/3),
Color.WHITE));
g2.fillRect(0, 0, getWidth(), getHeight()/3);
g2.setPaint(new GradientPaint(
new Point(0, getHeight()/3),
Color.WHITE,
new Point(0, getHeight()),
getBackground()));
g2.fillRect(0, getHeight()/3, getWidth(), getHeight());
g2.dispose();
super.paintComponent(g);
}
}
TL; DR:直接は不可能ですが、ルカの答えのように回避策を講じることで実行できますが、彼/彼女の答えは誤った勾配ステップを使用しています。正しいものを以下に示します。
Metal LAFには、ハードコードされた例外があります。 background
プロパティがUIResource
のサブクラスである場合、それは無視されます*。代わりに、ボタンはUIプロパティ_Button.gradient
_からの(ハードコードされた)グラデーションで描画されます。それ以外の場合、background
がUIResource
でない場合、その背景はそのままペイントされます。
*ボタンが無効になっていない限り、グラデーションはなく、UIResource
内の色が背景に使用されます。
MetalButtonUI
のロジックに従って、使用されるグラデーションは、ArrayList
を含むUIプロパティ_Button.gradient
_からのものであることがわかりました。
_0 = {Float} 0.3
1 = {Float} 0.0
2 = {ColorUIResource} "[221,232,243]"
3 = {ColorUIResource} "[255,255,255]"
4 = {ColorUIResource} "[184,207,229]"
_
さらにロジックに従って、私はMetalUtils.GradientPainter.drawVerticalGradient()
に行き着きました。この実装は、上記のデータを*として解釈します。
* 2番目のフロートが0.0であると仮定します。そうでない場合、より多くのグラデーションが描画されます。
これは多段階のグラデーションであるため、単純なGradientPaint
で実行することはできませんが、LinearGradientPaint
で実行できます。ただし、background
プロパティはColor
のみを受け入れます。実際の値は最終的にGraphics.setColor()
ではなくGraphics2D.setPaint()
に与えられるため、なりすまし/ハッキングすらできません(MetalはSwingベースであり、AWTではありません)DeadEnd。唯一の解決策は、JButtonを完全にサブクラス化するようです。