Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > MouseListener() во внутреннем классе


Автор: tolet 16.10.2006, 08:19
Здравствуйте!

У меня в коде есть внутренний класс, который использует прослушиватель мыши MouseListener(). При перегрузке конструктора этого внутреннего класса прослушиватель не работает, а в консоли пишет : Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
. Подскажите пожалуйста причину.

Автор: LSD 16.10.2006, 10:25
Код того места где возникает ошибка. И обязательно укажи строку где она происходит.

Автор: tolet 16.10.2006, 10:57
Вот код:

Код

package previewbar;

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.StringTokenizer;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 *
 * @author Vlad
 */
public class Main extends JPanel {
    
        private final static int P0=0;
    private final static int P5=1;
    private static int p1=2, p2=3, p3=4, p4=5;
    private static ArrayList<String> pfn = new ArrayList<String>();
    private static ArrayList<String> pln = new ArrayList<String>();
    private static ArrayList<String> c = new ArrayList<String>();
    private static ArrayList<String> dop = new ArrayList<String>();
    private static ArrayList<String> top = new ArrayList<String>();
    private static ArrayList<String> mfp = new ArrayList<String>();
    private static ArrayList<String> hfp = new ArrayList<String>();
    private static ArrayList<String> cfp = new ArrayList<String>();
    private static ArrayList<String> bfp = new ArrayList<String>();
    private static URL mainURL, hoverURL, clickURL, bigURL;
    private static ImageIcon main, hover, click, big;
    private static Color color = new Color(153, 102, 102);
    private static Font labelFont = new Font("Arial", Font.BOLD, 14);
    

    //достаем данные из файла photosdb.txt и определяем поля
    private static void getData () {
        
        try {
            InputStreamReader f = new InputStreamReader (new FileInputStream ("D:\\Docum\\PreviewBar\\Catalogue\\build\\classes\\catalogue\\photosdb.txt"),"Cp1251");
            BufferedReader in = new BufferedReader(f);
            String s;
            String TokensArr [] = new String [9];
            while ((s = in.readLine()) != null) {
        StringTokenizer st = new StringTokenizer(s,"\t");
                for (int i=0;i<9;i++) {
            TokensArr[i] = (String) st.nextElement();
                        System.out.println(TokensArr[i]);
                }
                pfn.add(new String (TokensArr[0]));
                pln.add(new String (TokensArr[1]));
                c.add(new String (TokensArr[2]));
                dop.add(new String (TokensArr[3]));
                top.add(new String (TokensArr[4]));
                mfp.add(new String (TokensArr[5]));
                hfp.add(new String (TokensArr[6]));
                cfp.add(new String (TokensArr[7]));
                bfp.add(new String (TokensArr[8]));
                System.out.println(pfn);
                System.out.println(pln);
                System.out.println(c);
                System.out.println(dop);
                System.out.println(top);
                System.out.println(mfp);
                System.out.println(hfp);
                System.out.println(cfp);
                System.out.println(bfp);
                
            }
    }
    catch (IOException ex) {
        ex.printStackTrace();
    }
    }
    
    private class SmallPreviewBlock extends JPanel implements MouseListener {

        
        private CardLayout cl;
        private int j;
        JPanel cards;


