-1

Panel1 クラスの Next JButton からアクション イベントのトリガー時に Panel2 クラスの JPanel panel2 を呼び出そうとすると、NullPointerException が発生します。これを解決するには?助けてください。

public class PanelEventTest
{

/**
 * @param args
 */
JFrame frame;

void originalFrame()
{
    frame = new JFrame();
    frame.setSize(500, 300);
    frame.setVisible(true);
    frame.setLayout(new FlowLayout());
    frame.add(new TestPanel1().panel1());
    frame.add(new TestPanel2().panel2());
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    new PanelEventTest().originalFrame();
}
}

public class TestPanel1
{
JPanel panel1;
JButton next;

JPanel panel1()
{
    panel1 = new JPanel();
    next = new JButton("Next");
    next.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e) 
        {
            // TODO Auto-generated method stub
            new TestPanel2().panel2.removeAll();
        }
    });
    panel1.add(next);
    return panel1;
}
}
public class TestPanel2
{
JPanel panel2;
JList jlist;
String[] list = {"Sachin","Tarun","Vipin"};
JPanel panel2()
{
    panel2 = new JPanel();
    jlist = new JList(list);
    panel2.add(jlist);
    panel2.add(new JLabel("Test"));
    return panel2;
}
}

JPanelに関する私の最後の質問Nullpointerexception は、皆さんによって正常に解決されました。これで助けてください。この例外は私の頭を食べています。

4

1 に答える 1

1

この行を変更しようとすると:

new TestPanel2().panel2.removeAll();

に:

new TestPanel2().panel2().removeAll();

問題は解決しますが、現在のロジックには欠陥があります。

より良い解決策は次のとおりです。

変更TestPanel2:

public class TestPanel2 {
    JPanel panel2;
    JList jlist;
    String[] list = { "Sachin", "Tarun", "Vipin" };

    public TestPanel2() { // was: JPanel panel2() {
        panel2 = new JPanel();
        jlist = new JList(list);
        panel2.add(jlist);
        panel2.add(new JLabel("Test"));
                      // was: return panel2;
    }
}

そして、次のように変更TestPanel1します。

public class TestPanel1 {
    JPanel panel1;
    JButton next;

    public TestPanel1(final JFrame frame, TestPanel2 tp2) { // was: JPanel panel1() {
        panel1 = new JPanel();
        next = new JButton("Next");
        final JPanel panel2 = tp2.panel2; // line created
        next.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                panel2.removeAll(); // was: new TestPanel2().panel2.removeAll();
                frame.validate(); // line created
                frame.paint(); // line created
            }
        });
        panel1.add(next);
                         // was: return panel1;
    }
}

最後に、PanelEventTest.originalFrame()次のように変更します。

frame.add(new TestPanel1().panel1());
frame.add(new TestPanel2().panel2());

に:

TestPanel2 tp2 = new TestPanel2();
frame.add(new TestPanel1(frame, tp2).panel1);
frame.add(tp2.panel2);
frame.validate();
frame.repaint();

説明

コンストラクターが必要なときに、メソッドを作成しています。これを読む必要があります:コンストラクターを理解する

また、 toを渡す必要がありTestPanel2ます。frameTestPanel1

  • あなたのコードはTestPanel2(誰にも添付されていない)新しいものを作成してから、そのパネルを呼び出しremoveAll()ていました。これはまったく効果がありません (このパネルはどこにも表示されないため)。
  • 変更された then コードはのパネルで呼び出さremoveAll()れます。TestPanel1
  • また、コンポーネントに変更を加えるたびに、コンポーネントを再検証/再描画する必要があります。
    • 現在、パネルの作成時frame(パネルの追加時) と削除時panel2(「次へ」ボタンのアクション内) にそれらを変更します。
于 2013-04-13T09:18:48.763 に答える