Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Помогите разобратся правильным


Автор: Иван Человеков 24.10.2006, 14:38
Код
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.*;


public class CopyTo {
  public static void main (String[] args) throws Exception {
      CopyToFrame frame =new CopyToFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
  }
}
//Колбашу фремик а на нём всякую всячину ;)
class CopyToFrame extends JFrame {
  public CopyToFrame () {
     //Настраиваем фрейм
     setTitle("Обработка почты...");
     setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
     setResizable (false);  //Размер окна не изменяется

     //Верхняя панель с кнопками
     panelVerch p1=new panelVerch("Окуда","Куда","d:/1","d:/2/3");
     panelVerch p2=new panelVerch("Окуда","Куда","d:/2/3","d:/4");
     //Нижняя панель с кнопками
     panelNiz niz=new panelNiz(p1.getStrIn(),p1.getStrTo(),p2.getStrIn(),p2.getStrTo());

     //Вкладки настроек Приёма и Отправки почты
     JTabbedPane jtp=new JTabbedPane();
     jtp.addTab("Приём",p1);
     jtp.addTab("Отправление",p2);

     //Добавляем на фрейм панели
     setLayout(null);
     add(jtp);
     jtp.setBounds(2,0,350,100);
     add(niz);
     niz.setBounds(2,105,350,165);
  }
  private class panelVerch extends JPanel{//Создание компонентов закладки приёма почты
     public panelVerch(String nazv1,String nazv2,String put1,String put2){
        JLabel label1=new JLabel(nazv1);
        textIn =new JTextField(put1,22);
        JLabel label2=new JLabel(nazv2);
        textTo =new JTextField(put2,22);

        //Добавляем к панели компоненты
        setLayout(null);
        add(label1);
        add(textIn);
        add(label2);
        add(textTo);
        label1.setBounds(0,2,70,20);
        textIn.setBounds(70,2,250,20);
        label2.setBounds(0,24,70,20);
        textTo.setBounds(70,24,250,20);
     }
     public String getStrIn(){//Метод возвращает путь по которому надо скопировать все файлы
        return this.textIn.getText();
     }
     public String getStrTo(){//Метод возвращает путь куда надо копировать файлы
        return this.textTo.getText();
     }
     private JTextField textIn, textTo; //Поля редактирования в которых находятся пути откуда text1 и куда копировать файлы text2
  }
  private class panelNiz extends JPanel{
    public panelNiz(String in1, String to1, String in2, String to2 ){

        JButton ButtPr = new JButton("Приём почты");
        ButtPr.addActionListener(new CopyAllFilesAction(in1,to1));
        JButton ButtOt = new JButton("Отправить почту");
        ButtOt.addActionListener(new CopyAllFilesAction(in2,to2));

        //Информационная панель
        info=new JTextArea(9,27);
        info.setEditable(false);
        JScrollPane jsp = new JScrollPane(info);

        //Добавляем к панели компоненты
        setLayout(null);
        setBorder(BorderFactory.createEtchedBorder());//Рамочка для кнопок
        add(jsp);
        add(ButtPr);
        add(ButtOt);
        jsp.setBounds(2,2,345,130);
        ButtPr.setBounds(12,134,150,25);
        ButtOt.setBounds(180,134,150,25);
    }
  }

// Событие, переписывание всех файлов одного каталога в другой
class CopyAllFilesAction implements ActionListener {
   public CopyAllFilesAction(String p1,String p2){//Конструктор
       //Путь откуда и куда писать файлы
       putIn=p1; putTo=p2;
   }
   public void actionPerformed(ActionEvent event){
          try{

              File f1=new File(putIn);
              File f2=new File(putTo);

              if (f1.isDirectory()){//Проверяю правильно указан директорий или нет
                  if (f2.isDirectory()){//Проверяю правильно указан директорий или нет
                      info.append("Копирование начато.\n");

                      String s[]=f1.list();   //Получаю список директориев и файлов

                      for (int j=0; j<s.length; j++){ //Сейчас мы их попорядочку будем копировать
                          File f =new File(putIn+"/"+s[j]);

                          if (!f.isDirectory()){  //Если это не директорий - тогда копируем

                              FileInputStream fi = new FileInputStream(f);
                              FileOutputStream fo =new FileOutputStream(putTo+"/"+s[j]);

                              int size = fi.available(); //Размерчик файлика определяем

                              // Копируем файл
                              for (int i=0; i<size; i++) fo.write(fi.read());

                              //Освобождаем ресурсы
                              fi.close(); fo.close();
                              info.append("Скопирован "+s[j]+"\n");
                          }
                      }
                      info.append("Приём почты завершён.\n");
                  }else{info.append("В поле Куда указан не директорий!\n");}
              }else{info.append("В поле Откуда указан не директорий!\n");}

          } catch (FileNotFoundException exception){
              info.append("Файлов почты не найдено!!\n");
              exception.printStackTrace();
          } catch (IOException exception){
              exception.printStackTrace();
          }
   }
   private String putIn,putTo; //Путь откуда и куда писать файлы
}
  //Приватные переменнные
  private JTextArea  info;          //Текстовая область в которую выводится информация о действиях, осуществлённых программой
  private static final int DEFAULT_WIDTH =360;
  private static final int DEFAULT_HEIGHT=305;
}


