Использование одной переменной из одного класса в другом - PullRequest
0 голосов
/ 04 апреля 2011

Я только начал изучать Java (:)), извините, если это очевидно для некоторых из вас:

Я хотел создать программу, в которой я мог бы переместить один файл в другой каталог (я тожеленивый для перетаскивания), программа работает нормально и денди сама.но я хотел добавить экран типа главного меню, где я мог бы выбрать, в какую директорию файлов я бы поместил его (также отлично работает и отлично).

Итак, мой вопрос: как я могу использовать переменную «source» вкласс Move?

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     import java.io.File;
    import java.io.IOException;
     import javax.swing.JButton; 
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;


public class Browse {
      public static void main(String arg[])throws IOException{ {






            JFrame frame1 = new JFrame();
            JPanel panel1 = new JPanel();
             JButton button1 = new JButton("press");

             frame1.add(panel1);
             frame1.setSize(400, 400);
             frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame1.setVisible(true);
             panel1.add(button1);
             button1.addActionListener(new ActionListener(){
                 public void actionPerformed(ActionEvent ae){

                  JFileChooser chooser = new JFileChooser();
            chooser.setCurrentDirectory(new java.io.File("."));
            chooser.setDialogTitle("choosertitle");
            chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            chooser.setAcceptAllFileFilterUsed(false);

            if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
              System.out.println("getCurrentDirectory(): " + chooser.getCurrentDirectory());
              System.out.println("getSelectedFile() : " + chooser.getSelectedFile());
            } else {
              System.out.println("No Selection ");
            }
        File source = chooser.getSelectedFile();


                 }});}}



}


    public class Move {


              JFileChooser chooser = new JFileChooser();
        chooser.setCurrentDirectory(new java.io.File("."));
        chooser.setDialogTitle("choosertitle");
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        chooser.setAcceptAllFileFilterUsed(false);

        if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
          System.out.println("getCurrentDirectory(): " + chooser.getCurrentDirectory());
          System.out.println("getSelectedFile() : " + chooser.getSelectedFile());
        } else {
          System.out.println("No Selection ");
        }
     File source  =chooser.getSelectedFile();


        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));       


       if(!source.exists()){

        System.out.println("File or directory does not exist.");

         System.exit(0);

      }
        int a = 0;   

       String dest = ("C:/Users/David/Desktop/test");

    System.out.println(dest);

     File destination = new File(dest);


          int num = 1;

         if(num == 0 || num==1){

            copyDirectory(source, destination);

          a = 1;



     }

      if(a == 1){

          System.out.println("File or directory moved successfully.");
          JFrame frame3 = new JFrame(); 
          JPanel panel2 = new JPanel(new GridBagLayout());
          frame3.getContentPane().add(panel2, BorderLayout.NORTH); 
          GridBagConstraints c= new GridBagConstraints();
          JLabel moved = new JLabel("Con Gratz map has been moved :) (hopfully)");
          c.gridx = 10;
          c.gridy =10;
          c.insets = new Insets(10,10,10,10);
          frame3.add(panel2);
          frame3.setSize(400, 400);
          frame3.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame3.setVisible(true);
       panel2.add(moved);

         if(!delete(source)){

           throw new IOException("Unable to delete original folder");

         }

       }
        else if(a == 0){

        System.exit(0);

     }}

     }





    public static void copyDirectory(File sourceDir, File destDir)
                    throws IOException{

       if(!destDir.exists()){

          destDir.mkdir();

       }

      File[] children = sourceDir.listFiles();

          for(File sourceChild : children){

         String name = sourceChild.getName();

          File destChild = new File(destDir, name);

            if(sourceChild.isDirectory()){

           copyDirectory(sourceChild, destChild);

          }

     else{

          copyFile(sourceChild, destChild);

         }

     }

     }


      public static void copyFile(File source, File dest) throws IOException{

       if(!dest.exists()){

        dest.createNewFile();

        }

     InputStream in = null;

        OutputStream out = null;

        try{

         in = new FileInputStream(source);

            out = new FileOutputStream(dest);

          byte[] buf = new byte[1024];

            int len;

          while((len = in.read(buf)) > 0){

            out.write(buf, 0, len);

                }

         }

      finally{

         in.close();

               out.close();

            }

      }


     public static boolean delete(File resource) throws IOException{ 

          if(resource.isDirectory()){

          File[] childFiles = resource.listFiles();

          for(File child : childFiles){

          delete(child);

       }

     }

    return resource.delete();

      }

    }

Оба класса работают по отдельности, возможно, я удалил важную строку ... но они работают.

Спасибо за вашу помощь:)

(также, если кто-нибудь заметит что-то здесь в коде, которое может быть улучшено, не стесняйтесь :))

Ответы [ 3 ]

0 голосов
/ 04 апреля 2011

попробуйте объявить вашу переменную «source» вне метода main без квалификаторов, чтобы переменная по умолчанию была закрытой (если оба ваших класса находятся в одном пакете)Если нет, вы всегда можете создать личный экземпляр и добавить метод get для доступа к этому экземпляру.

0 голосов
/ 05 апреля 2011

Я думаю, это то, что вы пытаетесь сделать:

