1

内側のjframeを呼び出していると呼び出されますが、外側のjframeは隠れていません。代わりにオーバーラップします。それで、これに対する解決策は何でしょう。ここから抜け出す方法はありますか?内部クラスのフレームを呼び出しているときに試したように、外部クラスのフレームも呼び出され、非表示になりません。

package com.exp.example;

import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


@SuppressWarnings("serial")
public class A extends JFrame implements ActionListener {
    JFrame rframe = new JFrame();
    JLabel CFirstName;
    JTextField Cfname;
    JButton jbsubmit;
    Container cp;

    public A() {

        rframe.setSize(500, 200);
        rframe.setLocationRelativeTo(null);
        cp = getContentPane();
        cp.setLayout(null);
        setSize(550, 300);
        rframe.setTitle("Outer Frame");
        cp.setBackground(new Color(140, 180, 180));

        CFirstName = new JLabel("First Name");
        Cfname = new JTextField(10);
        jbsubmit = new JButton("PREVIEW");

        CFirstName.setBounds(10, 20, 100, 35);
        Cfname.setBounds(150, 20, 150, 25);
        jbsubmit.setBounds(190, 110, 92, 25);
        cp.add(CFirstName);
        cp.add(Cfname);
        cp.add(jbsubmit);

        jbsubmit.addActionListener(this);

        rframe.add(cp);
        rframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        rframe.setVisible(true);
    }

    public void actionPerformed(ActionEvent ae) {
        String action = ae.getActionCommand();


        if (action == "PREVIEW") {
            /* Write the code here
             * When we click on preview button the frame of outer class(class A) gets
             * deactivated(closed) and inner frame, frame of inner class(class B) gets visible.
             * it should not be overlapped.  
             */
            /* My Code */
            new B();
            rframe.setVisible(false);

        }
    }

    public class B {
        JFrame frm = new JFrame();
        Container cp;

        public B() {
            frm.setSize(500, 200);
            frm.setLocationRelativeTo(null);
            cp = getContentPane();
            cp.setLayout(null);
            setSize(550, 300);
            frm.setTitle("Inner Frame");
            cp.setBackground(new Color(140, 180, 180));

            JLabel cpn = new JLabel("hello");
            cpn.setBounds(10, 20, 100, 35);
            cp.add(cpn);

            frm.add(cp);
            frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frm.setVisible(true);
        }
    }

    public static void main(String[] args) {
        new A();
    }
}
4

3 に答える 3

1

まず、ナイス SSCCE、多くの人が投稿していません。

次に、ラベルが重複していると思います。試してください:

if(action.equals("PREVIEW"))
    {
    CFirstName.setText("");
    new B();
    rframe.setVisible(false);

    }

幸運を!

于 2013-10-23T08:27:19.557 に答える
0

コンテナに誤りがあります。クラス A にはコンテナ cp があり、クラス B にもあります。ただし、プログラムは常にクラス A のコンテナ cp を参照します。したがって、クラス B ( new B() ) のオブジェクトを作成する前に、コンテナ cp のすべてのコンポーネントを削除する必要があります。重複することはありません。

public void actionPerformed(ActionEvent ae) {
    String action = ae.getActionCommand();


    if (action == "PREVIEW") {
        /* Write the code here
         * When we click on preview button the frame of outer class(class A) gets
         * deactivated(closed) and inner frame, frame of inner class(class B) gets visible.
         * it should not be overlapped.  
         */
        /* My Code */
        cp.removeAll();
        rframe.setVisible(false);
        new B();


    }
}
于 2013-10-23T14:57:14.867 に答える
0

1、A拡張しJFrameます。しかし、内部クラスBは拡張されませんJFrame

2、Aとの両方Bのコンストラクタで、オブジェクトgetContentPane()を取得するために呼び出しContentPaneます。B拡張せずJFrame、 の内部クラスであるためA。実際に同じオブジェクトを使用して何かを表示しますABContentPane

3, InAのコンストラクターには、すでにいくつかのコンポーネントが追加されています。そして、のコンストラクターで、同じオブジェクトBに a を追加します。したがって、これらすべてのコンポーネントが表示されます。のフレームが隠れていないからではありません。それは、同じオブジェクトが再び表示されるためです。JLabelContentPaneAContentPane

B解決策: extendsを作成できますJFrame

のコンストラクAターの 26 行目:

rframe.setSize(500, 200);
rframe.setLocationRelativeTo(null);
cp = getContentPane();
cp.setLayout(null);
setSize(550, 300);

のコンストラクBターの 74 行目:

frm.setSize(500, 200);
frm.setLocationRelativeTo(null);
cp = getContentPane();
cp.setLayout(null);
setSize(550, 300);

PSコードでは、常に新しいJFrameオブジェクトを作成して使用します。extendsのA意味はありません。以下の変更を行った方が良いかもしれません。BJFrame

1、クラスでは、新しいオブジェクトをA作成せず、単に使用します。これは.JFrameAJFrame

2、クラスBでは、実際に使用しているからcp = frm.getContentPane();取得するために使用します。ContentPaneJFrame

于 2013-10-23T08:55:13.180 に答える