2012-04-14 15 views
2

私はスイングJFrameを持っています。以下のコードでは、 'Add Address'メニュー項目の選択時にJFrameの内容を設定しようとしていますが、失敗しています。スイングメニュー項目選択でコンテンツペインの内容が設定されていません

 JFrame frame = new JFrame(); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setResizable(false); 
    frame.setVisible(true); 

    JMenuBar menuBar = new JMenuBar(); 
    JMenu clientMenu = new JMenu("Client"); 
    JMenuItem address = new JMenuItem("Add Address"); 

    clientMenu.add(address); 
    menuBar.add(clientMenu); 

    address.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      setupAddressForm(); 
     } 
    }); 

    private void setupAddressForm() { 
     frame.getContentPane().removeAll(); 

     JPanel infoPanel = new JPanel(); 
     JLabel infoLabel = new JLabel(); 
     infoLabel.setText("<html><B>Please enter the address below</B></html>"); 
     infoPanel.add(infoLabel, SwingConstants.CENTER); 
     frame.getContentPane().add(infoPanel, BorderLayout.NORTH); 

     JPanel buttonPanel = new JPanel(); 
     JButton submitButton = new JButton("Submit Address"); 
     JButton resetButton = new JButton("Reset"); 

     submitButton.setToolTipText("Submit"); 
     resetButton.setToolTipText("Reset"); 

     buttonPanel.add(submitButton); 
     buttonPanel.add(resetButton); 

     frame.getContentPane().add(buttonPanel, BorderLayout.SOUTH); 

     JPanel fieldPanel = new JPanel(); 
     fieldPanel.setLayout(new GridLayout(10, 10)); 

     JLabel houseNumberLabel = new JLabel("House Number", 
       SwingConstants.LEFT); 
     final JTextField houseNumberField = new JTextField(3); 

     JLabel streetNameLabel = new JLabel("Street Name", SwingConstants.LEFT); 
     final JTextField streetNameField = new JTextField(10); 

     JLabel localityLabel = new JLabel("Locality", SwingConstants.LEFT); 
     final JTextField localityField = new JTextField(10); 

     JLabel cityLabel = new JLabel("City", SwingConstants.LEFT); 
     final JTextField cityField = new JTextField(10); 

     JLabel stateLabel = new JLabel("State", SwingConstants.LEFT); 
     final JTextField stateField = new JTextField(10); 

     JLabel zipCodeLabel = new JLabel("Zip Code", SwingConstants.LEFT); 
     final JTextField zipCodeField = new JTextField(10); 

     fieldPanel.add(houseNumberLabel); 
     fieldPanel.add(houseNumberField); 

     fieldPanel.add(streetNameLabel); 
     fieldPanel.add(streetNameField); 

     fieldPanel.add(localityLabel); 
     fieldPanel.add(localityField); 

     fieldPanel.add(cityLabel); 
     fieldPanel.add(cityField); 

     fieldPanel.add(stateLabel); 
     fieldPanel.add(stateField); 

     fieldPanel.add(zipCodeLabel); 
     fieldPanel.add(zipCodeField); 

     frame.getContentPane().add(fieldPanel, BorderLayout.CENTER); 

     submitButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 

       String houseNumber = houseNumberField.getText(); 
       String street = streetNameField.getText(); 
       String locality = localityField.getText(); 
       String city = cityField.getText(); 
       String state = stateField.getText(); 
       String zipCode = zipCodeField.getText(); 

       Address address = new Address(); 

       if (!"".equals(houseNumber) && !"".equals(street) 
         && !"".equals(locality) && !"".equals(city) 
         && !"".equals(state) && !"".equals(zipCode)) { 
        address.setHouseNumber(houseNumber); 
        address.setStreetName(street); 
        address.setLocality(locality); 
        address.setState(state); 
        address.setZipCode(zipCode); 
       } 

      } 
     }); 

     frame.getContentPane().doLayout(); 
     frame.getContentPane().update(frame.getGraphics()); 

} 

[アドレスの追加]メニュー項目を選択すると、フレームが空白になります。私が期待したものではありません。私はブレークポイントを使用してデバッグし、アドレスを設定するメソッドが呼び出されていることを確認します。 なぜ動作しないのかわかりません。私がここで何か悪いことをしていると指摘できますか?

答えて

4

なぜこの体操をすべて通過するのですか?代わりに、単にCardLayoutを使用して、混乱や混乱を最小限に抑えてビューを入れ替えることができます。

JFrame frame = new JFrame(); // (A) 

ライン(Bで使用したものと同じJFrameのではありません。

はまた、あなたがライン上で作成したJFrameメソッドまたはコンストラクタのいずれかで(A)は(あなたが言っていない)ことに注意してください)および(C):あなたは線(A)上のJFrameを宣言し、それがそのメソッドやコンストラクタ内でのみ可視であるため

private void setupAddressForm() { 
     frame.getContentPane().removeAll(); // (B) 

     JPanel infoPanel = new JPanel(); 
     JLabel infoLabel = new JLabel(); 
     infoLabel.setText("<html><B>Please enter the address below</B></html>"); 
     infoPanel.add(infoLabel, SwingConstants.CENTER); 
     frame.getContentPane().add(infoPanel, BorderLayout.NORTH); // (C) 

です。 1

編集はまた、これは権利ではありません:そのよう

frame.getContentPane().doLayout(); 
    frame.getContentPane().update(frame.getGraphics()); 

は、新しいコンポーネントがスイングのコンテナに表示する取得する方法はありません。代わりに私はそういうことをします:

JPanel contentPane = (JPanel) frame.getContentPane(); 
    contentPane.revalidate(); 
    contentPane.repaint(); 

しかし、私は実際にはどちらもしません。代わりに上記のようにCardLayoutを使用します。

最後に、これらの推奨事項のいずれかが意味をなさない場合は、説明を求めてください。

+0

"これはJFrameをライン(A)で宣言しているため、そのメソッドまたはコンストラクタ内でのみ表示されるからです。私は上記の完全なコードを投稿していません。しかし、CardLayoutは私の問題を解決しました。ソリューションに感謝します。 – sachinrahulsourav

+0

@ sachinrahulsourav:あなたは大歓迎です.CardLayoutを使用すると、私が思う仕事に最適なツールを使用しています。 –

関連する問題