Java 在同一帧上重新计算直方图,并使用JFreechart重新绘制直方图

Java 在同一帧上重新计算直方图,并使用JFreechart重新绘制直方图,java,image,swing,histogram,jfreechart,Java,Image,Swing,Histogram,Jfreechart,在我的主要项目中,我有一个类,它使用JFreeChart在一个框架中绘制直方图。从这个框架中,我希望能够用用户想要的垃圾箱数量来回复柱状图 为了做到这一点,我添加了一个带有文本字段和按钮的菜单,用户可以在其中选择垃圾箱的数量。当他按下按钮时,整个框架将重新安装新数量的垃圾箱 我的问题是,它不会被绘制,旧的帧会被处理,但它不会绘制一些东西,而是创建一个空帧。我没有得到任何错误或异常,所以我不知道问题可能出在哪里。我怀疑它与JChart类或dataset有关,但我找不到任何关于什么不起作用的信息 我

在我的主要项目中,我有一个类,它使用JFreeChart在一个框架中绘制直方图。从这个框架中,我希望能够用用户想要的垃圾箱数量来回复柱状图

为了做到这一点,我添加了一个带有文本字段和按钮的菜单,用户可以在其中选择垃圾箱的数量。当他按下按钮时,整个框架将重新安装新数量的垃圾箱

我的问题是,它不会被绘制,旧的帧会被处理,但它不会绘制一些东西,而是创建一个空帧。我没有得到任何错误或异常,所以我不知道问题可能出在哪里。我怀疑它与JChart类或dataset有关,但我找不到任何关于什么不起作用的信息

我试图从我的代码中创建MCVE代码。来自三个tiff图像,称为:

 "IMG_7911.CR2.R.TIFF", "IMG_7911.CR2.G.TIFF", "IMG_7911.CR2.B.TIFF"
(不管它们看起来如何,它们都可能是同一幅图像)我创建了一个默认大小为2^16=16384,16位的直方图。然后我希望用户能够从菜单中更改大小。为此,我使用“changeBinsSize”和“reDisplay”方法:

更新:我修改了代码,下载了一张随机照片,而不是tiff,所有频道都是同一张照片


有人能看到我做错了什么吗?我已经试了好几个小时,想看看哪里出了问题,但什么也找不到。

您当前的
changebinsize()
实现尝试替换视图组件。相反,更新模型,侦听视图将更新自身

我试图更新数据集,但我看不到任何删除序列的方法


addSeries()
方法根据存储箱的数量调整数据集的内部状态。因此,您需要从原始图像样本中重新创建
数据集
,将新的仓位计数作为参数传递给
addSeries()
。使用的
setDataset()
方法替换数据集,该数据集将通知侦听图进行自我更新。显示了一个完整的示例。

不要删除视图;更新数据集。在中,通过
URL
访问发布的图像,如图所示;如图所示使用合成图像;或者使用
UIManager
图标,如图所示。@trashgood我刚刚更新了MCVE,我想现在应该可以正常工作了,按照您的第一个答案,访问和URL。--我还试图更新数据集,但我看不到任何删除序列的方法,对于我的项目来说,重要的是RGB序列具有相同的索引,因为我有一些按钮作用于它们。啊,我明白你的意思;下面是更多。谢谢你,就这样。我必须习惯于看XYPlot类。必须使用它而不是直接在数据对象上工作,这是非常奇怪的。
 package mcve;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Paint;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JTextField;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.DefaultDrawingSupplier;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYBarPainter;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.data.statistics.HistogramDataset;

