2012-02-09 5 views
4

これは私を狂ってしまいます。 3つのボタンをクリックするとパネルを変更しようとしていますが、1つのパネルに対しては1回だけ動作します。同じパネルを再追加できません

[addPerson]をクリックすると、[Person]パネルに が表示されます。次にaddCDをクリックすると、CDパネルが表示されます。 (ビューストアと同じ) addPersonをクリックすると、動作しません。 nullpointer例外がスローされます。 addCD/viewstoreをクリックしてもそれが表示されますが、その後にもう一度表示されないPersonを追加しても、テストファイルで

、私は追加してGUIを作成し、削除します。私はそれを追加クリックした場合は、nullポインタ例外を投げたが、私はちょうどそれをすでに追加してコンパイルした場合、それは...

/* PERSON PANEL */ 
public JPanel create_PersonPnl() 
{ 
    personPnl = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
    personPnl.setBackground(Color.WHITE); 
    personPnl.setPreferredSize(minPnl); 

    /* VERTICAL BOX for Person boxes */ 
    Box personBox = Box.createVerticalBox(); 
    personBox.setBorder(new TitledBorder(new LineBorder(Color.DARK_GRAY), "Person")); 

     /* Horizontal Box for Name Lbl & TF */ 
     Box nameBox = Box.createHorizontalBox(); 
      nameBox.add(Box.createHorizontalStrut(10)); 
      nameLbl = new JLabel("Name: "); 
      nameBox.add(nameLbl); 
      nameBox.add(Box.createHorizontalStrut(5)); 
      nameTF = new JTextField(); 
      nameBox.add(nameTF); 
      nameBox.add(Box.createHorizontalStrut(10)); 

     personBox.add(nameBox); 
     personBox.add(Box.createVerticalStrut(10)); 
     Box limitBox = Box.createHorizontalBox(); 
      limitBox.add(Box.createHorizontalStrut(10)); 
      limitLbl = new JLabel("CD Limit: "); 
      limitBox.add(limitLbl); 
      limitTF = new JFormattedTextField(); 
      limitBox.add(limitTF); 
      limitBox.add(Box.createHorizontalStrut(10)); 
     personBox.add(limitBox); 
     personBox.add(Box.createVerticalStrut(10)); 
     personBox.add(addPersonBtn = new JButton("Add Person")); 
     personBox.add(Box.createVerticalStrut(10)); 
      personList = new JList(temp); 
      personList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
      scrollp = new JScrollPane(personList); 
       scrollp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
       scrollp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
      scrollp.setSize(100, 45); 
      personBox.add(scrollp); 
      personBox.add(Box.createVerticalStrut(10)); 
     Box optionsBox = Box.createHorizontalBox(); 
      editPrsnBtn = new JButton("Edit"); 
      editPrsnBtn.addActionListener(this); 
      optionsBox.add(editPrsnBtn); 
      removePrsnBtn = new JButton("Remove"); 
      removePrsnBtn.addActionListener(this); 
      optionsBox.add(removePrsnBtn); 
     personBox.add(optionsBox); 

    personPnl.add(personBox); 
    return personPnl; 
} 
大丈夫でした

これは私のActionPerformedメソッドにあるものです。

if(e.getSource() == addPersonBtn) 
    { 
     changePnl.removeAll(); 
     changePnl.add(create_PersonPnl()); 
     changePnl.revalidate(); 
     System.out.println("PersonPnl added"); 
    } 

    if(e.getSource() == addCDBtn) 
    { 
     changePnl.removeAll(); 
     changePnl.add(create_CDPnl()); 
     changePnl.revalidate(); 
    } 

    if(e.getSource() == viewStoreBtn) 
    { 
     changePnl.removeAll(); 
     changePnl.add(create_StorePnl()); 
     changePnl.revalidate(); 
    } 

ChangePnlのコードのみです。

changePnl = new JPanel(); 
    changePnl.setBackground(Color.WHITE); 
defaultPnl = new JPanel(); 
defaultPnl.setBackground(Color.WHITE); 
defaultPnl.add(new JLabel("Welcome to the CD Store")); 
defaultPnl.add(new JLabel("Click an option from the left")); 
changePnl.add(defaultPnl); 

S.O.Pラン...と一度だけプリントと私は.add(create_PersonPnlを())取り出しない限り、それはそれだとされていたものを見るためにデバッグしました。だから私はそれを狭めましたが、それは最初に動作するので、私は手掛かりを持っていません。

ありがとうございます!それはcreate_PersonPnl(だことを証明するために

別のテストファイル)

あなたの方法では
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 
import javax.swing.border.LineBorder; 
import javax.swing.border.TitledBorder; 

