【问题标题】:using file created in one private actionperformed event in another使用在另一个私有 actionperformed 事件中创建的文件
【发布时间】:2011-10-27 06:15:17
【问题描述】:

我是 Java 初学者,我想为我的项目创建一个非常简单的音频隐写术。 首先,我从一个包含三个按钮的框架开始,这些按钮从用户那里获取一个文本文件和 .wav 文件,以及一个开始编码的按钮。我使用带有前两个按钮的文件选择器来输入文件。我希望我的“开始”按钮的actionPerformed 事件将这两个文件的内容转换为字节。之后,我计划使用 LSB 算法将我的文本文件隐藏在 .wav 文件中。 我的问题是如何在private void beginActionPerformed 方法中使用文件“tfile”和“afile”?

import java.io.File;
import java.io.FileInputStream;
import javax.swing.JFileChooser;

public class second extends javax.swing.JFrame {

    /** Creates new form second */
    public second() {
        initComponents();
    }


    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        text = new javax.swing.JButton();
        audio = new javax.swing.JButton();
        tname = new javax.swing.JLabel();
        aname = new javax.swing.JLabel();
        begin = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        text.setText("TEXT FILE");
        text.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                textActionPerformed(evt);
            }
        });

        audio.setText("AUDIO FILE");
        audio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                audioActionPerformed(evt);
            }
        });

        begin.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        begin.setText("BEGIN");
        begin.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                beginActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(87, 87, 87)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(text, javax.swing.GroupLayout.Alignment.LEADING,     javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(audio, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(layout.createSequentialGroup()
                                .addGap(18, 18, 18)
                                .addComponent(tname, javax.swing.GroupLayout.PREFERRED_SIZE, 57, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(layout.createSequentialGroup()
                                .addGap(26, 26, 26)
                                .addComponent(aname, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(270, 270, 270)
                        .addComponent(begin, javax.swing.GroupLayout.PREFERRED_SIZE, 99, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(31, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(101, 101, 101)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(text)
                    .addComponent(tname, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(32, 32, 32)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(audio)
                    .addComponent(aname, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(begin, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(19, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void textActionPerformed(java.awt.event.ActionEvent evt) {                                     
        JFileChooser opentext=new JFileChooser();
        opentext.showOpenDialog(this);
        int returnVal = opentext.showOpenDialog(this);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        File tfile = opentext.getSelectedFile();
        String tfname=tfile.getName();
        tname.setText(tfname);
        // ... code that loads the contents of the file in the text area
    } 

    }                                    

    private void audioActionPerformed(java.awt.event.ActionEvent evt) {                                      
        JFileChooser openaudio=new JFileChooser();
        openaudio.showOpenDialog(this);
        int returnVal = openaudio.showOpenDialog(this);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        File afile = openaudio.getSelectedFile();
        aname.setText(afile.getName());

    } 
    }                                  

    private void beginActionPerformed(java.awt.event.ActionEvent evt) {                                      
        FileInputStream fin = new FileInputStream(tfile);**//error here**
    }                                     

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new second().setVisible(true);
                FileInputStream fin = new FileInputStream(tfile);
            }
        });
    }

    private javax.swing.JLabel aname;
    private javax.swing.JButton audio;
    private javax.swing.JButton begin;
    private javax.swing.JButton text;
    private javax.swing.JLabel tname;
    // End of variables declaration                   
}

另外,如果我在这里只使用 FileInputStream 将我的 .txt 和 .wav 文件转换为字节,是否可以,还是需要使用其他任何东西?

【问题讨论】:

    标签: java swing io


    【解决方案1】:

    一个简单的方法是让它们成为周围类的实例变量(你应该用驼峰写你的类名以遵循 Java 约定,它有助于其他人查看你的代码):

    public class Second extends javax.swing.JFrame {
        private File afile;
        private File tfile;
    
        ...
    
        private void textActionPerformed(java.awt.event.ActionEvent evt)  {                                     
            ...
            tfile = opentext.getSelectedFile();
            //set instance variable instead of local variable        
            ...
        } 
    
    
    
        private void audioActionPerformed(java.awt.event.ActionEvent evt) {                                      
            ...
            afile = openaudio.getSelectedFile(); 
            //set instance variable instead of local variable
            ...
        }                                  
    
        private void beginActionPerformed(java.awt.event.ActionEvent evt) {                                      
            FileInputStream fin = new FileInputStream(tfile); //works now
        }
    }
    

    这在main 方法中不起作用,因为它在静态上下文中。因此,您可以在 Second 类中为 Files 添加一个 getter 方法

        public File getTFile() { return tfile; }
        public File getAFile() { return afile; }
    

    能够从课堂外访问文件。

    请注意afiletfile 只有在您单击按钮并为其选择文件后才会设置,否则这些引用仍将是null。因此,您想在 run 方法中执行的操作无法工作,因为您尝试在显示框架后立即使用 tfile,您无法快速单击并设置文件引用:)

    【讨论】:

      【解决方案2】:

      简单的答案是:将afiletfile 作为班级成员:

      private javax.swing.JLabel aname;
      private javax.swing.JButton audio;
      private javax.swing.JButton begin;
      private javax.swing.JButton text;
      private javax.swing.JLabel tname;
      
      private File afile;     // put at bottom of class
      private File tfile;   
      

      更好的解决方案是让另一个类将您的日期操作(模型)与您的视图分开 (JFrame)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-06
        • 2015-06-16
        相关资源
        最近更新 更多