2014-12-25 3 views
0

У нас есть страница А, которая имеет Jtable и World_info_object «информация». эта таблица показывает данные от людей (люди находятся в мировой информации). Я хочу отредактировать «информацию», чтобы у каждого человека была кнопка редактирования, а также на этой странице есть кнопка «+ NEW». Эти кнопки слушателей действий: (редактировать почти то же самое)Обновить данные из другого фрейма

newPerson.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 

     personFrame=new PersonPage(getInfo() , null); 

     Thread closing =new Thread(new Runnable() { 

      @Override 
      public void run() { 

       while(true){ 
        if(personFrame.getConfirmed()==true){ 

         setWorldInfo(personFrame.getInfo()); 
         personFrame.setVisible(false); 
         personFrame.dispose(); 
         System.out.println("closed"); 
         updateTableData(); // repaint table ! 

         break; 
        } 
        System.out.println("open..."); 
       } 

      } 
     }, "closingWindow"); 




     closing.start(); 


    } 
}); 

AS вы можете увидеть здесь нить ищет изменения в булево подтвердил, которые я делаю это верно, когда пользователь нажимает кнопку Окей или кнопку отмены в personFrame! Назначение - getInfo() из personFrame и установить его здесь в PageA (первый кадр), и это делается этим, но этот поток делает «Исключение в потоке» AWT-EventQueue-0 «java.lang.ArrayIndexOutOfBoundsException: 5> = 5».

Если кто-нибудь знает, как решить это исключение или как я УстановитьДанные отправлено с другой страницы непосредственно перед закрытием его, пожалуйста, скажите мне ... (Или, может быть проблема с таблицей)

Исключение: http://i.stack.imgur.com/UnZnd.png

** Обновление

Все, что я хочу сделать, это сделать pageB со страницыA и отправить ему информацию (что сделано), а затем после подтверждения или закрытия pageB запустить функцию update(); в разделеA! Есть идеи ? :)

**

// ПОЧТИ решаемая ПРОГРАММА:

общественного класс расширяет JFrame страницы A {

private static HashMap<Integer, String>info=new HashMap<Integer,String>(); 
private JPanel contentPane; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 


    info.put(1, "Sofia"); 
    info.put(2, "XSR"); 


    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       PageA frame = new PageA(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public PageA() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(80, 80, 450, 300); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 


    JButton btnNewButton = new JButton("Open pageB"); 
    btnNewButton.setBounds(126, 11, 160, 23); 
    btnNewButton.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 

      final PageB pageB=new PageB(info); 
      pageB.addWindowListener(new WindowAdapter(){ // add listener to detect 
       public void windowClosing(WindowEvent e){ 

        setInfo(pageB.getInfo()); 
        System.out.println("xxxx"); 

       } 
      }); 



     } 
    }); 
    contentPane.add(btnNewButton); 



} 

public void setInfo(HashMap<Integer, String> uinfo){ 

    this.info=info; 
} 

}

общественного класс расширяет JFrame Страницы B {

private JPanel contentPane; 
private HashMap<Integer, String> info; 

public PageB(HashMap<Integer, String> info) { 

    this.info=info; 

    this.info.put(113, "Alfred"); 
    this.info.put(314, "Alfa"); 
    this.info.put(13, "Luter"); 

    setBounds(100, 100, 450, 300); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 

    final PageB that=this; 

    JButton btnOkayDone = new JButton("Okay , Done"); 
    btnOkayDone.setBounds(34, 228, 130, 23); 
    btnOkayDone.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      // add event for closing 
      that.dispatchEvent(new WindowEvent(that, WindowEvent.WINDOW_CLOSING)); 

     } 
    }); 
    contentPane.add(btnOkayDone); 

    this.setVisible(true); 



} 


public HashMap<Integer, String> getInfo(){ 

    return info; 


} 

}

+0

Вы можете вставить полный след исключения и какая линия именно вы получите исключение? Это в getInfo, что вы получаете исключение? – SMA

+0

@almasshaikh: Исключение: http://i.stack.imgur.com/UnZnd.png 0> = 0 изменяется на 6> = 6 или 4> = 4 каждый раз, когда он отличается!? –

+0

По-прежнему сложно определить, какая строка из вашего кода выбрасывает исключение как его не полную трассировку стека. – SMA

ответ

0

В сообщении об ошибке указано, что при использовании макета произошла ошибка, в которой ожидалось найти компонент, но не найдено ни одного. Вероятно, это связано с неправильным использованием personFrame.dispose(); без обновления вашего макета для учета одного меньшего элемента.

+0

Что именно распоряжается? поэтому лучше сначала проверить, существует ли этот фрейм? –

+0

@ Germany21 Ваша первая проблема: использовать 'dispose', не зная, что он делает;) – Vitruvius

+0

@ Germany21 Рамка существует, когда вы ее уничтожаете, но после этого контейнер рамки не может отобразиться должным образом, поскольку он ожидает, что этот кадр будет частью его раскладка. – Vitruvius

0

Хорошо, так что я изменил некоторые детали:

  personFrame=new PersonPage(getInfo() , null); 

     personFrame.addWindowListener(new WindowAdapter(){ // close page with listener 
      public void windowClosing(WindowEvent e){ 

       System.out.println("Closed"); 
       setWorldInfo(personFrame.getInfo()); // update data (as before) 
       updateTableData(); // repaint and update frame (as before) 
      } 
     }); 

И в personPage я добавить событие для закрытия, чтобы быть услышанными там! Вот код:

// cancel operation (Also for okay button I add this ** line after update info) 

    btnCancel.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 


      that.dispatchEvent(new WindowEvent(that, WindowEvent.WINDOW_CLOSING)); 
      //** instead of using a boolean I used closing event ! 


     } 
    }); 

И это решается AWT проблема также обновление данных^_^(сейчас: |)

Смежные вопросы