更新JLabel图像,通过选择动态

时间:2012-10-02 07:03:43

标签: java image swing jlabel imageicon

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

3 个答案:

答案 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)

感谢DanAndrew Thompson,我有一个有效的产品。

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

完成的代码段如下所示:

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

例如,这将创建图表; chart1 chart2 chart3 等等。