2016-10-22 14 views
1

私はここでちょっと新しいです。私は自分のコードに何が間違っているかを把握していません。私は2つのJFramesを持っています、1つはメインフレームであり、もう1つはメインフレームで選択されたデータをクリックするたびに「ビューの詳細」フレームのようなものです。 これは私のメインクラスは次のようになります:jframeから新しく開いたjframeにデータをロード

public class MainClass{ 
    private JFrame frame; 
    private JButton btnNewButton; 
    private String testData; 
    private DetailClass detail; 

    public JFrame getFrame() { 
    return frame; 
    } 

    public String getTest() { 
    return testData; 
    } 

    public void setTest(String test) { 
    this.testData = test; 
    } 

    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       main window = new main(); 
       window.frame.setVisible(true); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 
public MainClass() { 
    initialize(); 
} 
private void initialize() { 
     //some codes label, button, etc. 
     btnNewButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      setTest("Data retrieved from main"); 
      detail.getFrame().setVisible(true); 
     } 
    }); 
detail = new DetailClass(); 
detail.setMainClass(this); 
} 
} 

そして、ここで私はメインから取得したデータを表示したい私のDetailClassです。 パブリッククラスDetailClass(){ プライベートMainClassメイン; プライベートJFrameフレーム。それだけです

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       DetailClass window = new DetailClass(); 
       window.frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 
public DetailClass() { 
    initialize(); 
} 
public void initialize(){ 
//some codes for frame 

//this is where I test if the detail class receives the data 
System.out.println(main.getTest()); 

} 
public void setMainClass(MainClass m){ 
    this.main = m; 
} 
} 

は、main.getTestは()()intializeで動作するようには思えませんが、私は、フレーム2のボタンをクリックしたときにマウスイベントでそれを入れてみました、それが正常に動作します。それは、フレームがすでに表示/アクティブ化/レンダリングされている場合にのみ動作するようですが、初期化では機能しません。フレーム2にデータをプリロードする必要があります。 :)

+1

'「詳細を表示」frame'はJFrameの、**メイン**アプリケーションウィンドウではありませんが、むしろ使って、JDialog、またはアプリケーションの依存サブする必要があります窓。 –

+1

こちらをご覧ください:[複数のJFramesの使用:良いか悪い練習ですか?](http://stackoverflow.com/q/9554636/522444)また、スイング以外のアプリケーションと同じように、あるクラスから別のクラスへ情報を渡すこともできます:コンストラクターとメソッドのパラメーター。 –

+0

この 'other()'メソッドはどこで呼びますか? –

答えて

2

Minimal, Complete, and Verifiable exampleが間違っていると推測することができますが、other()メソッド(メインのテキストを表示する方法)は、第2のJFrame、およびテキストが変更される前。ここでの解決策は、コメントに記載されているとおりです。メソッドまたはコンストラクタのパラメータを使用して、あるクラスから別のクラスに情報を渡し、に転送する場合は、プログラム起動時だけでなく、が必要です。

また、コメントに記載されているように、2番目のダイアログウィンドウは、JFrame(アプリケーションウィンドウ)ではなくJDialogである必要があります。例えば

import java.awt.Dialog.ModalityType; 
import java.awt.Dimension; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 

public class TwoWindows { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

    private static void createAndShowGui() { 
     MainGui mainPanel = new MainGui(); 
     mainPanel.setPreferredSize(new Dimension(400, 250)); 
     JFrame frame = new JFrame("Main GUI"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

class MainGui extends JPanel { 
    private SubWindow subWindow = new SubWindow(); 
    private JDialog dialog; 
    private JTextField textField = new JTextField("Text in field", 10); 

    public MainGui() { 
     add(textField); 
     add(new JButton(new ShowDetailAction("Show Detail"))); 
    } 

    private class ShowDetailAction extends AbstractAction { 
     public ShowDetailAction(String name) { 
      super(name); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // if dialog not yet created -- create it 
      if (dialog == null) { 
       Window win = SwingUtilities.getWindowAncestor(MainGui.this); 
       dialog = new JDialog(win, "Details Window", ModalityType.MODELESS); 
       dialog.add(subWindow); 
       dialog.pack(); 
       dialog.setLocationRelativeTo(win); 
      } 
      String text = textField.getText(); 
      subWindow.passText(text); 
      dialog.setVisible(true); 
     } 
    } 
} 

class SubWindow extends JPanel { 
    private JLabel textLabel = new JLabel(" "); 

    public SubWindow() { 
     setPreferredSize(new Dimension(300, 60)); 
     add(new JLabel("Details:")); 
     add(textLabel); 
    } 

    public void passText(String text) { 
     textLabel.setText(text); 
    } 

} 
関連する問題