2016-05-20 6 views
-1

私はアプリケーションを構築していて、テキストフィールドの内容を '転送'したいが、何か問題があり、なぜ..1つのJFrameから別のJFrameにテキストを転送する(コードで間違いを見つけられない)

私のメインフレームのコードです。ユーザーがfile-new-Actorにナビゲートすると、Frameがポップアップします。ここで、ユーザーはいくつかの情報を入力する必要があります。この情報(この場合はテキストからテキスト)をメインフレームのテキストフィールドに転送したいと思います。私はメニューに移動し、新しい俳優を選択すると、ウィンドウのポップをこのコードを使用して

class NewActorFrame extends JFrame implements ItemListener 

{ 
final String[] typeList = {"Human","Machine","System"}; 
public JTextField actorNameText = new JTextField(); 
private JButton btnCreateActor = new JButton("Create"); 
private JLabel lblTypeOfActor = new JLabel("Type of actor"); 
private JComboBox typeOfActor = new JComboBox(); 
private JPanel topPanel = new JPanel(); 


public NewActorFrame() 
{ 

    setTitle("Create a new actor"); 
    setSize(489, 414); 
    setBackground(Color.gray); 
    getContentPane().setLayout(new BorderLayout()); 


    topPanel.setLayout(null); 
    getContentPane().add(topPanel, BorderLayout.CENTER); 

    // Create a combobox where the user can choose the type of actor   to  be created 
    typeOfActor.setBounds(140, 109, 260, 20); 
    topPanel.add(typeOfActor); 

    // Populate the combobox list 
    for(int countTypes = 0; countTypes < typeList.length; countTypes++){ 
    typeOfActor.addItem(typeList[countTypes]); 
    } 
    // Disable edits - the user can not add other types of actors 
    typeOfActor.setEditable(false); 
    lblTypeOfActor.setBounds(12, 112, 121, 15); 
    topPanel.add(lblTypeOfActor); 

    JLabel lblNameOfActor = new JLabel("Name of Actor"); 
    lblNameOfActor.setBounds(12, 155, 121, 15); 
    topPanel.add(lblNameOfActor); 

    actorNameText.setBounds(140, 153, 225, 19); 
    topPanel.add(actorNameText); 
    actorNameText.setColumns(10); 

    btnCreateActor.setBounds(293, 229, 117, 25); 
    topPanel.add(btnCreateActor); 


    // Watch for changes 
    typeOfActor.addItemListener(this); 


    btnCreateActor.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      okButtonAction(); 
     } 
    }); 



} 




public void itemStateChanged(ItemEvent event) 
{ 
    if(event.getSource() == typeOfActor 
      && event.getStateChange() == ItemEvent.SELECTED) 
    { 
     System.out.println("Change:" 
         + typeOfActor.getSelectedItem()); 
    } 
} 

public String getFieldText() { 
     return actorNameText.getText(); 
    } 

private void okButtonAction() { 

    System.out.println(getFieldText()); 
    System.out.println("Create pressed"); 
    this.dispose(); 
    } 
} 

