gpt4 book ai didi

java - 在缓冲图像上绘制油漆?

转载 作者:行者123 更新时间:2023-12-01 11:40:25 24 4
gpt4 key购买 nike

大家好,我知道这是一个常见的问题,但我已经搜索了很多,似乎无法让我的绘画方法在我的 JPanel 中绘制组件。

我的绘画方法与按钮按下相关联。它打印出大约 1500 个数据点及其分配的簇 (kmeans)

 package eye_pathscanner;


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class ReplayData extends JPanel {

// replay type can be parsed as argument into draw() to change paints behaviour
private int ReplayType = 0;

public ArrayList<DataPoint> points;

//Initialise records
public ReplayData()
{
points = new ArrayList<DataPoint>();
}

public void ReplaceData() {
points = new ArrayList<DataPoint>();
}

public void PrintPoints()
{

}
public void addPoint(DataPoint point) {
points.add(point);

}

@Override
public void paintComponent(Graphics g) {

Color black = new Color(0, 0, 0);
Random random = new Random();
final float luminance = 0.9f;

if (ReplayType == 1)
{
super.paintComponent(g);

for (int x = 0; x < kMeans.NUM_CLUSTERS; x++)
{
// Saturation ideal between 0.1 and 0.3
float saturation = (random.nextInt(2000) + 1000) / 10000f;
float hue = random.nextFloat();
Color cluster_colour = Color.getHSBColor(hue, saturation, luminance);

// Randomise the border colour
saturation = (random.nextInt(2000) + 1000) / 10000f;
hue = random.nextFloat();
Color cluster_colour_border = Color.getHSBColor(hue, saturation, luminance);

double centroidx = kMeans.centroids.get(x).getmX();
double centroidy = kMeans.centroids.get(x).getmY();

for (int i = 0; i < kMeans.TOTAL_DATA; i++)
if(kMeans.dataSet.get(i).cluster() == x){
// Set each child data point to a colour so you can see which cluster it belongs too
g.setColor(cluster_colour);
g.fillRect((int)TrackerData.getRecordNumber(i).getEyeX(),(int)TrackerData.getRecordNumber(i).getEyeY(), 3, 3);
g.drawLine((int)kMeans.dataSet.get(i).X(),(int)kMeans.dataSet.get(i).Y(), (int)centroidx, (int)centroidy);
//g.setColor(Color.black);
g.setColor(cluster_colour_border);
g.drawRect((int)TrackerData.getRecordNumber(i).getEyeX(),(int)TrackerData.getRecordNumber(i).getEyeY(), 3, 3);
}

g.setColor(black);
g.fillOval((int)centroidx,(int)centroidy, 15, 15);


}
}


}

// 1 for K-means with different colour cluster groups
// 2 for slow replay

public void draw(int i) {
ReplayType = i;
repaint();
}

}

这段代码对我来说非常有用,但是在使用它后我丢失了在油漆下面绘制的图像。我可以最大化页面,图像会再次显示,但在油漆上方? (任何人都可以解释这种行为)。

    JLabel picture_panel = new JLabel();
picture_panel.setBounds(70, 130, 640, 797);
picture_panel.addMouseListener(this);
BufferedImage img = null;

try
{
img = ImageIO.read(new File("C:/Eyetracker_Images/Random.jpg")); // eventually C:\\ImageTest\\pic2.jpg
ImageIcon icon = new ImageIcon(img);
picture_panel.setIcon(icon);

}
catch (IOException e)
{
e.printStackTrace();
}

这是创建我的图像的地方,其名称如下所示在我的一个按钮上

 replayData.setBounds(0, 0, 802, 977);
frame.getContentPane().add(replayData);
replayData.draw(1);

任何帮助将不胜感激,谢谢。

最佳答案

这可能是使用setBounds()的产物。此外,您似乎正在使用默认布局管理器,而没有在封闭容器上调用 pack()

由于您已经有一个包含渲染图像的 BufferedImage,因此只需在 paintComponent() 的实现中调用 drawImage() 即可。例子见here , herehere .

还可以考虑重写 ReplayDatagetPreferredSize() 方法,如建议的 herehere ,确定其尺寸。

关于java - 在缓冲图像上绘制油漆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29573507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com