Java 如何在捕获JPanel时仅捕获选定的组件图像?

Java 如何在捕获JPanel时仅捕获选定的组件图像?,java,swing,jpanel,Java,Swing,Jpanel,带3个按钮的JPanel,我只需要捕获其中两个 public static void grabScreenShot(JPanel panel) { BufferedImage image = (BufferedImage) panel.createImage( panel.getSize().width, panel.getSize().height); panel.paint(image.getGraphics()); File file = n

带3个按钮的JPanel,我只需要捕获其中两个

public static void grabScreenShot(JPanel panel) {
    BufferedImage image = (BufferedImage) panel.createImage(
            panel.getSize().width, panel.getSize().height);
    panel.paint(image.getGraphics());
    File file = null;
    file = new File("Customers");
    if (!file.exists()) {
        file.mkdir();
    }

    try {
        file = new File("Customers" + File.separator
                + String.valueOf(System.currentTimeMillis()));
        ImageIO.write(image, "png", file);
        System.out.println("Image was created");
    } catch (IOException e) {
        System.out.println("Had trouble writing the image.");
        e.printStackTrace();
    }
}

如何避免捕获不必要的组件。

您可以尝试覆盖按钮的
paintComponent()
,并引入标记needPaint。默认情况下,该标志为true

if (needPaint) {
    super.paintComponent(g);
}

在grabScreenShot()中,将隐藏按钮的标志设置为false,并在
panel.paint(image.getGraphics())之后将其重置呼叫

这里有很多选项,有些是黑客的,有些是干净的,有些是入侵的,有些不是。覆盖按钮的
paintComponent
(如一个答案中所建议的)可能是一个选项,但会使隐藏按钮的逻辑非常突出(考虑到这种捕获很可能是一种非常特殊的情况)。在按钮所在的位置画一个矩形(带有面板背景色)怎么样?类似于
g.setColor(panel.getBackground());((Graphics2D)g).fill(button.getBounds())应该这样做..不,实际上我忘了我没有使用按钮,但我使用的是
核心椭圆(mRgba,center1,size,0,0,360,新标量(255,0255),1,8,0)
从OpenCV库绘制椭圆。很抱歉…它应该仍然可以在椭圆上画一些东西(只需做
g.fill(新的Ellipse2D.Double(…);
),或者不画椭圆(用
g.setClip(…)
),就像StanislavL建议的那样,香港得到了它…非常感谢…@marco13如果问题得到了回答,你应该说你是怎么做到的(这样一条评论就可以变成一个答案),或者为你自己的问题写一个答案。事实上,我正在使用OpenCV,我只需要消失椭圆
核心。椭圆(mRgba,center,size,0,0,360,new Scalar(255,0255),1,8,0);
这是不可能使用
paintComponent()
method。如果你有按钮的边界,你可以为剪辑形状定义边界被排除的区域。只需将剪辑形状设置为你的图形实例。@StanislavL通过停止重新绘制-setIgnoreRepaint以编程方式,但我不知道(是否存在,以及如何存在)影响paintChildren@mKorbel我猜按钮根本就没有孩子。对不起大家
Core.eliple(mRgba,中心,大小,0,0,360,新标量(255,0,255),1,8,0);
不是任何Swing组件,它来自
org.opencv.Core.Core;
包我不知道如何防止它在屏幕上绘制?