Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобратся правильным, конструированием классов в программе 
V
    Опции темы
Иван Человеков
Дата 24.10.2006, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 11.3.2006
Где: Минск

Репутация: нет
Всего: 1



Код
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() соответствующих закладок? 
Спасибо.

PM ICQ   Вверх
LSD
Дата 24.10.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Иван Человеков
Дата 24.10.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 11.3.2006
Где: Минск

Репутация: нет
Всего: 1



Мне в конструктор класса CopyAllFilesAction вставить :

Код

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

?
PM ICQ   Вверх
LSD
Дата 24.10.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Иван Человеков
Дата 24.10.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 11.3.2006
Где: Минск

Репутация: нет
Всего: 1



Дело в том что я хочу 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();
          }
   }


Спасибо.

PM ICQ   Вверх
Иван Человеков
Дата 24.10.2006, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 11.3.2006
Где: Минск

Репутация: нет
Всего: 1



Спасибо разобрался, добавил ещё один параметр...


 
Код

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;


Спасибо ;)
PM ICQ   Вверх
Иван Человеков
Дата 25.10.2006, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 11.3.2006
Где: Минск

Репутация: нет
Всего: 1



И всё же не выходит... Почему объекты 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

Спасибо.
PM ICQ   Вверх
batigoal
Дата 25.10.2006, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(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;



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Иван Человеков
Дата 25.10.2006, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 11.3.2006
Где: Минск

Репутация: нет
Всего: 1



LSD, batigoal спасибо за помощь ;)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0613 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.