Avatar billede johandysatan Novice
28. november 2002 - 12:56 Der er 3 kommentarer og
1 løsning

jeg får en nullpointerexception!

Hej, jeg kan ikke lige finde ud af hvad der sker her. Jeg får en nullpointerexception i metoden setSelectedDate() ( i changes.firePropertyChange("SelectedDate", date1, date) ). Jeg bruger en go klasse til at starte med.

public class Go  {
    public static void main(String args[])  {
        JCalendarPanel  director = new JCalendarPanel();
    }
}

HEr er så det kode der er bøvl med!


package Kalender;
/**
* @author JohandySatan
*/

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.swing.*;
import java.awt.*;


public class JCalendarPanel extends JFrame
    implements ActionListener
{
   
    private static final int BUTTON_COUNT = 42;
    private static final int LABEL_COUNT = 7;
    private JButton days[];
    private JLabel dayOfWeekLabel[];
    private JButton selectedButton;
    private JComboBox monthChoice;
    private JLabel yearLabel;
    private int selectedMonth;
    private int selectedYear;
    private int selectedDay;
    private int cellHeight;
    private int cellWidth;
    private int sundayColumnIndex;
    private JPanel headerPanel;
    private JPanel calendarGridPanel;
    private JButton nextYearButton;
    private JButton prevYearButton;
    private JButton nextMonthButton;
    private JButton prevMonthButton;
    private static final int numDays[] = {
        31, 28, 31, 30, 31, 30, 31, 31, 30, 31,
        30, 31};
    private Vector months;
    private Date selectedDate, date1, date;
    private PropertyChangeSupport changes;
   

    public JCalendarPanel()
    {
        super("dav Gamli");
       
       
       
     
       
        days = new JButton[42];            //knap array
        dayOfWeekLabel = new JLabel[7];    //Label array
        selectedButton = null;
        sundayColumnIndex = 0;
        months = new Vector(12);            //månedsvektor 12 måneder som udgangspunkt

        selectedDate = new Date();

        setFont(new Font("Dialog", 0, 12));
        FontMetrics fontmetrics = getFontMetrics(getFont());
        cellHeight = fontmetrics.getHeight() + 10;
        cellWidth = fontmetrics.stringWidth("WWW") + 10;
        getContentPane().setLayout(new BorderLayout());

        headerPanel = new JPanel();        //lav JPanel, bestem layout og tilføj nord
        headerPanel.setLayout(new FlowLayout());
       


        calendarGridPanel = new JPanel();    //lav JPanel, bestem layout og tilføj center
        calendarGridPanel.setLayout(new GridLayout(7, 7));


        Insets insets = new Insets(1, 1, 1, 1);
        yearLabel = new JLabel("");

        //knapper får billede, placering margen og actionlistener
        nextMonthButton = new JButton("ja tryk");
        nextMonthButton.setAlignmentY(0.5F);
        nextMonthButton.setMargin(insets);
        nextMonthButton.addActionListener(this);

        prevMonthButton = new JButton("ja tryk her");
        prevMonthButton.setAlignmentY(0.5F);
        prevMonthButton.setMargin(insets);
        prevMonthButton.addActionListener(this);

        nextYearButton = new JButton("tryk nu");
        nextYearButton.setAlignmentY(0.5F);
        nextYearButton.setMargin(insets);
        nextYearButton.addActionListener(this);

        prevYearButton = new JButton("halloo");
        prevYearButton.setAlignmentY(0.5F);
        prevYearButton.setMargin(insets);
        prevYearButton.addActionListener(this);

        buildMonths();                                //kalder metoden buildmonths

        monthChoice = new JComboBox(months);        //laver en combobox
        monthChoice.addActionListener(this);

        headerPanel.add(prevYearButton);            //tilføjer knapper og combobox
        headerPanel.add(prevMonthButton);
        headerPanel.add(monthChoice);
        headerPanel.add(yearLabel);
        headerPanel.add(nextMonthButton);
        headerPanel.add(nextYearButton);

        Container contentPane = super.getContentPane();

        contentPane.add("North",headerPanel);
        contentPane.add("Center",calendarGridPanel);
       
       
        buildDays();
        buildCells();
        date = new Date();
        date1 = new Date();
        setSelectedDate(date);
        updateDisplay();
       
        setSize(500,500);
        setVisible(true);
       
    }//construkteren


    public void addPropertyChangeListener(PropertyChangeListener propertychangelistener)
    {
        changes.addPropertyChangeListener(propertychangelistener);
    }

    private void buildCells()
    {
        int i = sundayColumnIndex;
        for(int j = 0; j < 42; j++)
        {
            JButton jbutton = new JButton("  ");
            jbutton.setEnabled(false);
            jbutton.setSize(cellWidth, cellHeight);
            jbutton.addActionListener(this);
            jbutton.setSelected(false);
            jbutton.setBorderPainted(false);
            if(j == i)
            {
                jbutton.setForeground(Color.red);
                i += 7;
            }
            calendarGridPanel.add(jbutton);
            days[j] = jbutton;
        }

    }

    private void buildDays()
    {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat simpledateformat = (SimpleDateFormat)DateFormat.getDateInstance(0);
        simpledateformat.applyPattern("EEE");
        boolean flag = false;
        int i = calendar.getFirstDayOfWeek();
        for(int j = 0; j < 7; j++)
        {
            if(i == 1)
                calendar.set(1997, 5, j + 1);
            else
                calendar.set(1997, 8, j + 1);
            StringTokenizer stringtokenizer = new StringTokenizer(simpledateformat.format(calendar.getTime()));
            JLabel jlabel = new JLabel(stringtokenizer.nextElement().toString(), 0);
            jlabel.setSize(cellWidth, cellHeight);
            if(!flag && calendar.get(7) == 1)
            {
                jlabel.setForeground(Color.red);
                sundayColumnIndex = j;
                flag = true;
            }
            calendarGridPanel.add(jlabel);
            dayOfWeekLabel[j] = jlabel;
        }

    }

    private void buildMonths()
    {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat simpledateformat = (SimpleDateFormat)DateFormat.getDateInstance(0);
        simpledateformat.applyPattern("MMMM");
        for(int i = 0; i < 12; i++)
        {
            calendar.set(1997, i, 2);
            months.addElement(simpledateformat.format(calendar.getTime()));
        }

    }


    //finder hvor mange dage der er i en månede ud fra int array numdays[], og tager højde for skudår.
    private int getDaysInMonth(int i, int j)
    {
        int k = j;
        int l = numDays[i];
        if(i == 1 && k % 4 == 0 && (k % 100 != 0 || k % 400 == 0))
            l = 29;
        return l;
    }

    public Date getSelectedDate()
    {
        Calendar calendar = Calendar.getInstance();
        calendar.set(selectedYear, selectedMonth, selectedDay);
        return calendar.getTime();
    }

    private void lastMonth()
    {
        setButtonState(selectedButton, false);
        selectedButton = null;
        if(--selectedMonth < 0)
        {
            selectedMonth = 11;
            selectedYear--;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.set(selectedYear, selectedMonth, selectedDay);
        setSelectedDate(calendar.getTime());
    }

    private void lastYear()
    {
        setButtonState(selectedButton, false);
        selectedButton = null;
        selectedYear--;
        Calendar calendar = Calendar.getInstance();
        calendar.set(selectedYear, selectedMonth, selectedDay);
        setSelectedDate(calendar.getTime());
    }

    private void nextMonth()
    {
        setButtonState(selectedButton, false);
        selectedButton = null;
        if(++selectedMonth > 11)
        {
            selectedMonth = 0;
            selectedYear++;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.set(selectedYear, selectedMonth, selectedDay);
        setSelectedDate(calendar.getTime());
    }

    private void nextYear()
    {
        setButtonState(selectedButton, false);
        selectedButton = null;
        selectedYear++;
        Calendar calendar = Calendar.getInstance();
        calendar.set(selectedYear, selectedMonth, selectedDay);
        setSelectedDate(calendar.getTime());
    }

    public void actionPerformed(ActionEvent actionevent)
    {
        Object obj = actionevent.getSource();
        if(obj == nextMonthButton)
        {
            nextMonth();
            return;
        }
        if(obj == prevMonthButton)
        {
            lastMonth();
            return;
        }
        if(obj == nextYearButton)
        {
            nextYear();
            return;
        }
        if(obj == prevYearButton)
        {
            lastYear();
            return;
        }
        if(obj == monthChoice)
        {
            JComboBox jcombobox = (JComboBox)obj;
            selectedMonth = jcombobox.getSelectedIndex();
            setButtonState(selectedButton, false);
            selectedButton = null;
            Calendar calendar = Calendar.getInstance();
            calendar.set(selectedYear, selectedMonth, selectedDay);
            setSelectedDate(calendar.getTime());
            return;
        }
        if(obj instanceof JButton)
        {
            for(int i = 0; i < 42; i++)
                if(obj == days[i])
                {
                    if(selectedButton != null)
                        setButtonState(selectedButton, false);
                    selectedButton = days[i];
                    setButtonState(selectedButton, true);
                    selectedDay = Integer.parseInt(days[i].getText());
                    Calendar calendar1 = Calendar.getInstance();
                    calendar1.set(selectedYear, selectedMonth, selectedDay);
                    setSelectedDate(calendar1.getTime());
                    return;
                }

        }
    }



    protected String paramString()
    {
        StringBuffer stringbuffer = new StringBuffer("selectedDate=");
        SimpleDateFormat simpledateformat = (SimpleDateFormat)DateFormat.getDateInstance(0);
        stringbuffer.append(simpledateformat.format(selectedDate));
        stringbuffer.append(", locale=");
        stringbuffer.append(Locale.getDefault().getDisplayName());
        return stringbuffer.toString();
    }

    public void removePropertyChangeListener(PropertyChangeListener propertychangelistener)
    {
        changes.removePropertyChangeListener(propertychangelistener);
    }

    private void setButtonState(JButton jbutton, boolean flag)
    {
        if(jbutton != null)
        {
            jbutton.setBorderPainted(flag);
            jbutton.setSelected(flag);
        }
    }

    public void setSelectedDate(Date date)
    {
        if(date != null)
        {
           
            date1 = selectedDate;
            selectedDate = date;
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(selectedDate);
            selectedMonth = calendar.get(2);
            selectedYear = calendar.get(1);
            selectedDay = calendar.get(5);
            changes.firePropertyChange("selectedDate", date1, date);
            updateDisplay();
        }
    }

    public String toString()
    {
        return getClass().getName() + "[" + paramString() + "]";
    }

    private void updateDisplay()
    {
        Calendar calendar = Calendar.getInstance();
        calendar.set(selectedYear, selectedMonth, 1);
        Date date = calendar.getTime();
        calendar.setTime(date);
        int i = calendar.get(7) - calendar.getFirstDayOfWeek();
        int j = 1;
        int k = getDaysInMonth(selectedMonth, selectedYear);
        for(int l = 0; l < 42; l++)
        {
            JButton jbutton = days[l];
            if(l < i)
            {
                jbutton.setVisible(false);
            } else
            {
                jbutton.setText(Integer.toString(j));
                if(j == selectedDay)
                {
                    if(selectedButton != null)
                        setButtonState(selectedButton, false);
                    selectedButton = jbutton;
                    setButtonState(selectedButton, true);
                }
                if(j <= k)
                {
                    jbutton.setEnabled(true);
                    jbutton.setVisible(true);
                    j++;
                } else
                {
                    jbutton.setVisible(false);
                }
            }
        }

        yearLabel.setText(Integer.toString(selectedYear));
        monthChoice.setSelectedIndex(selectedMonth);
    }//updatedisplay
   
}//public class
Avatar billede carstenknudsen Nybegynder
28. november 2002 - 13:00 #1
Tilføje en System.out.pritnln() lige
før linien hvor det går galt så du
kan se om date og date1 er veldefinerede.
Avatar billede di8leva Nybegynder
28. november 2002 - 13:12 #2
jag ser ikke att du skapar en instans av changes nogenstans, og derfor for du nullpointerexception vid:
changes.firePropertyChange("SelectedDate", date1, date)

solution:

changes = new ......
Avatar billede johandysatan Novice
28. november 2002 - 13:58 #3
Hej, hvad skal jeg sende med som argument når jeg opretter changes?

public void setSelectedDate(Date date)
    {
        if(date != null)
        {
            changes = new PropertyChangeSupport();
            date1 = selectedDate;
            selectedDate = date;
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(selectedDate);
            selectedMonth = calendar.get(2);
            selectedYear = calendar.get(1);
            selectedDay = calendar.get(5);
            System.out.println("ja hej");
            changes.firePropertyChange("selectedDate", date1, date);
            updateDisplay();

fra API'en har jeg dette:
PropertyChangeSupport(Object sourceBean)

-men hvad er dette Object sourceBean? (som du måske kan forstå har jeg ikke lavet det hele selv ;-) )
Avatar billede johandysatan Novice
28. november 2002 - 14:33 #4
hej hej jeg fandt selv ud af det, jeg manglede rigtigt nok at oprette "changes", og det argument det skulle med var "this". Så svensken havde ret, jeg takker af hjertet og deler point ud med rund hånd!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester