Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java jpanel与repain()的同步或:是否可以将侦听器添加到swing的重新绘制?_Java_Multithreading_Swing_Jpanel_Jcomponent - Fatal编程技术网

java jpanel与repain()的同步或:是否可以将侦听器添加到swing的重新绘制?

java jpanel与repain()的同步或:是否可以将侦听器添加到swing的重新绘制?,java,multithreading,swing,jpanel,jcomponent,Java,Multithreading,Swing,Jpanel,Jcomponent,我正在为一个miscropy程序编写一个插件,但在重新绘制方法上有问题 简短问题: 是否有任何方法可以在重新绘制JPanel后立即得到通知,或者将代码与之同步 详细版本: 我的程序可以将xy图表中的一组数据绘制到JPanel,并使用jfree.chart显示;在程序的另一部分中,我有许多数据集~100,我想绘制并保存为图像。我也找到了解决办法,但我真的不喜欢。问题可以归结为一个关于JPanel绘制状态的通知 在保存所有图像的部分,我有一个解决方案: PlotSpectrum spectrumWi

我正在为一个miscropy程序编写一个插件,但在重新绘制方法上有问题

简短问题: 是否有任何方法可以在重新绘制JPanel后立即得到通知,或者将代码与之同步

详细版本:

我的程序可以将xy图表中的一组数据绘制到JPanel,并使用jfree.chart显示;在程序的另一部分中,我有许多数据集~100,我想绘制并保存为图像。我也找到了解决办法,但我真的不喜欢。问题可以归结为一个关于JPanel绘制状态的通知

在保存所有图像的部分,我有一个解决方案:

PlotSpectrum spectrumWindow = getTheWindow(); //pseudo code...
// some stuff
ti = storage.getImage(channel, slice, frame, position);
spectrumWindow.plotData(false, andor.captureSpectrum(ti.pix), wave,
                 centerWave, fineGrating, exposureTime,
                 slitWidth, substractBackground);
spectrumWindow.repaint(); // probably not necessary
sleep(100);               // this annoys me...
spectrumWindow.savePlot(path, true, config, null);
spectrumWindow是一个JPanel,它也显示在另一个窗口中,一切正常。 但我真的不喜欢那里的睡眠。。。如果没有它,我会要求重新绘制,但在我尝试保存快照之前它不会完成这就是savePlot正在做的。。。。我知道,其他线程和这些该死的同步问题。。。 在睡觉的时候,我只是让它变得不必要的慢,如果我等待的时间不够长,图像就不能完全画出来,比如下半部分就不见了

有没有办法在重新喷漆完成后立即得到通知?我可能也会很好地与一个听众,最好是一个解决方案与显示器或类似的东西,或是一个方法,是重画现在不存在,据我所知? 主GUI包括JPanel spectrumWindow,早期粘贴的代码在不同的线程中运行

下面是我代码中可能也是重要的部分。请原谅,如果一些括号不匹配或一些变量没有声明,我删除了很多代码

谢谢 schetefan24

class PlotSpectrum extends ApplicationFrame // that extends JFrame
{
public void plotData(boolean backgroundGiven, int[] spect, double[] wave_,
                     double centerWave, boolean fineGrating_, double exposureTime,
                     double slitWidth, boolean substractBackground)
{
//process data and store internally
replot();
}

private void replot()
{
XYSeries series = new XYSeries("Spectrum");
//add data to series
XYSeriesCollection collection = new XYSeriesCollection(series);
//setting up some labels and such stuff...
 JFreeChart chart = ChartFactory.createXYLineChart(
        title,
        "Wavelength [nm]", 
        yLabel, 
        collection,
        PlotOrientation.VERTICAL,
        false,
        false,
        false
    );
 dataPanel.add(new ChartPanel(chart)); // this is contained in a Frame
}

public void savePlot(String path, boolean overWriteAll, HashMap<String,String> config, int[][] addData)
{
File output = new File(path);
//some more stuff, ask overwrite etc
if(image)
{
    BufferedImage im = createImage();
    String extension = path.substring(path.lastIndexOf(".")+1, path.length());
    ImageIO.write(im, extension, output);
} else {
//that is an textexport, works fine
}
}

public BufferedImage createImage()
{
    JPanel panel = (JPanel) flipChart.getSelectedComponent();
    int w = panel.getWidth();
    int h = panel.getHeight();
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = bi.createGraphics();
    panel.paint(g);
    return bi;
}
}
我想打印并另存为图像

将数据添加到不可见的面板。 创建面板的缓冲区图像 使用上面的图像创建图像图标 使用设置图标更新已添加到帧中的JLabel。。。方法 当图标更改时,上述步骤应生成PropertyChange事件。您可以使用ProperthAngelistener侦听此事件。收到事件后,可以重复步骤1-4。 退房。它将帮助您创建不可见组件的图像


注意,您实际上不需要执行步骤4-5。我刚刚添加了它们,这样你就可以看到正在处理的绘图。如果您不想要可视化,那么您可能只需要在JLabel上显示文本,指示当前正在转换的绘图。

到步骤1:您是指新的JPanel还是可以将现有的JFrame转换为PlotSpectrum类?在我的代码中做一些小的修改,我应该能够创建一个带有图像的面板。。。与BuffereImage相比,ImageIcon上的可视化不一定是什么不同?@schetefan24这个想法是在内存中创建面板,而不是将其添加到框架中,因为您的问题是您不知道何时会绘制面板。通过在内存中创建面板并创建自己的面板图像,您可以控制过程,而不是Swing的绘制机制。我已经测试了一点可见性和事件触发器:最简单的方法是,在我开始保存之前将整个帧设置为不可见,然后调用pack刷新图像:D看起来仍然有点脏,但执行得很好:谢谢您的提示和可见性;似乎我用它把框架从控制中移除了