2013-07-10 4 views
-1

у меня этот JFrame класс:Использовать значение переменной из другого класса

public class Frame1 extends javax.swing.JFrame { 

    ........ 

    String name; 
    File file; 
    JFileChooser FileChooser = new JFileChooser(); 

    if (FileChooser.getSelectedFile().isFile()) { 
    try {  
      file = FileChooser.getSelectedFile(); 
      name = FileChooser.getSelectedFile().getName(); 
      System.out.println(name); 

     } catch (FileNotFoundException ex) { 
      Logger.getLogger(Frame1.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
    ........ 

    private void Button1 (java.awt.event.ActionEvent evt) {            

       java.awt.EventQueue.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        Frame2 obj = new Frame2(); 
       } 
      });  
     }           
} 

Затем я создал класс "frame2":

public class Frame2 extends javax.swing.JFrame { 

....... 

} 

Как вы можете изображения, когда моя программа начинается I используйте JFileChooser для выбора файла; после этого я нажимаю кнопку, которая открывает другой jFrame; в этом jFrame (Frame2)

Что мне понадобится, так это использовать файл, который я выбрал в предыдущем jFrame (Frame1). Поэтому мне нужно использовать переменную «file» из «Frame1» в «Frame2».

Я попытался сделать это в frame2:

Frame1 obj1 = new Frame1(); 
File file2 = obj1.file; 
System.out.println(file2 ); 

Так что, когда я запустить программу и выбрать файл, а затем я нажимаю «Button1» запустить «frame2», он первым печатает имя файла (» name ") из« Frame1 » , после чего он печатает« null », поэтому я не могу получить правильное значение« file »из« Frame1 »и использовать его в« Frame2 ».

Как я могу это сделать? Благодаря

+0

1) Для лучшей помощи рано, опубликовать [SSCCE] (http://sscce.org/). 2) См. [Использование нескольких JFrames, Хорошая/Плохая Практика?] (Http://stackoverflow.com/a/9554657/418556) –

+0

............... привет? –

ответ

5

Это не будет работать:

Frame1 obj1 = new Frame1(); 
File file2 = obj1.file; 
System.out.println(file2 ); 

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

Вместо почему не:

  1. Измените свой первый JFrame в модальный JDialog или JOptionPane
  2. Дайте ему публичный метод getSelectedFile(), который возвращает выбранный файл. Это то, о чем вы действительно говорите - обмениваете состояние одного объекта с другим объектом, и один из способов сделать это - через ваши основные методы получения и настройки.
  3. Затем покажите свое диалоговое окно, и когда оно вернется, вызовите вышеуказанный метод для указанного объекта.
  4. Или почему бы не просто просто показать диалог JFileChooser, поскольку он делает все это для вас?

Например:

import java.io.File; 
import javax.swing.*; 

public class Foo { 

    private static void createAndShowGui() { 
     JFileChooser fileChooser = new JFileChooser(); 
     int result = fileChooser.showOpenDialog(null); 
     if (result == JFileChooser.APPROVE_OPTION) { 
     File file = fileChooser.getSelectedFile(); 
     JTextField field = new JTextField(file.getAbsolutePath(), 30); 
     JPanel panel = new JPanel(); 
     panel.add(new JLabel("Selected File:")); 
     panel.add(field); 

     // create and open a new JFrame with the selected file's path 
     JFrame frame = new JFrame("Foo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(panel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
     } 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

спасибо, но проблема в том, что мне нужно получить доступ к переменной файла из другого класса (Frame2) в другом .java-файле, и я не могу этого избежать. Может быть, метод getSelectedFile() будет лучше, но как я могу его использовать, чтобы вернуть измененное значение во время текущей переменной? Есть ли какой-нибудь пример? – Frank