public class GUI { 

private JFrame frmGUI = new JFrame(); 
private JMenuItem mntmActor; 
private JTextField gotText = new JTextField(); 
private NewActorFrame actorFrame = new NewActorFrame(); 
private JPanel panel = new JPanel(); 
private final JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       GUI window = new GUI(); 
       window.frmGUI.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the application. 
*/ 
public GUI() { 
    initialize(); 
} 

/** 
* Initialize the contents of the frame. 
*/ 
private void initialize() { 
    initComponents(); 
    createEvents(); 

} 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
///////// this method is for visualising all the components of the GUI such 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// as 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// buttons, 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// panels, 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// etc. 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
private void initComponents() { 
    // TODO Auto-generated method stub 

    frmGUI.setTitle("Use Case Tool"); 
    frmGUI.setBounds(100, 100, 762, 621); 
    frmGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frmGUI.getContentPane().setLayout(new BorderLayout(0, 0)); 

    // add elements to the form 
    frmGUI.getContentPane().add(panel, BorderLayout.SOUTH); 
    frmGUI.getContentPane().add(tabbedPane, BorderLayout.CENTER); 

    tabbedPane.addTab("New tab", null, gotText, null); 
    gotText.setColumns(10); 

    JTree tree = new JTree(); 
    tree.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
      JPanel textView = new JPanel(); 
      tabbedPane.addTab("Text View", null, textView, null); 

     } 
    }); 
    tree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode("Project \"Test\"") { 
     { 
      add(new DefaultMutableTreeNode("Use Cases")); 
      add(new DefaultMutableTreeNode("Actors")); 
     } 
    })); 
    frmGUI.getContentPane().add(tree, BorderLayout.WEST); 

    JMenuBar menuBar = new JMenuBar(); 
    frmGUI.setJMenuBar(menuBar); 

    JMenu mnFile = new JMenu("FIle "); 
    menuBar.add(mnFile); 

    JMenu mnN = new JMenu("New"); 
    mnFile.add(mnN); 

    JMenuItem mntmFolderInProject = new JMenuItem("Folder in Project"); 
    mnN.add(mntmFolderInProject); 

    mntmActor = new JMenuItem("Actor"); 

    mnN.add(mntmActor); 

    JMenuItem mntmUseCase = new JMenuItem("Use Case"); 
    mnN.add(mntmUseCase); 

    JMenuItem mntmSystem = new JMenuItem("System"); 
    mnN.add(mntmSystem); 

    JMenuItem mntmExport = new JMenuItem("Exit"); 
    mnFile.add(mntmExport); 

    JMenu mnCreate = new JMenu("Help"); 
    menuBar.add(mnCreate); 

} 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
///////// this method is for the events which are going to be triggered 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
private void createEvents() { 

    mntmActor.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      // TODO Auto-generated method stub 
      System.out.println("Create a new actor"); 
      actorFrame.setVisible(true); 
      gotText.setText(actorFrame.getFieldText()); 

     } 
    }); 

} 
} 

これが現れ、他の1のために今のメインウィンドウのためのクラスであり、私は名前の値を入力しますが、ボタンを押すとテキストは表示されません。私は、これを行うと再びアクションを作成し、メニューのActorを押すと、前のテキストフィールドの値が取得されることに気付きました。そして、これは私が欲しいものではありません。

お手伝いをしてくださったみなさん、ありがとうございます!

+2

1)、2)は、JavaのGUIは、「異なるOS上で動作する必要がある[複数JFramesの使用、グッド/悪い習慣?](http://stackoverflow.com/q/9554636/418556)を参照してください画面サイズ、画面さまざまなロケールで異なるPLAFを使用しています。したがって、ピクセルの完全なレイアウトには役立ちません。代わりに、レイアウトマネージャや[それらの組み合わせ](http://stackoverflow.com/a/5630271/418556)と[空白](http://stackoverflow.com/a/17874718/)のレイアウトパディングとボーダーを使用してください。 418556)。 –

+0

*「お手伝いしてくれている皆様、ありがとうございます!」*質問してくれてありがとう!待って。何?あなたの質問*「どのようにX?」*ですか?その場合は、[質問の編集](http://stackoverflow.com/posts/37336756/edit)として追加してください。そうでない場合は、特定の質問を考えて同じことをしてください(編集)。 –

+2

はBTW - 'NewActorFrame'は' NewActorModalDialog'であるべきで、それが何かを拡張するが、 'JDialog'の標準インスタンスを使用しないでください.. –

答えて

2

なぜ有用な情報を転送する必要がありますか?ユーザーが情報を入力する前に、2番目のウィンドウが表示されたらすぐに情報を要求しています。したがって、データが渡されないというあなたの現在の行動は驚くべきことではありません。

これを修正するにはどうすればよいですか? 2番目のウィンドウは、モーダルダイアログ(モーダルJDialogなど)であり、別のJFrame(Andrew Thompsonがコメントであなたに伝えているように)ではありません。このようにして、呼び出しウィンドウからのプログラムフローは、ダイアログウィンドウが処理されて見えなくなるまで停止します。

この同じ質問には時間と時間がもう一度尋ねられます。ちょっとした掘り出しをするだけで、何度も何度も何度も同じことが起こります。

関連する問題