1

ここで明らかに何かが欠けています。

まったく新しいパネルを表示するようにスイング フレームを変更するにはどうすればよいですか?

1. 新しいコンテンツを含むまったく新しいパネルを表示する、または 2. 新しく追加した同じパネルをクリアして表示する

別のプログラムで新しいパネルを表示しましたが、正しく作成および表示されます。

ただし、ボタンのあるパネルが以前にフレームにあった場合、新しいパネルは表示されません。

contentPane.revalidate(); を呼び出します。コードで数回ボタンを更新して問題なく更新すると、古いボタンを削除して新しいボタンを追加しようとしたときにのみ問題が発生します。

新しいパネルを contentPane に追加した後、次のことを試しました。

contentPane.validate();
contentPane.revalidate();
contentPane.removeAll();        
contentPane.repaint();
setContentPane(contentPane);

しかし、それは決して変わりません。

 @Override
public void actionPerformed(ActionEvent e) 
{
    String buttonPressed = e.getActionCommand();
    int pos = Integer.valueOf(buttonPressed);

    if (Control.model.cardsRemaining == 0) 
    {
        contentPane.removeAll();
        //contentPane.validate();
        //contentPane = new JPanel();
        //contentPane.add(createSuccess());
        contentPane = createSuccess();
        contentPane.revalidate();
        contentPane.repaint();      

        System.out.println("entered success");
    }

    else 
    {
        System.out.println("Cards left: " + Control.model.cardsRemaining);
        action = Control.model.ReceiveCardsTurned(pos);

        keypadArray[pos].setIcon(myIcons[pos]);
        currentTime.setText("" + Control.model.time);
        currentScore.setText("" + Control.model.score);

        System.out.println("this card: " + pos + "last card: "
                + Control.model.lastCard);

        if (action == "unturn") 
        {
            try 
            {
                Thread.sleep(1000);
            }

            catch (InterruptedException e1) 
            {
                e1.printStackTrace();
            }

            contentPane.revalidate();
            keypadArray[pos].setIcon(back);
            keypadArray[Control.model.lastCard].setIcon(back);
        }

        //System.out.println(action);
    }
}



private JPanel createSuccess() 
{
    //final 
    JPanel Success = new JPanel();
    JLabel image = new JLabel(success);
    Success.add(image);

    return Success; 
}

また、これは私のコードのさらに上にあります:

ImageIcon success = new ImageIcon("icons/success.png");

と:

JPanel contentPane = new JPanel();

ちょうど試した:

contentPane = createSuccess(); 
frame.setContentPane(contentPane);  
frame.pack();                

268 行目: frame.setContentPane(contentPane);

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at pairs.GUI.actionPerformed(GUI.java:268)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

完璧に機能した友人に感謝します:

contentPane.removeAll();
contentPane.add(createSuccess());
setContentPane(contentPane);
4

1 に答える 1

4

コードは変数に新しい参照を割り当てますcontentPane。これは、既に画面に表示されているものを変更せず、参照していたcontentPaneもの (おそらく画面に表示されているもの) を別のものに移動し、画面に表示されているものを正確にそのままにします。

新しいパネルを追加してみてくださいcontentPane

contentPane.removeAll();
contentPane.add(createSuccess());

ビューを切り替えたい場合CardLayoutは、より良い選択です。

ビューを単に「リセット」したい場合は、ビューの内容を「デフォルト」の状態に戻すコードを実際に記述する必要があります。この場合、実際には、ビューに必要なフィールドを含み、管理メソッドを提供するカスタム コンポーネントを作成する方が適切です。

于 2012-12-13T22:21:44.660 に答える