import javax.swing.*;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;

public class Browse {
static class CopierThread extends Thread {
    private final Component gui_;

    private final File source_;

    private final File dest_;


    CopierThread(Component gui, File source, File dest) {
        gui_ = gui;
        source_ = source;
        dest_ = dest;
    }


    @Override
    public void run() {
        try {
            copyDirectory(source_, dest_);
        } catch (IOException ioe) {
            ioe.printStackTrace();
            JOptionPane.showMessageDialog(gui_, "The copy of "
                    + source_.getAbsolutePath() + " to "
                    + dest_.getAbsolutePath()
                    + " failed. See console for more details.",
                    "Copy failed", JOptionPane.ERROR_MESSAGE);
        }
    }
}


public static void main(String arg[]) {
    final JFrame frame1 = new JFrame();
    JPanel panel1 = new JPanel();
    JButton button1 = new JButton("press");
    frame1.add(panel1);
    frame1.setSize(400, 400);
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame1.setVisible(true);
    panel1.add(button1);
    button1.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent ae) {
            JFileChooser chooser = new JFileChooser();
            chooser.setCurrentDirectory(new java.io.File("."));
            chooser.setDialogTitle("choosertitle");
            chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            chooser.setAcceptAllFileFilterUsed(false);
            if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                System.out.println("getCurrentDirectory(): "
                        + chooser.getCurrentDirectory());
                System.out.println("getSelectedFile() : "
                        + chooser.getSelectedFile());

                File source = chooser.getSelectedFile();
                File dest = new File("C:/Users/David/Desktop/test");
                Thread thread = new CopierThread(frame1, source, dest);
                thread.start();
            } else {
                System.out.println("No Selection ");
            }
        }
    });
}


public static void copyDirectory(File sourceDir, File destDir) throws IOException {
    if (!destDir.exists()) {
        destDir.mkdir();
    }
    File[] children = sourceDir.listFiles();
    for(File sourceChild:children) {
        String name = sourceChild.getName();
        File destChild = new File(destDir, name);
        if (sourceChild.isDirectory()) {
            copyDirectory(sourceChild, destChild);
        } else {
            copyFile(sourceChild, destChild);
        }
    }
}


public static void copyFile(File source, File dest) throws IOException {
    if (!dest.exists()) {
        dest.createNewFile();
    }
    InputStream in = null;
    OutputStream out = null;
    try {
        in = new FileInputStream(source);
        try {
            out = new FileOutputStream(dest);
            byte[] buf = new byte[1024];
            int len;
            while( (len = in.read(buf)) != -1 ) {
                out.write(buf, 0, len);
            }
        } finally {
            if (out != null) out.close();
        }
    } finally {
        if (in != null) in.close();
    }
}
}

Чтобы ответить на ваш главный вопрос в первую очередь, есть различные способы доступа к переменной, принадлежащей одному объекту в другом. Чтобы использовать любой из них, вы должны сначала сделать переменную переменной-членом, а не переменной метода. В моем коде выше CopierThread имеет три переменные-члены. Если переменная не является переменной-членом, к ней можно получить доступ только в особых случаях. Обратите внимание, что я создал переменную frame1 final, чтобы позволить анонимному внутреннему классу ActionListener получить к нему доступ.

Итак, ответ на ваш главный вопрос:

Переменная-член может быть доступна для других классов в зависимости от ее защиты. Ни один другой класс не может получить доступ к private переменной-члену. Любой другой класс может получить доступ к public переменной-члену. По умолчанию и protected находятся между ними, и вы должны их найти.

Переменная метода может быть доступна другому классу, только если этот класс определен в методе и переменная объявлена ​​как final.

Распространено и полезно создавать методы специально для доступа к переменным-членам. Это хорошая практика проектирования, поскольку она скрывает реализацию, позволяет применять правила валидации, ограничивать доступ и позволяет легко идентифицировать переменные посредством интроспекции.

Несколько других комментариев:

1) GUI не отвечает, пока работают прослушиватели событий. Поэтому вы никогда не должны делать что-то большое в слушателе событий. Мой код запускает новый поток для копирования файла, поэтому слушателю событий графического интерфейса не нужно его ждать, а графический интерфейс остается отзывчивым.

2) Входной и выходной потоки в конечном итоге закрываются сборщиком мусора, но в большой серверной виртуальной машине это может занять много времени, чтобы другие программы не получили доступ к файлам. Поэтому вы всегда должны быть уверены, что потоки закрыты с помощью блоков finally, имея в виду, что в случае сбоя самого конструктора переменная будет иметь значение null.

3) Форматирование исходного кода облегчает жизнь всем. Бесплатные IDE, такие как Eclipse, будут автоматически форматироваться для вас.

0 голосов
/ 04 апреля 2011

Вы можете присвоить source классу Move в его constructor.Вот так:

public class Move
{
    private File f;

    // Constructor taking a File as parameter
    public Move(File f)
    {
        // Assign File to this instance of Move
        this.f = f;
    }

    public void someMethod()
    {
        // Abuse the File class 'f' here
    }
}

Затем в вашем main выполните следующее, после восстановления source.

File source = ...
Move m = new Move(source);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...