所以基本上我创建了一个允许用户选择文件的GUI,这个文件被检查为.wav文件。然后通过JFreechart绘制该文件的数据。 这个由Jfreechart创建的图形或图像我想放入JFrame。 问题是代码:
ImageIcon myIcon1 = new ImageIcon("blah.jpg");
JLabel graphLabel1 = new JLabel(myIcon1);
southContent.add(graphLabel1);
必须创建&在我创建JFrame的方法中声明(必须添加到框架中) 因此,根据用户选择的文件,我无法动态地将图像更新为新创建的图形。 (在选择新文件时,通过按钮创建新的图形图像)
有没有办法强迫
ImageIcon myIcon1 = new ImageIcon("blah.jpg");
JLabel graphLabel1 = new JLabel(myIcon1);
southContent.add(graphLabel1);
更新到新图像(在同一个目录中,使用相同的名称)
或者有没有办法使用Mapping来动态设置图像名称(" blah.jpg")?
这是我的SSCCE
public class gui extends JFrame {
ImageIcon myIcon1 = new ImageIcon("C:/location/chart1.jpg");
JLabel graphLabel1 = new JLabel(myIcon1);
gui() {
// create Pane + contents & listeners...
JPanel content = new JPanel();
JPanel southContent = new JPanel();
content.setLayout(new FlowLayout());
content.add(open_File);
// Jfreechart graph image -- not visible until selected
graphLabel1.setVisible(false);
// this is the graph image being added to the panel
southContent.add(graphLabel1);
southContent.setLayout(new FlowLayout());
// add action listeners to buttons
open_File.addActionListener(new OpenAction());
// set Pane allignments & size...
this.setContentPane(content);
this.add(southContent, BorderLayout.SOUTH);
this.setTitle("Count Words");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(1100, 720);
this.setLocationRelativeTo(null);
}
// opening selected file directory.
class OpenAction implements ActionListener {
public void actionPerformed(ActionEvent ae) {
/// gets user selection ( file ) and procesess .wav data into array
/// loops through array creating X series for JfreeChart
// Add the series "series" to data set "dataset"
dataset.addSeries(series);
// create the graph
JFreeChart chart = ChartFactory.createXYLineChart(
".Wav files", // Graph Title
"Bytes", // X axis name
"Frequency", // Y axis name
dataset, // Dataset
PlotOrientation.VERTICAL, // Plot orientation
true, // Show Legend
true, // tooltips
false // generate URLs?
);
try {
ChartUtilities.saveChartAsJPEG(
new File("C:/location/chart1.jpg"), chart, 1000, 600);
} catch (IOException e) {
System.err.println("Error occured: " + e + "");
}
// !!!!! this is where i need to set the ImageIcon added to the
// panel in "gui" to this new created Graph image ("chart1.jpg")
// as above
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// sets the image label itself to visible as a new image has been
// added ot it
graphLabel1.setVisible(true);
}
}
}
答案 0 :(得分:3)
只需像往常一样将JLabel
添加到其容器中。然后,一旦您创建了图片并且您拥有ImageIcon
的实例,只需为setIcon()
调用JLabel
方法。
答案 1 :(得分:3)
使用这样的东西应该允许显示波形的两个图像,以及波形的新图像。
try {
//ChartUtilities.saveChartAsJPEG(
// new File("C:/location/chart1.jpg"), chart, 1000, 600);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ChartUtilities.saveChartAsPNG(baos, chart, 1000, 600);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
BufferedImage image = ImageIO.read(bais);
// !!!!! this is where we need to set the ImageIcon..
graphLabel1.setIcon(new ImageIcon(image));
} catch (IOException e) {
e.printStackTrace();
System.err.println("Error occured: " + e + "");
}
OTOH您可能希望增加内存大小并一次生成整个波形,然后在滚动窗格中显示标签。
答案 2 :(得分:1)
感谢Dan和Andrew Thompson,我有一个有效的产品。
我使用计数变量计算教学时间,选择“OpenAction”按钮。 然后,我使用此变量为我通过JFreechart创建的每个图像创建动态名称。 因此,我使用.setIcon将图标图像重置为每个新创建的图像,并使用新名称。 如果您尝试将标签重置为与先前选择的图像图标同名的图像图标,则.setIcon似乎不起作用。
完成的代码段如下所示:
ImageIcon myIcon1 = new ImageIcon(“C:/ location / chart”+ CounterVariable +“。png”);
graphLabel1.setIcon(myIcon1);