        // создаем Блок превьюшки
        public SmallPreviewBlock (int i) {

            //JPanel cards;
            
            j=i;
            
            java.net.URL mainURL = Main.class.getResource(mfp.get(i));
            java.net.URL hoverURL = Main.class.getResource(hfp.get(i));
            java.net.URL clickURL = Main.class.getResource(cfp.get(i));

            //создаем иконки
            main = new ImageIcon(mainURL);
            hover = new ImageIcon(hoverURL);
            click = new ImageIcon(clickURL);

            //создаем карты для колоды
            JPanel mainPanel = new JPanel();
            Dimension d = new Dimension(97, 90);
            mainPanel.setMinimumSize(d);
            mainPanel.setBackground(color);
            JLabel mainLabel = new JLabel(main);
            mainLabel.setSize(97, 90);
            mainPanel.add(mainLabel);
            JPanel hoverPanel = new JPanel();
            hoverPanel.setSize(97, 90);
            hoverPanel.setBackground(color);
            JLabel hoverLabel = new JLabel(hover);
            hoverLabel.setSize(97, 90);
            hoverPanel.add(hoverLabel);
            JPanel clickPanel = new JPanel();
            clickPanel.setSize(97, 90);
            clickPanel.setBackground(color);
            JLabel clickLabel = new JLabel(click);
            clickLabel.setSize(97, 90);
            clickPanel.add(clickLabel);

            //создаем панель "колоду" и добавляем в нее карты
            cards = new JPanel(new CardLayout());
            cards.add(mainPanel, "MAIN");
            cards.add(hoverPanel, "HOVER");
            cards.add(clickPanel, "CLICK");
            cards.addMouseListener(this);

            CardLayout cl = (CardLayout)(cards.getLayout());
            cl.show(cards, "MAIN");
            
            //pane.add(cards);
            
           
       
        }
        
            // Обрабатываем события мыши
        public void mouseClicked(MouseEvent e) {

            if (j==0) {leftArrowMath();}
            if (j==5) {rightArrowMath();}

        }

        public void mousePressed(MouseEvent e) {

            cl.show(cards, "CLICK");

        }

        public void mouseReleased(MouseEvent e) {

            cl.show(cards, "HOVER");

        }

        public void mouseEntered(MouseEvent e) {

            cl.show(cards, "HOVER");

        }

        public void mouseExited(MouseEvent e) {

            cl.show(cards, "MAIN");

        }

    }
  
    
       
       //создаем обсчет математики при нажатии на правую стрелку
    private static void rightArrowMath () {
        
        //определяем количество элементов в безразмерном массиве catalogue
        int i = pfn.size();
        
        //определяем новые значения отображаемых картинок
        if (p1<(i--)) {p1++;} else {p1=2;}
        if (p2<(i--)) {p2++;} else {p2=2;}
        if (p3<(i--)) {p3++;} else {p3=2;}
        if (p4<(i--)) {p4++;} else {p4=2;}
        
        //перерисовываем полосу превьюшек
        //previewBar().repaint();
        
    }
    
    //создаем обсчет математики при нажатии на левую стрелку
    private static void leftArrowMath () {
        
        //определяем количество элементов в безразмерном массиве catalogue
        int i = pfn.size();
        
        //определяем новые значения отображаемых картинок
        if (p1>2) {p1--;} else {p1=i--;}
        if (p1>2) {p2--;} else {p2=i--;}
        if (p1>2) {p3--;} else {p3=i--;}
        if (p1>2) {p4--;} else {p4=i--;}
        
        //перерисовываем полосу превьюшек
        //previewBar().repaint();
        
    }

    
  
    
    /** Creates a new instance of Main*/
    public void previewBar(Container pane) {
        //создаем панель-подложку
        JPanel previewBar = new JPanel(new FlowLayout());
        previewBar.setSize(582, 90);
        previewBar.setBackground(color);
        
        
        //помещаем панели превьюшек на подложку
  
        previewBar.add(new SmallPreviewBlock(P0).cards);
        previewBar.add(new SmallPreviewBlock(p1).cards);
        previewBar.add(new SmallPreviewBlock(p2).cards);
        previewBar.add(new SmallPreviewBlock(p3).cards);
        previewBar.add(new SmallPreviewBlock(p4).cards);
        previewBar.add(new SmallPreviewBlock(P5).cards);
        pane.add(previewBar);
        
        
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        getData();
        JFrame frame = new JFrame();
        
        Main block = new Main();
        block.previewBar(frame.getContentPane());
       
        frame.pack();
        frame.setVisible(true);
    }
    
}



Ошибка происходит в строках - 167 - 171 кода (реакция CardLayout на события мыши)

Автор: LSD 16.10.2006, 11:16
У тебя переменной private CardLayout cl никогда не присваивается значение.

Автор: tolet 16.10.2006, 12:02
LSD,  спсибо большое за подсказку - поправил ошибочку - все заработало smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)