哪种方法是使用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) 我JPanel添加了一个JViewport,面板上还添加了其他几个面板.我正在尝试实现拖动选择,您可以通过拖动鼠标选择多个组件.我面临的唯一问题是选择矩形被绘制在添加到main的组件后面JPanel.我怎样才能在它们上面画画?
我的结构如下:JFrame- > ContentPane- > JLayeredPane- > JScrollPane- > JPanel- > JPanel [].
大学作业设计草案:
如您所见,矩形位于其他面板的后面.

我目前正在使用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)
如果这个问题已被提出,我很抱歉,但我找不到类似的东西.
我一直在尝试为我正在开发的小游戏实现基本文本泡泡.不想过于花哨,我开始使用一个基本的圆角矩形,边框包含一些文字:

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

在这里,您可以看到当左边的气泡褪色时,与褪色前相比,它的圆角会改变形状,而右边圆角上的气泡不会改变.实际上,左边的气泡是在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) 我试图复制这个组件(在帖子的底部),但我似乎无法让它看起来很好看.

所以我想知道,我该如何复制这种渐变涂料?或者,如果它不是渐变涂料,我该怎么做才能得到类似的结果?
与此组件相比,我的尝试变得非常平坦.它还有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构建棋盘游戏.对于游戏板本身,我试图将板的图像作为整个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) 我有一个框架,图像覆盖它,我希望每次有人点击图像中的不同对象,它将作为一个按钮,做一些事情.
问题是,这些对象是不是简单的形状,所以我想在这些对象的形状中绘制我自己的隐形按钮.
那可能吗?或者什么是更好的方式来完成这样的事情?
-谢谢
我有以下内容:
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) 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) 我无法为我的作业复制图片.我将不胜感激任何提示或解决方案.我相信我有一般的想法,但我很难找出数学来复制图像并在一个循环中完成所有事情.
我的程序需要满足以下条件:
这是图像:
这是我到目前为止所尝试的
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)