试图在Java Swing程序中找到错误

时间:2014-04-02 15:12:35

标签: java swing user-interface jframe

所以这是我的计划......这是进入和列出马拉松运动员的一种方式。现在我在使用" Ny"时遇到错误。按钮(http://gyazo.com/e29517af6befd6242d86e6fe1dc5aae1)。这是错误代码:http://gyazo.com/9f80885d41db38cfa5502fe911f6a893

我认为问题出在" Form"小组和听众。某处可能存在无法访问的代码?前几天我有这个工作,但我丢失了代码。现在它没有用。 这个想法是" ny"按钮向用户显示一个面板" Form",但我得到了rror。

我是一个巨大的菜鸟,所以我希望它有一些明显的语法错误我似乎无法发现。 任何反馈都表示赞赏。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Maraton extends JFrame{

JTextArea display; 
JButton visa;

ArrayList <Tävlande> list = new ArrayList <Tävlande>();




Maraton(){
    super("Kista Maraton");
    display = new JTextArea();
    display.setEditable(false);

    add(display, BorderLayout.CENTER);
    add(new JScrollPane(display),BorderLayout.CENTER);
    setLocationRelativeTo(null);
    setSize(300, 400);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);



    JPanel nedre = new JPanel ();
    JPanel höger = new JPanel();

    add(nedre, BorderLayout.SOUTH);
    add(höger, BorderLayout.EAST);
    höger.setLayout(new BoxLayout(höger, BoxLayout.Y_AXIS));

    nedre.setBackground( new Color(246,246,246) );
    nedre.setBorder(BorderFactory.createLineBorder(new Color(200,200,200)));


    JButton ny = new JButton("Ny");
    ny.addActionListener(new NyLis());

    JButton visa = new JButton("Visa");
    visa.addActionListener(new VisaLis());
    visa.setEnabled(false);

    JButton nyTid = new JButton("Ny Tid");

    nedre.add(ny);
    nedre.add(visa);
    nedre.add(nyTid);



    JRadioButton StartNrRb = new JRadioButton("Startnr");
    JRadioButton NamnRb = new JRadioButton("Namn");
    JRadioButton ÅlderRb = new JRadioButton("Ålder");
    JRadioButton TidRb = new JRadioButton("Tid");

    höger.add(StartNrRb);
    höger.add(NamnRb);
    höger.add(ÅlderRb);
    höger.add(TidRb);

    ButtonGroup bg1 = new ButtonGroup();
    bg1.add(NamnRb);
    bg1.add(StartNrRb);
    bg1.add(ÅlderRb);
    bg1.add(TidRb);

}

class Form2 extends JPanel{
    JTextField startNrFält;
    JTextField tidFält;

    Form2(){
        setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
        JPanel rad0 = new JPanel();
        rad0.add(new JLabel("Start Nummer: "));
        rad0.add(new JLabel("Tid: "));
        rad0.setLayout(new BoxLayout(rad0, BoxLayout.Y_AXIS));
        rad0.add(startNrFält);
        rad0.add(tidFält);
        add(rad0);

    }
}

class Form extends JPanel{
    JTextField namnFält;
    JTextField landFält;
    JTextField ålderFält;




    Form(){

        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        JPanel rad1 = new JPanel();
        rad1.add(new JLabel("Namn: "));
        namnFält = new JTextField(15);
        rad1.add(namnFält);
        add(rad1);

        JPanel rad2 = new JPanel();
        rad2.add(new JLabel("Land: "));
        landFält = new JTextField(15);
        rad2.add(landFält);
        add(rad2);

        JPanel rad3 = new JPanel();
        rad3.add(ålderFält);
        rad3.add(new JLabel("Ålder: "));
        ålderFält = new JTextField(5);
        rad3.add(ålderFält);
        add(rad3);


    }

}



class NyLis implements ActionListener{
    public void actionPerformed(ActionEvent ave){
        Form f = new Form();

        int svar = JOptionPane.showConfirmDialog(null, f);


        String namn = f.namnFält.getText();
        String land = f.landFält.getText();
        int ålder = Integer.parseInt(f.ålderFält.getText());


        Tävlande tv = new Tävlande (namn,land,ålder);
        list.add(tv);
        visa.setEnabled(true);
    }

}





class VisaLis implements ActionListener{
    public void actionPerformed(ActionEvent ave) {
        display.setText("");
        for (Tävlande t : list){
            display.append(t.toString()+"\n");
        }
    }

}

class NyTidLis implements ActionListener{
    public void actionPerformed(ActionEvent ave) {

        Form f2 = new Form();

        JOptionPane.showMessageDialog(null, f2);

    }

}




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

}

2 个答案:

答案 0 :(得分:1)

您正在此课程的班级建设者中重新定义JButton签证:

JButton visa = new JButton("Visa");

这与签证变量定义的班级(此处为this.visa,visa代表两个单独的JButtons)不同,您尝试在NyLis actionListener中访问(未初始化)。

将上述行更改为:

visa = new JButton("Visa");

答案 1 :(得分:1)

问题是,当您点击null按钮时,您正试图向JPanel添加ny个对象。可以在Form对象的构造函数中找到有问题的代码:

rad3.add(ålderFält);
ålderFält = new JTextField(5); //NO! Create the JTextFieldObject first
rad3.add(ålderFält);

将代码更改为以下内容:

ålderFält = new JTextField(5);
rad3.add(ålderFält);
rad3.add(ålderFält);

你应该没有问题(或至少代码为我运行)。

您的visa按钮也有问题。您在构造函数中声明了一个全新的JButton,当您尝试启用它时,这将导致更多NullPointerException个。

将来,请仔细阅读堆栈跟踪。有时候你需要深入研究几行,找出你的代码在哪里,确切地说,你出错了。当您进行图形处理时,尤其如此。