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

Java 通过选择动态更新JLabel图像,java,image,swing,jlabel,imageicon,Java,Image,Swing,Jlabel,Imageicon,基本上,我正在创建一个GUI,允许用户选择一个文件,这个文件是一个.wav文件。然后,该文件的数据以图形形式显示出来。 这个由Jfreechart创建的图形或图像我想放到JFrame中。 问题在于代码: ImageIcon myIcon1 = new ImageIcon("blah.jpg"); JLabel graphLabel1 = new JLabel(myIcon1); southContent.add(graphLabel1); 必须在我创建JFrame的方法中创建和声明

基本上,我正在创建一个GUI,允许用户选择一个文件,这个文件是一个.wav文件。然后,该文件的数据以图形形式显示出来。 这个由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);
        }
    }
}

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

setIcon()
方法,使用类似的方法应该允许显示波形的两个图像以及波形的新图像

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 + "");
}
o您可能希望增加内存大小,一次生成整个波形,然后在滚动窗格中显示标签。

多亏了和,我有了一个可用的产品

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

完成的代码段如下所示:

ImageIcon myIcon1=新的ImageIcon(“C:/location/chart”+计数器变量+”.png”)
graphLabel1.setIcon(myIcon1)

例如,这将创建图表; 图表1 图表2 图表3
诸如此类。

“必须在我创建JFrame的方法中创建和声明”或者这一切都可以通过使
graphLabel1
成为一个对后面的方法可见的类级属性来解决,或者我不知道您在说什么。。或者两者兼而有之。为了更快地获得更好的帮助,请发布一篇文章。我相信graphLabel1是类级别的。很抱歉给您带来不便,我发布了一个SSCCE。1)我无法理解为什么有人会使用JPEG对图表进行编码。试试PNG。2)
/!!!!!这就是我需要设置ImageIcon..
No的地方。这样做的地方应该在try中,直接在代码正在尝试的语句之后。如果失败,设置图标是没有意义的。3) 似乎磁盘访问只是为了确保图像显示。这就不必要了。使用w。BAOS.graphLabel1.setIcon(新的ImageIcon(“C:/imagelocation/image.jpg”);似乎根本没有更新。不知道为什么。我必须推出一个包含图像的新JFrame,我可以在其中本地添加imageIcon。如果图像的路径正确,那么它应该可以工作。我刚刚尝试过。没有语法错误。java.lang.NullPointerException错误,所以文件目录一定是错误的,对吗?我刚刚检查了它不是。你是在哪一行得到NPE的?@user1405235:请看一下我的答案,这个:-)