import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
public class OptionDialogTest
{
public static void main(String[] args)
{
OptionDialogFrame frame=new OptionDialogFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
class ButtonPanel extends JPanel
{
public ButtonPanel(String title,String[] options)
{
setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),title));
setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
    group=new ButtonGroup();
    
for(int i=0;i<options.length;i++)
{
JRadioButton b=new JRadioButton(options[i]);
b.setActionCommand(options[i]);
add(b);
group.add(b);
b.setSelected(i==0);
}
}
public String getSelection()
{
return group.getSelection().getActionCommand();
}
private ButtonGroup group;
}
class OptionDialogFrame extends JFrame
{
public OptionDialogFrame()
{
setTitle("OptionDialogTest");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
JPanel gridPanel=new JPanel();
gridPanel.setLayout(new GridLayout(2,3));
typePanel=new ButtonPanel("Type",new String[]
{
"ERROR_MESSAGE",
"INFORMATION_MESSAGE",
"WARNING_MESSAGE",
"QUESTION_MESSAGE",
"PLAIN_MESSAGE"
});
messagePanel=new ButtonPanel("Message",new String[]
{
"String",
"Icon",
"Component",
"Other",
"Object[]"
});
optionTypePanel=new ButtonPanel("Confirm",new String[]
{
"DEFAULT_OPTION",
"YES_NO_OPTION",
"YES_NO_CANCEL_OPTION",
"OK_CANCEL_OPTION"
});
optionsPanel=new ButtonPanel("Option",new String[]
{
"Stirng[]",
"Icon[]",
"Object[]"
});
inputPanel=new ButtonPanel("Input",new String[]
{
"Text field",
"Combo box"
});
gridPanel.add(typePanel);
gridPanel.add(messageTypePanel);
gridPanel.add(messagePanel);
gridPanel.add(optionTypePanel);
gridPanel.add(optionsPanel);
gridPanel.add(inputPanel);
JPanel showPanel=new JPanel();
JButton showButton=new JButton("show");
showButton.addActionListener(new ShowAction());
showPanel.add(showButton);

Container contentPane=getContentPane();
contentPane.add(gridPanel,BorderLayout.CENTER);
contentPane.add(showPanel,BorderLayout.SOUTH);

}
public Object getMessage()
{
String s=messagePanel.getSelection();
if(s.equals("String"))
return messageString;
else if(s.equals("Icon"))
return messageIcon;
else if(s.equals("Component"))
return messageComponent;
else if(s.equals("Object[]"))
return new Object[]
{
messageString,
messageIcon,
messageComponent,
messageObject
};
else if(s.equals("Other"))
return messageObject;
else return null;
}
public Object[] getOptions()
{
String s=optionsPanel.getSelection();
if(s.equals("String[]"))
return new String[]
{
"Yellow","Blue","Red"
};
else if(s.equals("Icon[]"))
return new Icon[]
{
new ImageIcon("yellow_ball.gif"),
new ImageIcon("blue_ball.gif"),
new ImageIcon("red_ball.gif")
};
else if(s.equals("Object[]"))
return new Object[]
{
messageString,
messageIcon,
messageComponent,
messageObject
};
else 
return null;
}
public int getType(ButtonPanel panel)
{
String s=panel.getSelection();
try
{
return JOptionPane.class.getField(s).getInt(null);
}
catch(Exception e)
{
return -1;
}
}
private class ShowAction implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
if(typePanel.getSelection().equals("Confirm"))
JOptionPane.showConfirmDialog(
OptionDialogFrame.this,
getMessage(),
"Title",
getType(optionTypePanel),
getType(messageTypePanel));
else if(typePanel.getSelection().equals("Input"))
{
if(inputPanel.getSelection().equals("Text field"))
JOptionPane.showInputDialog(
OptionDialogFrame.this,
getMessage(),
"Title",
getType(messageTypePanel));
        else  
        JOptionPane.showInputDialog(
OptionDialogFrame.this,
getMessage(),
"Title",
getType(messageTypePanel),
null,
new String[]{"Yellow","Blue","Red"},
"Blue");
}
else if(typePanel.getSelection().equals("Message"))
JOptionPane.showMessageDialog(
OptionDialogFrame.this,
getMessage(),
"Title",
getType(messageTypePanel));

else if(typePanel.getSelection().equals("Option"))
JOptionPane.showOptionDialog(
OptionDialogFrame.this,
getMessage(),
"Title",
getType(optionTypePanel),
getType(messageTypePanel),
null,
getOptions(),
getOptions()[0]);
}
}
public static final int DEFAULT_WIDTH=600;
public static final int DEFAULT_HEIGHT=400;
private ButtonPanel typePanel;
private ButtonPanel messagePanel;
private ButtonPanel messageTypePanel;
private ButtonPanel optionTypePanel;
private ButtonPanel optionsPanel;
private ButtonPanel inputPanel;
private String messageString="Message";
private Icon messageIcon=new ImageIcon("blue_ball.gif");
private Object messageObject=new Date();
private Component messageComponent=new SamplePanel();
}
class SamplePanel extends JPanel
{
public void painComponent(Graphics g)
{
    super.paintComponent(g);
    Graphics2D g2=(Graphics2D)g;
    Rectangle2D rect=new Rectangle2D.Double(0,0,getWidth()-1,getHeight()-1);
    g2.setPaint(Color.YELLOW);
    g2.fill(rect);
    g2.setPaint(Color.BLUE);
    g2.draw(rect);
}
public Dimension getMinimumSize()
{
return new Dimension(10,10);
}
}

解决方案 »

  1.   

    运行时抛出NullPointerExcption,并告诉你是gridPanel.add(messageTypePanel);所在行
    那一定是messageTypePanel是个null的引用,对它操作导致异常不知道应该是什么内容,我把上面的拷过来你加进去吧,或者你把书上代码的输入
    messageTypePanel=new ButtonPanel("Message",new String[]
    {
    "String",
    "Icon",
    "Component",
    "Other",
    "Object[]"
    });
      

  2.   

    gridPanel.add(messageTypePanel);这里错啦!你的messageTypePanel没有初始化