public class HistogramRAW {

private int BINS;
private Raster raster;//Load image
private String filename;
private RenderedImage image;

private JFreeChart chart; //Create histogram
private ChartPanel panel;
private HistogramDataset dataset;
private XYBarRenderer renderer;
private JMenuBar menuBar; //Menubar
private JMenu options;

private JTextField numBINS;
private JFrame f; //Frame

public HistogramRAW(String filename) {
    this.filename = filename;
    this.BINS = 16384;
}

private void getImage(String filename) {
    try {
        URL url = new URL(filename);
        final BufferedImage bi = ImageIO.read(url);
        raster=bi.getRaster();
        image=(RenderedImage)bi;

    } catch (IOException e) {
        e.printStackTrace(System.err);
        return;
    }
}

private ChartPanel createChartPanel() {
    // dataset
    dataset = new HistogramDataset();
    getImage(filename); //Put it here to get width and height from it
    final int w = image.getWidth();
    final int h = image.getHeight();

    double[] buffer = new double[w * h];

    //R
    buffer = raster.getSamples(0, 0, w, h, 0, buffer);
    dataset.addSeries("red", buffer, BINS);

    //G
    getImage(filename);
    buffer = raster.getSamples(0, 0, w, h, 0, buffer);
    dataset.addSeries("green", buffer, BINS);

    //B
    getImage(filename);
    buffer = raster.getSamples(0, 0, w, h, 0, buffer);
    dataset.addSeries("blue", buffer, BINS);

    //chart
    chart = ChartFactory.createHistogram("Histogram", "",
            "", dataset, PlotOrientation.VERTICAL, false, true, false);
    //Set colors
    XYPlot plot = (XYPlot) chart.getPlot();
    renderer = (XYBarRenderer) plot.getRenderer();
    renderer.setBarPainter(new StandardXYBarPainter());
    Paint[] paintArray = { // translucent red, green blue 
        new Color(0x800000ff, true),//blue
        new Color(0x8000ff00, true),//green1
        new Color(0x80ff0000, true)//red
    };
    plot.setDrawingSupplier(new DefaultDrawingSupplier(
            paintArray,
            DefaultDrawingSupplier.DEFAULT_FILL_PAINT_SEQUENCE,
            DefaultDrawingSupplier.DEFAULT_OUTLINE_PAINT_SEQUENCE,
            DefaultDrawingSupplier.DEFAULT_STROKE_SEQUENCE,
            DefaultDrawingSupplier.DEFAULT_OUTLINE_STROKE_SEQUENCE,
            DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE));

    //Create panel with chart
    panel = new ChartPanel(chart);
    panel.setMouseWheelEnabled(true);

    return panel;
}

private JMenuBar setMenuBar() {
    menuBar = new JMenuBar(); //Create Menubar

    options = new JMenu("Options"); //  menu.
    options.setMnemonic(KeyEvent.VK_O);
    menuBar.add(options);

    JPanel binsPanel = new JPanel(); //Change BINS size button
    numBINS = new JTextField("" + BINS);
    binsPanel.add(numBINS);
    JButton binsButton = new JButton("changeBins");
    binsButton.addActionListener(new MenuActionListener());
    binsPanel.add(binsButton);
    options.add(binsPanel);

    return menuBar;
}

public void display() throws CloneNotSupportedException {
    f = new JFrame("Histogram");
    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    f.add(createChartPanel(), BorderLayout.CENTER);
    f.setJMenuBar(setMenuBar());
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
}

public void reDisplay() throws CloneNotSupportedException {
    f.add(createChartPanel(), BorderLayout.CENTER);
    f.setJMenuBar(setMenuBar());
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);

}

public void changeBinsSize() {
    try {
        BINS = Integer.parseInt(numBINS.getText());
        f.removeAll();
        f.dispose();
        System.out.println("" + BINS);
        reDisplay();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    try {
        HistogramRAW hist = new HistogramRAW("https://upload.wikimedia.org/wikipedia/commons/thumb/8/80/Wikipedia-logo-v2.svg/245px-Wikipedia-logo-v2.svg.png");
        hist.display();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();

    }
}

private class MenuActionListener implements ActionListener {

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("changeBins")) {
            changeBinsSize();
        }
    }
}
}