2013-12-01 4 views
0

EDITED: ниже моя попытка SSCCE для этого примера дать вам возможность скомпилировать это самостоятельно. Мне нужно: сообщить классу PanelNumber2, что объект Generator g в классе PanelNumber1 был изменен.change listener для переменной в другом классе

Я попытался с ChangeListner и ActionPerformed однако по команде:

listener.stateChanged(new ChangeEvent(this));

я получил NullPointer исключение. исправьте меня, если у вас есть какое-либо решение этой проблемы. или лучше способ сделать это

import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 


public class MainFrame extends JFrame{ 
private PanelNumber1 p1; 
private PanelNumber2 p2; 

public MainFrame(){ 
    super("Frame"); 

    JPanel panel = new JPanel(new BorderLayout()); 
    this.getContentPane().add(panel); 

    p1 = new PanelNumber1(); 
    Generator g = p1.getGenerator(); 
    p2 = new PanelNumber2(g); 


    panel.add(p1,BorderLayout.CENTER); 
    panel.add(p2,BorderLayout.EAST); 



    this.setExtendedState(JFrame.MAXIMIZED_BOTH); 

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   

    this.setVisible(true); 
    this.setResizable(true); 
} 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    new MainFrame(); 
} 
} 

class PanelNumber2 extends JPanel implements ChangeListener{  
public PanelNumber2(Generator g){ 
    super(); 
    setLayout(new GridLayout(7,1)); 

    g.addListener(this); 
} 
@Override 
public void stateChanged(ChangeEvent e) { 
    // TODO Auto-generated method stub 
    this.repaint(); 
} 
} 

class PanelNumber1 extends JPanel{ 

Generator g; 
BufferedImage mapa; 
File imageFile; 

public PanelNumber1(){ 
    super(); 

    g = new Generator(); 
    g.setPanel(this); 

    imageFile = new File("C:\\Users\\Katie\\Documents\\Eclipse\\Samolot\\src\\Pics\\img_ww1.png"); 

    try { 
     mapa = ImageIO.read(imageFile); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

@Override 
public void paintComponent(Graphics g) { 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.drawImage(mapa, 0, 0, getWidth(), getHeight(), null); 
} 
public Generator getGenerator(){ 
    return g; 
} 
} 

class Generator{ 
ChangeListener listener; 
ArrayList<String> s; 
JPanel p; 
Timer generatorTimer; 


public Generator(){ 
    this.s = new ArrayList<String>(); 
     generatorTimer = new Timer(40, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
        addItem();  
        p.repaint(); 
      } 
     }); 
     generatorTimer.start(); 
} 
private void addItem(){ 
    s.add(new String("string")); 
    listener.stateChanged(new ChangeEvent(this)); 
} 
public void setPanel(JPanel p){ 
    this.p = p; 
} 

public ArrayList<String> getArray(){ 
    return s; 
} 
public void addListener(ChangeListener list){ 
    this.listener = list; 
} 
} 

Вам нужны помощь, ребята :(

+0

Это кажется немного назад. «Генератор» не должен иметь понятия «JPanel», он должен сосредоточиться только на предоставлении уведомления о событиях зарегистрированным слушателям, ему не нужно ничего знать о том, что будут делать эти слушатели - IMHO – MadProgrammer

+0

Я прохожу «JPanel» туда используйте 'repaint()'. Однако, тем не менее, я не знаю, как исправить свою проблему, неужели вы думаете, что эта передача «JPanel» в constuctor дает мне NullPointerException? – fa1thly

+1

* «У меня есть 4 класса». * Чтобы лучше помочь, отправьте один [SSCCE] (http://sscce.org/) (SSCCE может содержать более одного класса). –

ответ

0

РЕШЕНИЕ

Боже мой, после нескольких часов figuiring вне что не так я получил это: P!

все, что мне нужно сделать больше добавлял состояние в timer

 public void actionPerformed(ActionEvent e) { 
       if(p != null){ //becouse after creating Generator object im doing setPanel(this) a short while after :) 
       addItem();  
       p.repaint(); 
      } 
     } 

теперь работает отлично. Спасибо, что за MadProgrammer за то, что я пытался помочь мне и для YMY - он нашел эту ошибку. тема может быть закрыта

Смежные вопросы