Swing JPanel.add不会将组件添加到面板中

时间:2015-07-10 10:33:56

标签: java swing

我是Java Swing的新手。所以我遇到了在主窗口中添加组件的问题。

这是我的代码。

public class Utils {

    private static final float BITMAP_SCALE = 0.4f;
    private static final float BLUR_RADIUS = 7.5f;

    public static Drawable getResizedDrawable(Context context,
                                              int drawableResourceId, int imgWidth, int imgHeight) {

        Drawable drawableResource = ContextCompat.getDrawable(context, drawableResourceId);
        Bitmap bitmap = ((BitmapDrawable) drawableResource).getBitmap();
        Drawable drawableResizedBitmap = new BitmapDrawable(
                context.getResources(), Bitmap.createScaledBitmap(bitmap,
                imgWidth, imgHeight, true));

        return drawableResizedBitmap;
    }


    public static Bitmap blur(View v) {
        return blur(v.getContext(), getScreenshot(v));
    }

    public static Bitmap blur(Context ctx, Bitmap image) {
        int width = Math.round(image.getWidth() * BITMAP_SCALE);
        int height = Math.round(image.getHeight() * BITMAP_SCALE);

        Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false);
        Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);

        RenderScript rs = RenderScript.create(ctx);
        ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap);
        Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);
        theIntrinsic.setRadius(BLUR_RADIUS);
        theIntrinsic.setInput(tmpIn);
        theIntrinsic.forEach(tmpOut);
        tmpOut.copyTo(outputBitmap);

        return outputBitmap;
    }

    private static Bitmap getScreenshot(View v) {
        Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(b);
        v.draw(c);
        return b;
    }

}

当我在main方法中调用new MainFrame()时,我只有Button按钮。没有球。你能帮帮我吗?

2 个答案:

答案 0 :(得分:1)

将球放在BorderLayout.CENTER而不是BorderLayout.North

答案 1 :(得分:1)

@Marc_Alx如果你将球放在BorderLayout.North中,那么它会使用默认大小,即零。将其放在BorderLayout.CENTER中会使其展开以填充面板。

如果你真的想在BorderLayout.North中使用它,那么你应该为Ball创建一个构造函数来设置它的优先大小。

另请注意,Ball的paintComponent()方法中的第一行应为

super.paintComponent(g);

确保渲染正确的背景颜色,如果将球移动到其他位置,旧球图像将被删除。