2

所以基本上我创建了一个允许用户选择文件的 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);

更新到新图像(在同一个目录中,同名)

或者有没有办法使用映射来使用计数器动态设置图像名称(“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);
        }
    }
}
4

3 回答 3

3

只需JLabel像往常一样将其添加到其容器中。然后,一旦你创建了图像并且你有一个 的实例,ImageIcon只需调用setIcon().JLabel

于 2012-10-02T07:19:06.543 回答
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,您可能希望增加内存大小并一次性生成整个波形,然后在滚动窗格中显示标签。

于 2012-10-02T08:14:11.067 回答
1

感谢DanAndrew Thompson,我有一个工作产品。

我使用计数变量来计算选择“OpenAction”按钮的教学时间。然后我使用这个变量为我通过JFreechart创建的每个图像创建动态名称。因此,我使用 .setIcon 将图标图像重置为具有新名称的每个新创建的图像。如果您尝试将标签重置为与先前选择的图像图标同名的图像图标,.setIcon 似乎不起作用。

完成的代码段如下所示:

ImageIcon myIcon1 = new ImageIcon("C:/location/chart"+CounterVariable+".png");
graphLabel1.setIcon(myIcon1);

例如,这将创建图表;图表 1 图表 2 图表 3 等等。

于 2012-10-02T12:25:01.627 回答