我写了这样一段代码,然后我在父窗口打开这个窗口时(窗口没显示),弹出来一个空指针异常,我不知道哪里错了,请各位高手看看(帖子内容过长,我把IMPORT部分和变量声明去掉了一些)
public class GameSet extends JInternalFrame{
public GameSet(){ super(); setTitle("游戏设置"); Panel = new JPanel();
basepicture = new JLabel("选择背景图片");
basepicture.setFont(new Font("黑体", Font.PLAIN, 18));
picture = new JLabel();
picture1 = new JLabel();
picture2 = new JLabel();
p1 = new ImageIcon(getClass().getResource("/puke/背景11.jpg"));
picture1.setIcon(p1);
p2 = new ImageIcon(getClass().getResource("/puke/背景22.jpg"));
picture2.setIcon(p2);
picture = picture1;
gamemode = new JLabel("游戏进行模式");
gamemode.setFont(new Font("黑体", Font.PLAIN, 18));
discard = new JLabel("已出牌选择");
discard.setFont(new Font("黑体", Font.PLAIN, 18));
gamelevel = new JLabel("游戏难度");
gamelevel.setFont(new Font("黑体", Font.PLAIN, 18)); pic1 = new JRadioButton("清爽背景");
pic2 = new JRadioButton("大红背景");
bg1 = new ButtonGroup();
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == pic1) {
picture = picture1;
piccount = 1;
}
else {
picture = picture2;
piccount = 2;
}
}
};
pic1.setSelected(true);
pic1.addActionListener(al);
pic2.addActionListener(al);
bg1.add(pic1);
bg2.add(pic2);
bg2 = new ButtonGroup();
landlord1 = new JRadioButton("赢家地主");
landlord1.setHideActionText(true);
landlord1.setToolTipText("地主赢的可以连庄,即继续做地主");
landlord2 = new JRadioButton("随机地主");
landlord2.setHideActionText(true);
landlord2.setToolTipText("随机选择地主,就是叫分制");
ActionListener al1 = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == landlord1) {
count1 = 10;
}
else {
count1 = 20;
}
}
};
landlord1.setSelected(true);
landlord1.addActionListener(al1);
landlord2.addActionListener(al1);
bg2.add(landlord1);
bg2.add(landlord2);
threezone = new JCheckBox("可三带二");
threezone.setHideActionText(true);
threezone.setToolTipText("即三张同样的牌可以带对子");
bomb = new JCheckBox("炸弹翻番");
bomb.setHideActionText(true);
bomb.setToolTipText("出现炸弹的该局底分翻倍,倍数=2的出现的炸弹数次方");
bg3 = new ButtonGroup();
ActionListener al2 = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == threezone||ae.getSource() == bomb) {
count2 = 1;
}
else if(ae.getSource() != threezone&&ae.getSource() != bomb){
count2 = 0;
}
else {
count2 = 2;
}
}
};
count = count1+count2;
threezone.addActionListener(al2);
bomb.addActionListener(al2);
threezone.setSelected(true);
bomb.setSelected(true);
bg3.add(threezone);
bg3.add(bomb);
show = new JRadioButton("正面显示");
baseshow = new JRadioButton("背面显示");
notshow = new JRadioButton("不显示");
bg4 = new ButtonGroup();
ActionListener al3 = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == show) {
discount = 1;
}
else if(ae.getSource() == baseshow){
discount = 2;
}
else {
discount = 3;
}
}
};
show.addActionListener(al3);
baseshow.addActionListener(al3);
notshow.addActionListener(al3);
notshow.setSelected(true);
bg4.add(show);
bg4.add(baseshow);
bg4.add(notshow);
low = new JRadioButton("低");
middle = new JRadioButton("中");
high = new JRadioButton("高");
bg5 = new ButtonGroup();
ActionListener al4 = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == low) {
levelcount = 1;
}
else if(ae.getSource() == middle){
levelcount = 2;
}
else {
levelcount = 3;
}
}
};
low.addActionListener(al4);
middle.addActionListener(al4);
high.addActionListener(al4);
middle.setSelected(true);
bg5.add(low);
bg5.add(middle);
bg5.add(high);
savebutton = new JButton("保存");
savebutton.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
try{
String strurl="jdbc:odbc:gamecardDatabase";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con1 = DriverManager.getConnection(strurl);
Statement stm1 = con1.createStatement();
ResultSet rs1 = stm1.executeQuery("select * from gameset");
DataConnect a = new DataConnect();
a.EditGameSet(1,rs1,stm1);
a.EditGameBase(piccount, rs1, stm1);
a.EditGameMode(count, rs1, stm1);
a.EditDiscard(discount, rs1, stm1);
a.EditGameLevel(levelcount, rs1, stm1);
}
catch(ClassNotFoundException a){
a.printStackTrace();
}
catch(SQLException h){
h.printStackTrace();
}
}
}
);
defaultbutton = new JButton("默认");
defaultbutton.setToolTipText("恢复默认设置后请再点一下保存,然后就保存了设置。");
defaultbutton.addActionListener
(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
pic1.setSelected(true);
pic2.setSelected(false);
landlord1.setSelected(true);
landlord2.setSelected(false);
threezone.setSelected(true);
bomb.setSelected(true);
show.setSelected(false);
baseshow.setSelected(false);
notshow.setSelected(true);
low.setSelected(false);
middle.setSelected(true);
high.setSelected(false);
}
}
);
exitbutton = new JButton("退出");
exitbutton.addActionListener
(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
}
);
Panel.setLayout(new FlowLayout(FlowLayout.CENTER));
下面省略了一部分是用Panel把所有组件ADD进去。
this.getContentPane().add(Panel);
validate();
setClosable(true);
setIconifiable(true); setBounds(10,10,300,400);
setVisible(true);
}
}
public class GameSet extends JInternalFrame{
public GameSet(){ super(); setTitle("游戏设置"); Panel = new JPanel();
basepicture = new JLabel("选择背景图片");
basepicture.setFont(new Font("黑体", Font.PLAIN, 18));
picture = new JLabel();
picture1 = new JLabel();
picture2 = new JLabel();
p1 = new ImageIcon(getClass().getResource("/puke/背景11.jpg"));
picture1.setIcon(p1);
p2 = new ImageIcon(getClass().getResource("/puke/背景22.jpg"));
picture2.setIcon(p2);
picture = picture1;
gamemode = new JLabel("游戏进行模式");
gamemode.setFont(new Font("黑体", Font.PLAIN, 18));
discard = new JLabel("已出牌选择");
discard.setFont(new Font("黑体", Font.PLAIN, 18));
gamelevel = new JLabel("游戏难度");
gamelevel.setFont(new Font("黑体", Font.PLAIN, 18)); pic1 = new JRadioButton("清爽背景");
pic2 = new JRadioButton("大红背景");
bg1 = new ButtonGroup();
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == pic1) {
picture = picture1;
piccount = 1;
}
else {
picture = picture2;
piccount = 2;
}
}
};
pic1.setSelected(true);
pic1.addActionListener(al);
pic2.addActionListener(al);
bg1.add(pic1);
bg2.add(pic2);
bg2 = new ButtonGroup();
landlord1 = new JRadioButton("赢家地主");
landlord1.setHideActionText(true);
landlord1.setToolTipText("地主赢的可以连庄,即继续做地主");
landlord2 = new JRadioButton("随机地主");
landlord2.setHideActionText(true);
landlord2.setToolTipText("随机选择地主,就是叫分制");
ActionListener al1 = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == landlord1) {
count1 = 10;
}
else {
count1 = 20;
}
}
};
landlord1.setSelected(true);
landlord1.addActionListener(al1);
landlord2.addActionListener(al1);
bg2.add(landlord1);
bg2.add(landlord2);
threezone = new JCheckBox("可三带二");
threezone.setHideActionText(true);
threezone.setToolTipText("即三张同样的牌可以带对子");
bomb = new JCheckBox("炸弹翻番");
bomb.setHideActionText(true);
bomb.setToolTipText("出现炸弹的该局底分翻倍,倍数=2的出现的炸弹数次方");
bg3 = new ButtonGroup();
ActionListener al2 = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == threezone||ae.getSource() == bomb) {
count2 = 1;
}
else if(ae.getSource() != threezone&&ae.getSource() != bomb){
count2 = 0;
}
else {
count2 = 2;
}
}
};
count = count1+count2;
threezone.addActionListener(al2);
bomb.addActionListener(al2);
threezone.setSelected(true);
bomb.setSelected(true);
bg3.add(threezone);
bg3.add(bomb);
show = new JRadioButton("正面显示");
baseshow = new JRadioButton("背面显示");
notshow = new JRadioButton("不显示");
bg4 = new ButtonGroup();
ActionListener al3 = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == show) {
discount = 1;
}
else if(ae.getSource() == baseshow){
discount = 2;
}
else {
discount = 3;
}
}
};
show.addActionListener(al3);
baseshow.addActionListener(al3);
notshow.addActionListener(al3);
notshow.setSelected(true);
bg4.add(show);
bg4.add(baseshow);
bg4.add(notshow);
low = new JRadioButton("低");
middle = new JRadioButton("中");
high = new JRadioButton("高");
bg5 = new ButtonGroup();
ActionListener al4 = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == low) {
levelcount = 1;
}
else if(ae.getSource() == middle){
levelcount = 2;
}
else {
levelcount = 3;
}
}
};
low.addActionListener(al4);
middle.addActionListener(al4);
high.addActionListener(al4);
middle.setSelected(true);
bg5.add(low);
bg5.add(middle);
bg5.add(high);
savebutton = new JButton("保存");
savebutton.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
try{
String strurl="jdbc:odbc:gamecardDatabase";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con1 = DriverManager.getConnection(strurl);
Statement stm1 = con1.createStatement();
ResultSet rs1 = stm1.executeQuery("select * from gameset");
DataConnect a = new DataConnect();
a.EditGameSet(1,rs1,stm1);
a.EditGameBase(piccount, rs1, stm1);
a.EditGameMode(count, rs1, stm1);
a.EditDiscard(discount, rs1, stm1);
a.EditGameLevel(levelcount, rs1, stm1);
}
catch(ClassNotFoundException a){
a.printStackTrace();
}
catch(SQLException h){
h.printStackTrace();
}
}
}
);
defaultbutton = new JButton("默认");
defaultbutton.setToolTipText("恢复默认设置后请再点一下保存,然后就保存了设置。");
defaultbutton.addActionListener
(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
pic1.setSelected(true);
pic2.setSelected(false);
landlord1.setSelected(true);
landlord2.setSelected(false);
threezone.setSelected(true);
bomb.setSelected(true);
show.setSelected(false);
baseshow.setSelected(false);
notshow.setSelected(true);
low.setSelected(false);
middle.setSelected(true);
high.setSelected(false);
}
}
);
exitbutton = new JButton("退出");
exitbutton.addActionListener
(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
}
);
Panel.setLayout(new FlowLayout(FlowLayout.CENTER));
下面省略了一部分是用Panel把所有组件ADD进去。
this.getContentPane().add(Panel);
validate();
setClosable(true);
setIconifiable(true); setBounds(10,10,300,400);
setVisible(true);
}
}
bg2 = new ButtonGroup(); 还没实例化就使用,能不空指针吗?
pic2 = new JRadioButton("大红背景");
bg1 = new ButtonGroup();
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == pic1) {
picture = picture1;
piccount = 1;
}
else {
picture = picture2;
piccount = 2;
}
}
};
pic1.setSelected(true);
pic1.addActionListener(al);
pic2.addActionListener(al);
bg1.add(pic1);
bg2.add(pic2); 这里的bg2.add(pic2);应该改为bg1.add(pic2);