public class Test implements ActionListener 
{ 
JButton add, remove; 
JButton addPersonBtn, editPrsnBtn, removePrsnBtn; 
JFrame frame; 
JFormattedTextField limitTF; 
JLabel nameLbl, limitLbl; 
JList personList; 
JPanel TotalGUI, welcomePnl, mainPnl, imagePnl, changePnl, defaultPnl, cdPnl,  storePnl; 
JPanel personPnl; 
JScrollPane scrollp; 
JTextField nameTF; 

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
Dimension minPnl = new Dimension(300, 400); 

/* Test for JList */ 
String[] temp = {"1", "2", "3", "4", "1", "2", "3", "4","1", "2", "3", "4","1", "2", "3", "4" }; 

public Test() 
{ 
    frame = new JFrame("CD Store"); 
    frame.setExtendedState(JFrame.NORMAL); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //frame.pack(); //sets size based on components size in TotalGUI 
    //frame.setJMenuBar(create_MenuBar()); 
    //frame.setMinimumSize(minDim); 

    frame.setSize(725, 550); 

    //set frame location (central to screen) 
    int fw = frame.getSize().width; 
    int fh = frame.getSize().height; 
    int fx = (dim.width-fw)/2; 
    int fy = (dim.height-fh)/2; 


    frame.getContentPane().add(create_Content_Pane()); 
    frame.setVisible(true); 

    //moves the frame to the centre 
    frame.setLocation(fx, fy); 
} 

public JPanel create_Content_Pane() 
{ 
    JPanel TotalGUI = new JPanel(); 

    TotalGUI.add(remove = new JButton("Remove")); 
    remove.addActionListener(this); 

    TotalGUI.add(add = new JButton("Add")); <- this crashes when selected 
    add.addActionListener(this); 

    //TotalGUI.add(create_PersonPnl()); <- works just fine 

    return TotalGUI; 
} 

public JPanel create_PersonPnl() 
{ 
    personPnl = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
    personPnl.setBackground(Color.WHITE); 
    personPnl.setPreferredSize(minPnl); 

    /* VERTICAL BOX for Person boxes */ 
    Box personBox = Box.createVerticalBox(); 
    personBox.setBorder(new TitledBorder(new LineBorder(Color.DARK_GRAY), "Person")); 

     /* Horizontal Box for Name Lbl & TF */ 
     Box nameBox = Box.createHorizontalBox(); 
      nameBox.add(Box.createHorizontalStrut(10)); 
      nameLbl = new JLabel("Name: "); 
      nameBox.add(nameLbl); 
      nameBox.add(Box.createHorizontalStrut(5)); 
      nameTF = new JTextField(); 
      nameBox.add(nameTF); 
      nameBox.add(Box.createHorizontalStrut(10)); 

     personBox.add(nameBox); 
     personBox.add(Box.createVerticalStrut(10)); 
     Box limitBox = Box.createHorizontalBox(); 
      limitBox.add(Box.createHorizontalStrut(10)); 
      limitLbl = new JLabel("CD Limit: "); 
      limitBox.add(limitLbl); 
      limitTF = new JFormattedTextField(); 
      limitBox.add(limitTF); 
      limitBox.add(Box.createHorizontalStrut(10)); 
     personBox.add(limitBox); 
     personBox.add(Box.createVerticalStrut(10)); 
     personBox.add(addPersonBtn = new JButton("Add Person")); 
     personBox.add(Box.createVerticalStrut(10)); 
      personList = new JList(temp); 
      personList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
      scrollp = new JScrollPane(personList); 
       scrollp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
       scrollp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
      scrollp.setSize(100, 45); 
      personBox.add(scrollp); 
      personBox.add(Box.createVerticalStrut(10)); 
     Box optionsBox = Box.createHorizontalBox(); 
      editPrsnBtn = new JButton("Edit"); 
      editPrsnBtn.addActionListener(this); 
      optionsBox.add(editPrsnBtn); 
      removePrsnBtn = new JButton("Remove"); 
      removePrsnBtn.addActionListener(this); 
      optionsBox.add(removePrsnBtn); 
     personBox.add(optionsBox); 

    personPnl.add(personBox); 
    return personPnl; 
} 

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

public void actionPerformed(ActionEvent e) 
{ 
    if(e.getSource() == remove) 
    { 
     TotalGUI.removeAll(); 
     TotalGUI.revalidate(); 
    } 

    if(e.getSource() == add) 
    { 
     TotalGUI.add(create_PersonPnl()); 
     TotalGUI.revalidate(); 
    } 
} 
} 
+0

これは:public JPanel create_PersonPnl(){personPnl = new JPanel(新しいFlowLayout(FlowLayout.CENTER)); return personPnl; }うまくいくと思う。私たちが見ていない 'changePnl'に何か起こっていますか? – David

+1

Java命名規則を学び、それらに固執してください – kleopatra

答えて

1

public JPanel create_Content_Pane() 
{ 
    JPanel TotalGUI = new JPanel(); 

    TotalGUI.add(remove = new JButton("Remove")); 
    remove.addActionListener(this); 

    TotalGUI.add(add = new JButton("Add")); <- this crashes when selected 
    add.addActionListener(this); 

    //TotalGUI.add(create_PersonPnl()); <- works just fine 

    return TotalGUI; 
} 

プライベートフィールドTotalGUIがヌルであるため、NullPointerExceptionが発生する...の前にJPanelの宣言を削除しますTotalGUI = new JPanel();これは、NULLポインターの問題を解決します。これはおそらく、テストシナリオでのあなたの問題だけを解決します...オリジナルのシナリオで問題を解決するには、クラスの完全なソースコードを持つことが良いでしょう..

+0

ダムニット、私はそれを見たはずです。私の他のコードでは、TotalGUIパネルのすべてがグローバルに宣言されています。しかし、それはありがとう! – liloka

+0

あなたの問題は、あなたの世界的に宣言されたフィールドの何かがヌルかそのようなものかもしれないと思います。しかし、実際には完全なコードなしで見ることはできません。 – Vossi

+0

+1、いいキャッチです。良いデバッグ:-) –