использование файла, созданного в одном закрытом действии, в другом событии - PullRequest
2 голосов
/ 15 августа 2011

Я новичок в Java и хочу создать очень простую аудиостеганографию для своего проекта. Сначала я начал с фрейма, содержащего три кнопки, которые берут у пользователя текстовый файл и WAV-файл, и одну кнопку для начала кодирования. Я использовал filechoosers с первыми двумя кнопками для ввода файлов. Я хочу, чтобы событие actionPerformed моей кнопки "Пуск" преобразовало содержимое этих двух файлов в байты. После этого я планирую использовать алгоритм LSB, чтобы скрыть свой текстовый файл в файле .wav. Мой вопрос: как я могу использовать файлы "tfile" и "afile" в методе private void beginActionPerformed?

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 в байты здесь, или мне нужно использовать что-нибудь еще?

Ответы [ 2 ]

2 голосов
/ 15 августа 2011

Простой способ состоит в том, чтобы сделать их переменными экземпляра окружающего класса (вы должны написать имена ваших классов в случае верблюда, чтобы следовать соглашениям 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, так как он находится в статическом контексте.Таким образом, вы можете добавить метод получения для File s в вашем Second классе

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

, чтобы иметь возможность доступа к файлам вне класса.

Обратите внимание, что обаafile и tfile будут установлены только после того, как вы нажмете кнопки и выберете для них файл, в противном случае эти ссылки по-прежнему будут null.Так что то, что вы хотите сделать в вашем run методе , не может работать, потому что вы пытаетесь использовать tfile сразу после показа фрейма, вы никак не можете нажать и установить ссылку на файл так быстро:)

1 голос
/ 15 августа 2011

Простой ответ: укажите afile и 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;

private File afile;     // put at bottom of class
private File tfile;   

Лучшее решение состоит в том, чтобы иметь другой класс, чтобы отделить манипуляции с датами (модель) от вашего представления (JFrame)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...