Подскажите пожалуйста, как использовать класс CopyAllFilesAction(String p1,String p2) таким образом, чтобы он брал текущие настройки полей редактирования каталогов  textIn.getText() и textTo.getText() соответствующих закладок? 
Спасибо.

Автор: LSD 24.10.2006, 15:01
Или при создании CopyAllFilesAction передавай ему ссылки на textIn и textTo. Или получай у ActionEvent откуда был вызван метод (getSource()) и там уже по обстоятельствам.

Автор: Иван Человеков 24.10.2006, 15:49
Мне в конструктор класса CopyAllFilesAction вставить :

Код

EventObject event=new EventObject(this);
        Object source =event.getSource();

?

Автор: LSD 24.10.2006, 16:19
Измени конструктор CopyAllFilesAction, так чтобы он принимал в качестве параметра два JTextField-а (для этого придется изменить и конструктор panelNiz).

Или просто сделай класс CopyAllFilesAction внутренним у CopyToFrame, и поля private JTextField textIn, textTo; вынеси в класс CopyToFrame.

Автор: Иван Человеков 24.10.2006, 16:42
Дело в том что я хочу 2-жды использовать один обработчик событий. 
При создании обработчика данные о путях каталогов загоняются в объект обработчика. А ведь после создания объекта пользователь может поменять значение JTextField(путей к директориям), а событие будет упорно работать со старыми путями smile
Значит надо, как я понимаю, открывать JTextField -ы каждой закладки на доступ в классе CopyToFrame, а во время отработки события определять на какую кнопку нажали, и соответственно брать текущие JTextField  соответствующей закладки.

У меня не получается определить какую кнопку нажал пользователь smile  Пути оказываются пустыми smile p1 иp2 это у меня закладки, объекты открытые для всего класса CopyToFrame.

Код
public void actionPerformed(ActionEvent event){
          try{
              putIn=""; putTo="";
              Object source =event.getSource();

              if (source==ButtPr){
                  putIn=p1.getStrIn();
                  putTo=p1.getStrTo();
              }
              else if (source==ButtOt){
                  putIn=p2.getStrIn();
                  putTo=p2.getStrTo();
              }


              File f1=new File(putIn);
              File f2=new File(putTo);

              if (f1.isDirectory()){//Проверяю правильно указан директорий или нет
                  if (f2.isDirectory()){//Проверяю правильно указан директорий или нет
                      info.append("Копирование начато.\n");

                      String s[]=f1.list();   //Получаю список директориев и файлов

                      for (int j=0; j<s.length; j++){ //Сейчас мы их попорядочку будем копировать
                          File f =new File(putIn+"/"+s[j]);

                          if (!f.isDirectory()){  //Если это не директорий - тогда копируем

                              FileInputStream fi = new FileInputStream(f);
                              FileOutputStream fo =new FileOutputStream(putTo+"/"+s[j]);

                              int size = fi.available(); //Размерчик файлика определяем

                              // Копируем файл
                              for (int i=0; i<size; i++) fo.write(fi.read());

                              //Освобождаем ресурсы
                              fi.close(); fo.close();
                              info.append("Скопирован "+s[j]+"\n");
                          }
                      }
                      info.append("Приём почты завершён.\n");
                  }else{info.append("В поле Куда указан не директорий!\n");}
              }else{info.append("В поле Откуда указан не директорий!\n");}

          } catch (FileNotFoundException exception){
              info.append("Файлов почты не найдено!!\n");
              exception.printStackTrace();
          } catch (IOException exception){
              exception.printStackTrace();
          }
   }


