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