Java 图形 - 在 Jbutton 上绘制形状
Java Graphics - draw shape on Jbutton
我正在为 Java 中的 class 制作一个极小的绘画应用程序。我需要为用户制作几个 select 不同形状的按钮,我应该在这些按钮上放置他们正在使用的形状的图像。例如,一个让用户画线的按钮应该有一个线的图像。一个画矩形的按钮,上面应该是一个矩形。我需要能够在不使用外部图像源的情况下从程序内部执行此操作。
这是我当前的按钮代码示例。
lineB = new JButton();
lineB.setBounds(0, 25, 20, 20);
lineB.setBackground(Color.WHITE);
shapePanel.add(lineB);
lineB.addActionListener(this);
- 创建所需大小的 BufferedImage --
BufferedImage img = new BufferedImage(biWidth, biHeight, BufferedImage.TYPE_INT_ARGB);
- 通过在其上调用
getGraphics()
或 createGraphics()
(更好,因为它为您提供 Graphics2D 对象)获取其 Graphics 上下文。
- 我使用
setRenderingHints(...)
方法将此 Graphics2D 对象的 RenderingHints 设置为全部以进行抗锯齿。这可以消除锯齿。
- 用这个对象画出你的形状。
- 处理 Graphics 对象。
- 使用
new ImageIcon(Image image)
构造函数从上面的图像创建一个 ImageIcon。
- 使用
setIcon(...)
. 将按钮的图标设置为上面的图标
- 不要在按钮或任何东西上调用
setBounds(...)
。
例如,
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.*;
@SuppressWarnings("serial")
public class ImageButton extends JPanel {
private static final int IMG_WIDTH = 50;
private static final Color SHAPE_COLOR = Color.RED;
private static final int GAP = 4;
private JButton circleButton = new JButton();
private JButton squareButton = new JButton();
public ImageButton() {
BufferedImage circleImg = new BufferedImage(IMG_WIDTH, IMG_WIDTH, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = circleImg.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(SHAPE_COLOR);
int x = GAP;
int y = x;
int width = IMG_WIDTH - 2 * x;
int height = IMG_WIDTH - 2 * y;
g2.fillOval(x, y, width, height);
g2.dispose();
circleButton.setIcon(new ImageIcon(circleImg));
BufferedImage squareImg = new BufferedImage(IMG_WIDTH, IMG_WIDTH, BufferedImage.TYPE_INT_ARGB);
g2 = squareImg.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(SHAPE_COLOR);
g2.fillRect(x, y, width, height);
g2.dispose();
squareButton.setIcon(new ImageIcon(squareImg));
add(circleButton);
add(squareButton);
}
private static void createAndShowGui() {
JFrame frame = new JFrame("ImageButton");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ImageButton());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
一种简单的方法是向 JButton 添加图像并使其像图像按钮一样。
try {
Image icon = ImageIO.read(getClass().getResource("icons/line.jpg"));
lineButton.setIcon(new ImageIcon(icon));
} catch (IOException ex) {
}
已编辑:
由于系统要求您在代码中创建形状,因此您可以执行以下代码在内存中创建图像,绘制图像的图形,然后将其分配给按钮。
final int BI_WIDTH = 50;
final int BI_HEIGHT = 50;
BufferedImage lineImage = new BufferedImage(BI_WIDTH, BI_HEIGHT,
BufferedImage.TYPE_INT_RGB);
lineImage.createGraphics().drawLine(2, 25, 48, 25);
JButton lineButton = new JButton();
lineButton.setIcon(new ImageIcon(lineImage));
图形对象有很多不同的功能,你可以在上面画任何你喜欢的东西。
我正在为 Java 中的 class 制作一个极小的绘画应用程序。我需要为用户制作几个 select 不同形状的按钮,我应该在这些按钮上放置他们正在使用的形状的图像。例如,一个让用户画线的按钮应该有一个线的图像。一个画矩形的按钮,上面应该是一个矩形。我需要能够在不使用外部图像源的情况下从程序内部执行此操作。
这是我当前的按钮代码示例。
lineB = new JButton();
lineB.setBounds(0, 25, 20, 20);
lineB.setBackground(Color.WHITE);
shapePanel.add(lineB);
lineB.addActionListener(this);
- 创建所需大小的 BufferedImage --
BufferedImage img = new BufferedImage(biWidth, biHeight, BufferedImage.TYPE_INT_ARGB);
- 通过在其上调用
getGraphics()
或createGraphics()
(更好,因为它为您提供 Graphics2D 对象)获取其 Graphics 上下文。 - 我使用
setRenderingHints(...)
方法将此 Graphics2D 对象的 RenderingHints 设置为全部以进行抗锯齿。这可以消除锯齿。 - 用这个对象画出你的形状。
- 处理 Graphics 对象。
- 使用
new ImageIcon(Image image)
构造函数从上面的图像创建一个 ImageIcon。 - 使用
setIcon(...)
. 将按钮的图标设置为上面的图标
- 不要在按钮或任何东西上调用
setBounds(...)
。
例如,
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.*;
@SuppressWarnings("serial")
public class ImageButton extends JPanel {
private static final int IMG_WIDTH = 50;
private static final Color SHAPE_COLOR = Color.RED;
private static final int GAP = 4;
private JButton circleButton = new JButton();
private JButton squareButton = new JButton();
public ImageButton() {
BufferedImage circleImg = new BufferedImage(IMG_WIDTH, IMG_WIDTH, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = circleImg.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(SHAPE_COLOR);
int x = GAP;
int y = x;
int width = IMG_WIDTH - 2 * x;
int height = IMG_WIDTH - 2 * y;
g2.fillOval(x, y, width, height);
g2.dispose();
circleButton.setIcon(new ImageIcon(circleImg));
BufferedImage squareImg = new BufferedImage(IMG_WIDTH, IMG_WIDTH, BufferedImage.TYPE_INT_ARGB);
g2 = squareImg.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(SHAPE_COLOR);
g2.fillRect(x, y, width, height);
g2.dispose();
squareButton.setIcon(new ImageIcon(squareImg));
add(circleButton);
add(squareButton);
}
private static void createAndShowGui() {
JFrame frame = new JFrame("ImageButton");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ImageButton());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
一种简单的方法是向 JButton 添加图像并使其像图像按钮一样。
try {
Image icon = ImageIO.read(getClass().getResource("icons/line.jpg"));
lineButton.setIcon(new ImageIcon(icon));
} catch (IOException ex) {
}
已编辑:
由于系统要求您在代码中创建形状,因此您可以执行以下代码在内存中创建图像,绘制图像的图形,然后将其分配给按钮。
final int BI_WIDTH = 50;
final int BI_HEIGHT = 50;
BufferedImage lineImage = new BufferedImage(BI_WIDTH, BI_HEIGHT,
BufferedImage.TYPE_INT_RGB);
lineImage.createGraphics().drawLine(2, 25, 48, 25);
JButton lineButton = new JButton();
lineButton.setIcon(new ImageIcon(lineImage));
图形对象有很多不同的功能,你可以在上面画任何你喜欢的东西。