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);
  1. 创建所需大小的 BufferedImage -- BufferedImage img = new BufferedImage(biWidth, biHeight, BufferedImage.TYPE_INT_ARGB);
  2. 通过在其上调用 getGraphics()createGraphics()(更好,因为它为您提供 Graphics2D 对象)获取其 Graphics 上下文。
  3. 我使用 setRenderingHints(...) 方法将此 Graphics2D 对象的 RenderingHints 设置为全部以进行抗锯齿。这可以消除锯齿。
  4. 用这个对象画出你的形状。
  5. 处理 Graphics 对象。
  6. 使用 new ImageIcon(Image image) 构造函数从上面的图像创建一个 ImageIcon。
  7. 使用 setIcon(...).
  8. 将按钮的图标设置为上面的图标
  9. 不要在按钮或任何东西上调用 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));

图形对象有很多不同的功能,你可以在上面画任何你喜欢的东西。