1

可能重复:
Java Swing:获取ImageJFrame

我正在开发一个小的拖放式 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);
}
4

1 回答 1

0

基本上,您会将组件绘制到图像上,然后在您想要的任何位置绘制该图像。在这种情况下,可以直接调用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);
    }
}
于 2012-08-15T15:18:27.173 回答