Спасибо.

Автор: Иван Человеков 24.10.2006, 18:59
Спасибо разобрался, добавил ещё один параметр...


 
Код

ButtPr.addActionListener(new CopyAllFilesAction(1,in1,to1));
        JButton ButtOt = new JButton("Ioi?aaeou ii?oo");
        ButtOt.addActionListener(new CopyAllFilesAction(2,in2,to2));


Код

class CopyAllFilesAction implements ActionListener {
      int buttonId=0;
   public CopyAllFilesAction(int _buttonId, String p1,String p2){//Eiino?oeoi?
        buttonId = _buttonId;


Спасибо ;)

Автор: Иван Человеков 25.10.2006, 07:45
И всё же не выходит... Почему объекты p1 и p2 при нажатии либо "Приёма" либо "Отправки" равны NULL?

Код

public void actionPerformed(ActionEvent event){
          try{
              putIn=""; putTo="";
              Object source =event.getSource();

              if (i==1){ //source.equals(ButtPr)){//(source==ButtPr){
                  putIn=p1.getPutIn();
                  putTo=p1.getPutTo();
              }
              else if (i==2){
                  putIn=p2.getPutIn();
                  putTo=p2.getPutTo();
              }


Весь код программы:
Код
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.*;


public class CopyTo {
  public static void main (String[] args) throws Exception {
      CopyToFrame frame =new CopyToFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
  }
}
//Колбашу фремик а на нём всякую всячину ;)
class CopyToFrame extends JFrame {
  public CopyToFrame () {
     //Настраиваем фрейм
     setTitle("Обработка почты...");
     setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
     setResizable (false);  //Размер окна не изменяется

     //Верхняя панель с кнопками
     panelVerch p1=new panelVerch("Окуда","Куда","d:/1","d:/2");
     panelVerch p2=new panelVerch("Окуда","Куда","d:/2","d:/4");
     //Нижняя панель с кнопками
     panelNiz niz=new panelNiz();

     //Вкладки настроек Приёма и Отправки почты
     JTabbedPane jtp=new JTabbedPane();
     jtp.addTab("Приём",p1);
     jtp.addTab("Отправление",p2);

     //Добавляем на фрейм панели
     setLayout(null);
     add(jtp);
     jtp.setBounds(2,0,350,100);
     add(niz);
     niz.setBounds(2,105,350,165);
  }
  private class panelVerch extends JPanel{//Создание компонентов закладки приёма почты
     public panelVerch(String nazv1,String nazv2,String put1,String put2){
        JLabel label1=new JLabel(nazv1);
        textIn =new JTextField(put1,22);
        JLabel label2=new JLabel(nazv2);
        textTo =new JTextField(put2,22);

        //Добавляем к панели компоненты
        setLayout(null);
        add(label1);
        add(textIn);
        add(label2);
        add(textTo);
        label1.setBounds(0,2,70,20);
        textIn.setBounds(70,2,250,20);
        label2.setBounds(0,24,70,20);
        textTo.setBounds(70,24,250,20);
     }
     public String getPutIn(){//Метод возвращает путь по которому надо скопировать все файлы
        return this.textIn.getText();
     }
     public String getPutTo(){//Метод возвращает путь куда надо копировать файлы
        return this.textTo.getText();
     }
     JTextField textIn, textTo; //Поля редактирования в которых находятся пути откуда text1 и куда копировать файлы text2
  }
  private class panelNiz extends JPanel{
    public panelNiz(){

        JButton ButtPr = new JButton("Приём почты");
        ButtPr.addActionListener(new CopyAllFilesAction(1));
        JButton ButtOt = new JButton("Отправить почту");
        ButtOt.addActionListener(new CopyAllFilesAction(2));

        //Информационная панель
        info=new JTextArea(9,27);
        info.setEditable(false);
        JScrollPane jsp = new JScrollPane(info);

        //Добавляем к панели компоненты
        setLayout(null);
        setBorder(BorderFactory.createEtchedBorder());//Рамочка для кнопок
        add(jsp);
        add(ButtPr);
        add(ButtOt);
        jsp.setBounds(2,2,345,130);
        ButtPr.setBounds(12,134,150,25);
        ButtOt.setBounds(180,134,150,25);
    }

  }

  // Событие, переписывание всех файлов одного каталога в другой
  class CopyAllFilesAction implements ActionListener {
   public CopyAllFilesAction(int ii){//Конструктор
       //Путь откуда и куда писать файлы
       //putIn=p1; putTo=p2;
       i=ii;
   }
   public void actionPerformed(ActionEvent event){
          try{
              putIn=""; putTo="";
              Object source =event.getSource();

              if (i==1){ //source.equals(ButtPr)){//(source==ButtPr){
                  putIn=p1.getPutIn();
                  putTo=p1.getPutTo();
              }
              else if (i==2){
                  putIn=p2.getPutIn();
                  putTo=p2.getPutTo();
              }


              File f1=new File(putIn);
              File f2=new File(putTo);

              if (f1.isDirectory()){//Проверяю правильно указан директорий или нет
                  if (f2.isDirectory()){//Проверяю правильно указан директорий или нет
                      info.append("Копирование начато.\n");

                      String s[]=f1.list();   //Получаю список директориев и файлов

                      for (int j=0; j<s.length; j++){ //Сейчас мы их попорядочку будем копировать
                          File f =new File(putIn+"/"+s[j]);

                          if (!f.isDirectory()){  //Если это не директорий - тогда копируем

                              FileInputStream fi = new FileInputStream(f);
                              FileOutputStream fo =new FileOutputStream(putTo+"/"+s[j]);

                              int size = fi.available(); //Размерчик файлика определяем

                              // Копируем файл
                              for (int i=0; i<size; i++) fo.write(fi.read());

                              //Освобождаем ресурсы
                              fi.close(); fo.close();
                              info.append("Скопирован "+s[j]+"\n");
                          }
                      }
                      info.append("Приём почты завершён.\n");
                  }else{info.append("В поле Куда указан не директорий!\n");}
              }else{info.append("В поле Откуда указан не директорий!\n");}

          } catch (FileNotFoundException exception){
              info.append("Файлов почты не найдено!!\n");
              exception.printStackTrace();
          } catch (IOException exception){
              exception.printStackTrace();
          }
   }
   private int i;
   private boolean boo;
   private String putIn,putTo; //Путь откуда и куда писать файлы
  }
  //Приватные переменнные
  //private JTextField textIn,

//Верхняя панель с кнопками
  panelVerch p1,p2;
  private JButton ButtPr, ButtOt;
  private JTextArea  info;          //Текстовая область в которую выводится информация о действиях, осуществлённых программой
  private static final int DEFAULT_WIDTH =360;
  private static final int DEFAULT_HEIGHT=305;
}


Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

Спасибо.

Автор: batigoal 25.10.2006, 08:56
Цитата(Egorich @  25.10.2006,  08:45 Найти цитируемый пост)
Почему объекты p1 и p2 при нажатии либо "Приёма" либо "Отправки" равны NULL?

Ну а с чего бы им быть не NULL, если ты их нигде не инициализируешь? У тебя, видимо, путаница возникла: у тебя есть локальные переменные в одном классе с именами p1, p2, и переменные-члены с теми же именами в другом классе.

Локальные переменные в конструкторе CopyToFrame:
Код

panelVerch p1 = new panelVerch("Окуда", "Куда", "d:/1", "d:/2");
panelVerch p2 = new panelVerch("Окуда", "Куда", "d:/2", "d:/4");


Переменные-члены класса CopyAllFilesAction:
Код

panelVerch p1, p2;

Автор: Иван Человеков 25.10.2006, 09:49
LSD, batigoal спасибо за помощь ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)