0

JButton をクリックして既存の JPanel(cardLayout) に新しいカードを追加し、その新しいカードに移動しようとしていますが、新しいカードが登録されていないため、Null 例外が発生します。

私はグーグルを検索しようとしましたが、見つけることができず、例を見つけることができず、次を使用してレイアウトを「保存」しようとしました

.validate();
.refresh();
.repaint();

しかし、何も機能しません。これは動的に可能ですか? もしそうなら、誰かが例を知っていますか?

以下のコードでは、jPanelSliding1.nextSlidPanel は CardLayout で選択された JPanel に移動するだけです。ここで作成された新しいパネルは、パネルが見つからないため、null エラーを引き起こしています。ありがとう:)

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package partnerships;

import components.ColorScheme;
import components.Utilities;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JSlidingPanel extends javax.swing.JPanel implements PropertyChangeListener {

    public PropertyChangeSupport pcs = new PropertyChangeSupport(this);
    private ColorScheme scheme;

    public JSlidingPanel() {
        initComponents();
        pcs.addPropertyChangeListener(this);
        scheme = new ColorScheme();
        Object[][] object = {
            {pcs, "Offered", "BT details", scheme.green()},
            {pcs, "Sold", "BT details", scheme.pink()},
            {pcs, "Other", "BT details", scheme.purple()}
        };

        jPanelSliding1.add(makePanels(object));
    }

    private void setupGUI() {
    }

    private JPanel makePanels(Object[][] objects) {
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(0, objects.length));
        for (Object[] properties : objects) {
            panel.add(new ObjectPanel((PropertyChangeSupport) properties[0], properties[1].toString(), properties[2].toString(), (Color) properties[3]));
        }
        return panel;
    }

    private void newPanel(String str) {
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.add(new JButton());
        jPanelSliding1.add(panel);

        jPanelSliding1.refresh();
        jPanelSliding1.validate();
        jPanelSliding1.repaint();

        validate();
        repaint();
        Utilities.getTopFrame().pack();
        jPanelSliding1.NextSlidPanel(10, panel);
        jPanelSliding1.refresh();
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (this.isVisible() == true) {
//            makePanels();
            newPanel(evt.getPropertyName());
        }
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                JPanel panel = new JPanel();
                JSlidingPanel app = new JSlidingPanel();

                panel.add(app);
                frame.add(panel);
                frame.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
                frame.setVisible(true);
                frame.pack();
            }
        });
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
    private void initComponents() {

        jPanelSliding1 = new apps.JPanelSliding();

        setPreferredSize(new java.awt.Dimension(900, 600));
        setLayout(new java.awt.BorderLayout());

        jPanelSliding1.setLayout(new java.awt.CardLayout());
        add(jPanelSliding1, java.awt.BorderLayout.CENTER);
    }// </editor-fold>                       
    // Variables declaration - do not modify                    
    private apps.JPanelSliding jPanelSliding1;
    // End of variables declaration                  
}
4

4 に答える 4

1

これが機能するかどうかはわかりませんが、

私が見ているのは、jPanelSliding値を「更新/再描画/検証」しようとしているということです。代わりに、変更する必要があるのは、クリックしようとしているパネルです。jPanelSliding は更新される可能性がありますが、パネル (メインで宣言されている) は実現されていません。

それでは、メインで宣言されたパネルに対して「検証」呼び出しを行ってみませんか?

それを試して、うまくいくかどうか教えてもらえますか?

于 2013-05-14T10:39:01.380 に答える
0

私の問題に対する答えが見つかりました。何らかの理由で、パネルを作成した後にパネルに名前を付ける必要がありました。そうしないと、パネルが見つかりません。助けてくれてありがとう。

     JPanel panel = new JPanel();
**panel.setName("abc");**
        panel.setLayout(new BorderLayout());
于 2013-05-14T11:03:33.007 に答える
0

私も同じ問題を扱っていました。
いくつかのテスト、再テスト、および多くの失敗の後、私の疑似アルゴリズムは次のとおりです

。parentPanel:削除したいパネルが含まれていますchildPanel:
切り替えたいパネルparentPanelLayout: parentPanel
のレイアウト
毎回parentPanelLayout

parentPanel.remove(childPanel); 
editParentLayout();
parentPanel.revalidate();
parentPanel.repaint();
于 2013-10-26T07:55:24.200 に答える