基本音乐播放器的Java Swing绘图播放按钮
也许我的情况只是想法上的混乱。如何使用形状绘制这样的按钮 我不介意圆角,这是我关于圆角按钮的建议基本音乐播放器的Java Swing绘图播放按钮,java,swing,jbutton,Java,Swing,Jbutton,也许我的情况只是想法上的混乱。如何使用形状绘制这样的按钮 我不介意圆角,这是我关于圆角按钮的建议 import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.geom.RoundRectangle2D; import javax.swing.AbstractB
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
import javax.swing.JComponent;
import javax.swing.plaf.basic.BasicButtonUI;
public class PlayButtonUI extends BasicButtonUI{
protected Shape shape;
@Override
protected void installDefaults(AbstractButton b) {
super.installDefaults(b);
b.setOpaque(false);//removes that annoying default background
}
@Override public void paint(Graphics g, JComponent c) {
Graphics2D g2 = (Graphics2D)g;
AbstractButton b = (AbstractButton) c;
ButtonModel model = b.getModel();
drawButtonShape(b);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);//smoth borders
if(model.isArmed()) {
g2.setColor(Color.RED);//color when button is pressed
}else{
g2.setColor(Color.GREEN);//default button color
}
g2.fill(shape);//aplying color
super.paint(g2, c);
}
private void drawButtonShape(JComponent c) {
//button shape is drawn here, 16 are the border radius
shape = new RoundRectangle2D.Float(0, 0, c.getWidth()-1, c.getHeight()-1,16, 16);
}
}
我真的不知道怎么画东西,这门课是我在某处找到的一个混乱的例子的结果,然后我自己简化,直到它起作用,我留下了一些重要的评论
我已经寻找了一段时间,在oracle文档中找到了这个示例。
我真的不知道如何将图形2D转换为形状,请告诉我我是否走错了方向。所以,我花了一天的时间来解决这个问题,试图做一系列的三角魔法。。。我甚至不会玩简单的纸牌戏法:P 然后我意识到,我还可以做其他的把戏 所以,这是一个轻微的“欺骗”。这实际上是使用
笔划的属性来生成圆角边,而不是尝试使用曲线来创建
或复合形状
查看更多详细信息因此,我花了一整天的时间来解决这个问题,试图做一系列的三角魔法。。。我甚至不会玩简单的纸牌戏法:P
然后我意识到,我还可以做其他的把戏
所以,这是一个轻微的“欺骗”。这实际上是使用笔划的属性来生成圆角边,而不是尝试使用曲线来创建
或复合形状
查看更多详细信息使用shape API生成圆角矩形样式的形状,这可能会让您产生一些想法,有趣的是,该区域似乎是缺少的部分。利用ShapeAPI生成一个圆角矩形样式的形状,它可能会给你一些想法,有趣的是,区域似乎是缺少的部分。
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.GeneralPath;
import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicButtonUI;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
JButton btn = new JButton();
btn.setUI(new PlayButtonUI());
frame.add(btn);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class PlayButtonUI extends BasicButtonUI {
@Override
public Dimension getPreferredSize(JComponent c) {
return new Dimension(200, 200);
}
@Override
public void paint(Graphics g, JComponent c) {
Graphics2D g2 = (Graphics2D) g;
AbstractButton b = (AbstractButton) c;
ButtonModel model = b.getModel();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);//smoth borders
if (model.isArmed()) {
g2.setColor(Color.BLACK);//color when button is pressed
} else {
g2.setColor(Color.GRAY);//default button color
}
float thinkness = Math.min(c.getWidth(), c.getHeight()) * 0.1f;
Shape shape = shapeFor(c, thinkness);
g2.setStroke(new BasicStroke(thinkness, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g2.fill(shape);//aplying color
g2.draw(shape);
super.paint(g2, c);
}
private Shape shapeFor(JComponent c, float thickness) {
GeneralPath gp = new GeneralPath();
double width = c.getWidth();
double height = c.getHeight();
double vPos = height / 2.0;
double hPos = width - thickness;
gp.moveTo(0.0 + thickness, 0.0 + thickness);
gp.lineTo(hPos, vPos);
gp.lineTo(0.0 + thickness, height - thickness);
gp.closePath();
return gp;
}
}
}