如何获取Swing小部件的图像?

时间:2012-08-15 14:14:34

标签: java swing java-canvas

  

可能重复:
  Java Swing : Obtain Image of JFrame

我正在开发一个简单的拖放式Java GUI构建器。它到目前为止工作,但我拖放的小部件只是我正在画布上动态绘制的矩形。

如果我有一个表示像JButton这样的小部件的矩形,有没有办法让我创建一个JButton,设置大小并获取该JButton的图像(如果它是在屏幕上绘制的)?然后我可以将图像绘制到屏幕上,而不仅仅是我无聊的矩形。

例如,我现在正在这样画一个(红色)矩形:

public void paint(Graphics graphics) {
    int x = 100;
    int y = 100;
    int height = 100;
    int width = 150;

    graphics.setColor(Color.red);
    graphics.drawRect(x, y, height, width);
}

我该怎么做:

public void paint(Graphics graphics) {
    int x = 100;
    int y = 100;
    int height = 100;
    int width = 150;

    JButton btn = new JButton();
    btn.setLabel("btn1");
    btn.setHeight(height); // or minHeight, or maxHeight, or preferredHeight, or whatever; swing is tricky ;) 
    btn.setWidth(width);
    Image image = // get the image of what the button will look like on screen at size of 'height' and 'width'

    drawImage(image, x, y, imageObserver);
}

1 个答案:

答案 0 :(得分:1)

基本上,您可以将组件绘制到图像上,然后将图像绘制到任何您想要的位置。在这种情况下,可以直接调用paint,因为你没有画到屏幕上(但是没有画到内存位置)。

如果您希望优化代码比我在此处完成的更多,您可以保存图像,只需在移动时将其重新绘制在不同的位置(而不是每次屏幕重新绘制时都从按钮计算图像)

import java.awt.*;
import java.awt.image.BufferedImage;

import javax.swing.*;

public class MainPanel extends Box{

    public MainPanel(){
        super(BoxLayout.Y_AXIS);
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);

        // Create image to paint button to
        BufferedImage buttonImage = new BufferedImage(100, 150, BufferedImage.TYPE_INT_ARGB);
        final Graphics g2d = buttonImage.getGraphics();

        // Create button and paint it to your image
        JButton button = new JButton("Click Me");
        button.setSize(button.getPreferredSize());
        button.paint(g2d);

        // Draw image in desired location
        g.drawImage(buttonImage, 100, 100, null);
    }

    public static void main(String[] args){
     final JFrame frame = new JFrame();
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.add(new MainPanel());
     frame.pack();
     frame.setSize(400, 300);
     frame.setLocationRelativeTo(null);
     frame.setVisible(true);
    }
}