标签: paintcomponent

用Java绘制像素图像

哪种方法是使用java创建像素图像的最佳方法.比如,我想创建一个尺寸为200x200的像素图像,总共为40.000像素.如何从随机颜色创建像素并将其渲染到JFrame上的给定位置.

我试图创建一个只创建像素的自己的组件,但是如果我使用for循环创建这样一个像素250,000次并将每个实例添加到JPanels布局中,这似乎不是非常高效.

class Pixel extends JComponent {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(getRandomColor());
        g.fillRect(0, 0, 1, 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

java swing pixel graphics2d paintcomponent

7
推荐指数
2
解决办法
2万
查看次数

在Swing中绘制组件顶部?

JPanel添加了一个JViewport,面板上还添加了其他几个面板.我正在尝试实现拖动选择,您可以通过拖动鼠标选择多个组件.我面临的唯一问题是选择矩形被绘制在添加到main的组件后面JPanel.我怎样才能在它们上面画画?

我的结构如下:
JFrame- > ContentPane- > JLayeredPane- > JScrollPane- > JPanel- > JPanel [].

大学作业设计草案:
如您所见,矩形位于其他面板的后面.

大学任务设计草案.

java swing jpanel miglayout paintcomponent

7
推荐指数
2
解决办法
8034
查看次数

Java游戏2D重叠阴影与Swing

我目前正在使用Swing作为我的主要绘图组件开发2D Java游戏.每个对象都有一个阴影(BufferedImage),但每个阴影都与其他阴影重叠.是否可以只让阴影不相互重叠?因为如果物体在它下面,我仍然希望阴影在玩家上方绘制,而不是如果物体在玩家之上.为清晰起见,这是一张图片:

截图

我看过alpha合成,我想我需要Source Out?我还想过让所有阴影(没有透明度)在一个图层上绘制,然后用透明度绘制它,然后它不会像以前那样在玩家和其他对象上绘制.

我有一个Draw对象,它是一个JPanel并覆盖paintComponent方法.在这个方法中,我绘制当前房间的地板,然后迭代属于当前房间的对象列表,并调用每个对象的绘制方法来绘制所有内容.

对象绘制方法:

public void draw(Graphics g) {
    if (visible && checkInScreen()) {

        // The required drawing location
        int drawLocationX = getX() - globalCameraX;
        int drawLocationY = getY() - globalCameraY;

        if (shadow) {
            g.drawImage(shadowImages.get(imageIndex),
                    drawLocationX + shadowOffset.x + (getImageWidth()/2),
                    drawLocationY + shadowOffset.y, null);
        }
        g.drawImage(images.get(imageIndex), drawLocationX, drawLocationY, null);

        //Collisionbox
        if (SHOW_COLLISION_BOXES){
            g.setColor(Color.WHITE);
            g.drawRect(drawLocationX + getCollBoxX(), drawLocationY + getCollBoxY(), getCollBoxW() - getCollBoxX(), getCollBoxH() - getCollBoxY());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果这个问题已被提出,我很抱歉,但我找不到类似的东西.

java swing java-2d paintcomponent

7
推荐指数
1
解决办法
421
查看次数

在BufferedImage上绘制具有不透明度的圆角矩形

我一直在尝试为我正在开发的小游戏实现基本文本泡泡.不想过于花哨,我开始使用一个基本的圆角矩形,边框包含一些文字:
基本文字泡泡

然后,我决定文本气泡应该在预设时间后淡出.这就是我偶然发现问题的地方:当我试图在测试窗口中显示气泡时,一切正常,但是当我在游戏中显示它们时,当气泡消失时会出现失真.我测试了一些,调试了,发现两种情况之间的唯一区别是在测试窗口我使用paintComponent方法的Graphics绘制了气泡,而在游戏中我使用BufferedImages来模拟图层并使用来自image.createGraphics的图形.然后我可以成功复制错误:
显示错误的Gif

在这里,您可以看到当左边的气泡褪色时,与褪色前相比,它的圆角会改变形状,而右边圆角上的气泡不会改变.实际上,左边的气泡是在BufferedImage上绘制的,然后在面板上绘制,而右边的气泡直接在面板上绘制.
我已经隔离了重现问题所需的代码:

public static void main(String[] args) {

    JFrame frame = new JFrame("Test");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setSize(400, 400);

    JPanel panel = new JPanel() {

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

            BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
            Graphics graphics = image.createGraphics();

            paintExampleBubble(graphics, 50, 50);

            g.drawImage(image, 0, 0, this);

            paintExampleBubble(g, 250, 50);
        }
    };

    frame.getContentPane().add(panel);
    frame.setVisible(true);
}

private static final Color background = new Color(1f, 1f, 1f, 0.5f);
private static final Color foreground = new Color(0f, 0f, 0f, 0.5f); …
Run Code Online (Sandbox Code Playgroud)

java swing transparency paintcomponent

7
推荐指数
1
解决办法
452
查看次数

使用渐变绘画复制此组件需要做什么?

我试图复制这个组件(在帖子的底部),但我似乎无法让它看起来很好看.

在此输入图像描述

所以我想知道,我该如何复制这种渐变涂料?或者,如果它不是渐变涂料,我该怎么做才能得到类似的结果?

与此组件相比,我的尝试变得非常平坦.它还有JFrame选项(关闭,最小化等),它没有组件的"圆润"外观.我正在寻找能够改善我所拥有的东西并解释我哪里出错的人.我知道我可以简单地使用已经制作的外观,但我希望我的示例项目尽可能接近除了文本的图像中的BitDefender GUI.(如果需要,我可以提供代码)

另请注意,我跳过了Background和'Virus Shield','Auto Scan','My BitDefender'面板之间的面板.我这样做主要是因为我想让我的SSCCE尽可能小.

另外我想要注意的是gbc.insets = new Insets(2,10,2,10);,在3上设置insets TopPanels使它看起来更接近BitDefender GUI的间距.(我现在没有时间上传图片.所以我按原样保留了代码,但我确实知道它可以更新到上面的插图中.

在此输入图像描述

编辑 - 更新了更多来源

这是我的代码/ SSCCE(它是3个单独的类,但我将它们合并为一个.java)

package testgui;

import java.awt.*;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class TestGui {

    public TestGui() {
        JFrame frame = new JFrame();
        MidPanel midPanel = new MidPanel();
        TopPanel topPanel1 = new TopPanel();
        TopPanel topPanel2 = new TopPanel();
        TopPanel topPanel3 = new TopPanel();
        JLabel appName = new JLabel("MyApplication");
        JLabel verNum = new JLabel("version 1.0");
        Font verFont = …
Run Code Online (Sandbox Code Playgroud)

java graphics swing gradient paintcomponent

6
推荐指数
1
解决办法
556
查看次数

将背景图像添加到JPanel

我正在用Java构建棋盘游戏.对于游戏板本身,我试图将板的图像作为整个JPanel的背景,填充JFrame.我找到了一种方法来做到这一点,但只有本地存储的文件,它需要能够从GUI内部的图像中获取图像.

package Gui;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

//Proof of concept for setting an image as background of JPanel

public class JBackgroundPanel extends JPanel {
    private BufferedImage img;

    public JBackgroundPanel() {
        // load the background image
        try {
            img = ImageIO.read(new File(
                    "C:\\Users\\Matthew\\Desktop\\5x5     Grid.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // paint the background image and scale it to fill the entire space
        g.drawImage(img, …
Run Code Online (Sandbox Code Playgroud)

java swing image jpanel paintcomponent

6
推荐指数
1
解决办法
1万
查看次数

如何创建复杂的Button形状?

我有一个框架,图像覆盖它,我希望每次有人点击图像中的不同对象,它将作为一个按钮,做一些事情.
问题是,这些对象是不是简单的形状,所以我想在这些对象的形状中绘制我自己的隐形按钮.

那可能吗?或者什么是更好的方式来完成这样的事情?

-谢谢

java swing image button paintcomponent

6
推荐指数
1
解决办法
962
查看次数

AffineTransform似乎忽略了组件边界

我有以下内容:

public class ParametricEQView extends JPanel implements PluginView {
    private static final int BAND_WIDTH = 3;
    private static final int THROW_HEIGHT = 64;

    private static final int WIDTH = 128*BAND_WIDTH + 2*MARGIN;
    private static final int HEIGHT = 2*THROW_HEIGHT + 2*MARGIN;
    private static final int MID_HEIGHT = THROW_HEIGHT + MARGIN;

    private final ParametricEQ _peq;

    public ParametricEQView(ParametricEQ peq) {
        super();
        _peq = peq;

        SwingUtils.freezeSize(this, WIDTH, HEIGHT);
        setToolTipText("Parametric Equalizer");
    }

    @Override
    public void paint(Graphics g) {
        final Graphics2D g2d = (Graphics2D) g; …
Run Code Online (Sandbox Code Playgroud)

java swing jpanel affinetransform paintcomponent

6
推荐指数
1
解决办法
115
查看次数

在另一个类中调用Repaint()方法

repaint()我的Java代码中的方法有问题.我想在另一个中调用它,class但我不能,有些东西根本不起作用.我在论坛上搜索过,但没有任何东西可以帮助我.

我的主要 class:

public class Main {

public static Main main;
public static JFrame f;
public Main(){

}

public static void main(String[] args) {
    main = new Main();

    f = new JFrame();
    Ball b = new Ball();

    f.getContentPane().setBackground(Color.GRAY);

    f.add(b);
    f.setSize(500, 500);
    f.setLocationRelativeTo(null);
    f.setTitle("Test");
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.addMouseMotionListener(b);
    f.addKeyListener(new Key());


}
}
Run Code Online (Sandbox Code Playgroud)

class在我创建用于移动形状的2DGraphics的:

public class Ball extends JLabel implements MouseMotionListener{

public Ball(){

}

public static double x = 10;
public static double …
Run Code Online (Sandbox Code Playgroud)

java swing repaint paintcomponent

6
推荐指数
1
解决办法
565
查看次数

从直线嵌套抛物线曲线

我无法为我的作业复制图片.我将不胜感激任何提示或解决方案.我相信我有一般的想法,但我很难找出数学来复制图像并在一个循环中完成所有事情.

我的程序需要满足以下条件:

  1. 匹配图像
  2. 为每对抛物线生成随机颜色
  3. 适用于任何宽度或高度
  4. 使用单个循环绘制整个图形.

这是图像: 图片 这是我到目前为止所尝试的

public static final int WIDTH = 500;
public static final int HEIGHT = 500;
public static final int LINE_INCREMENT = 5;

public static void main(String[] args) {

    DrawingPanel panel = new DrawingPanel(WIDTH, HEIGHT);
    Graphics g = panel.getGraphics();
    int d = 0;

    int iterations = HEIGHT/LINE_INCREMENT;
    Random rand = new Random();
    int red = 0, green = 0, blue = 0;
    red = rand.nextInt(128) + 128;
    green = rand.nextInt(128) + 128;
    blue = …
Run Code Online (Sandbox Code Playgroud)

java swing curve paint paintcomponent

5
推荐指数
1
解决办法
366
查看次数