【问题标题】:change listener for variable in other class更改其他类中变量的侦听器
【发布时间】:2013-12-17 01:47:57
【问题描述】:

已编辑:下面是我对这个示例的 SSCCE 尝试,让您有机会自行编译。我需要:通知班级PanelNumber2 班级Generator g 中的对象PanelNumber1 已更改。

我尝试使用 ChangeListnerActionPerformed 但是在命令下:

listener.stateChanged(new ChangeEvent(this));

我有空指针异常。如果您对此问题有任何解决方案,请纠正我。或任何更好的方法来做到这一点

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;
}
}

需要帮助的人:(

【问题讨论】:

  • 这似乎有点倒退。 Generator 应该没有 JPanel 的概念,它应该只专注于向注册的侦听器提供事件通知,它不需要知道那些侦听器将对此做什么 - 恕我直言
  • 我将通过JPanel 使用repaint()。但是我仍然不知道如何解决我的问题,你认为在构造函数中传递JPanel 会给我 NullPointerException 吗?
  • “我有 4 节课。” 为了尽快获得更好的帮助,请发帖 SSCCE(SSCCE 可以包含多个班级)。
  • 我知道你通过了面板,但不是生成器的责任,不,我看不到空指针异常来自哪里,真的不够用
  • 我可以将你发布到我所有项目的某个地方,但是你会看看它,这里有私人消息的选项吗?

标签: java swing arraylist listener parameter-passing


【解决方案1】:

解决方案!

我的天啊,几个小时后我搞清楚了问题所在! :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 - 他发现了那个错误。话题可以关闭

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    相关资源
    最近更新 更多