Easy Program在多个Action监听器时抛出NullPointerException错误。

huangapple go评论96阅读模式
英文:

Easy Program throws NullPointerException when multiple Action Listeners

问题

我已尝试在3个单独的文件中使用多个动作监听器,但当我想要显示第三个文件时,它会抛出空指针异常,但会抛出此错误。我只是一个初学者,也许我在连接类到另一个类时失败了。这可能是主要问题。提前感谢您的帮助。

源代码:

Start.java

  1. package com.raising.darkness;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. public class Start {
  7. // 省略了一些代码...
  8. public class StartHandler implements ActionListener {
  9. @Override
  10. public void actionPerformed(ActionEvent ex) {
  11. heroClasses.createClassChoose();
  12. }
  13. }
  14. }
  15. HeroClasses.java
  16. ```java
  17. package com.raising.darkness;
  18. import javax.swing.*;
  19. import java.awt.*;
  20. import java.awt.event.ActionEvent;
  21. import java.awt.event.ActionListener;
  22. public class HeroClasses {
  23. // 省略了一些代码...
  24. public class ClassHandler implements ActionListener {
  25. @Override
  26. public void actionPerformed(ActionEvent ex) {
  27. choosenClass = ex.getActionCommand();
  28. averagePanel.mainPanel();
  29. }
  30. }
  31. }
  32. AveragePanel.java
  33. ```java
  34. package com.raising.darkness;
  35. import javax.swing.*;
  36. import java.awt.*;
  37. public class AveragePanel {
  38. // 省略了一些代码...
  39. }

请注意,我已经省略了一些源代码中的部分,只包含了与问题相关的部分。希望这有助于您理解问题的所在。

英文:

I have tried using multiple action listeners in 3 seperate files but it throws NullPointer exception when I want to display a "3-rd file" but it throws this error.I am just a begginer and maybe I failed with connecting class to another.That may be the main problem.Thanks for helping in advance.

Source :

Start.java

  1. package com.raising.darkness;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. public class Start {
  7. JFrame frame;
  8. Container container;
  9. JPanel startTitle;
  10. JLabel startText;
  11. Font startTitleFont= new Font("Dialog", Font.BOLD, 60);
  12. Font startTitleButton = new Font("Dialog", Font.PLAIN, 40);
  13. Font chooseTitleFont = new Font("Dialog", Font.PLAIN, 59);
  14. JPanel startButtonPanel;
  15. JButton startButton;
  16. Color backgroundFrame = new Color(180,180,180);
  17. Color buttonColor = new Color(144,144,144);
  18. StartHandler startHandler = new StartHandler();
  19. AveragePanel averagePanel = new AveragePanel(this);
  20. HeroClasses heroClasses = new HeroClasses(this);
  21. public static void main(String[] args) { new Start(); }
  22. public Start(){
  23. frame=new JFrame();
  24. frame.setSize(1024,800);
  25. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  26. frame.setTitle("Raising Darkness");
  27. frame.getContentPane().setBackground(backgroundFrame);
  28. frame.setLayout(null);
  29. container=frame.getContentPane();
  30. //Title Text
  31. startTitle = new JPanel();
  32. startTitle.setBounds(162,100,700,150);
  33. startTitle.setBackground(backgroundFrame);
  34. startText = new JLabel("RAISING DARKNESS");
  35. startText.setFont(startTitleFont);
  36. startTitle.add(startText);
  37. container.add(startTitle);
  38. startButtonPanel = new JPanel();
  39. startButtonPanel.setBounds(387,600,200,70);
  40. startButtonPanel.setBackground(backgroundFrame);
  41. startButton = new JButton();
  42. startButton.setText("START");
  43. startButton.setBackground(buttonColor);
  44. startButton.setFont(startTitleButton);
  45. startButton.setFocusPainted(false);
  46. startButton.addActionListener(startHandler);
  47. startButtonPanel.add(startButton);
  48. container.add(startButtonPanel);
  49. frame.setVisible(true);
  50. }
  51. public class StartHandler implements ActionListener{
  52. @Override
  53. public void actionPerformed(ActionEvent ex) {
  54. heroClasses.createClassChoose();
  55. }
  56. }
  57. }

HeroClasses.java

  1. package com.raising.darkness;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. public class HeroClasses{
  7. Start start;
  8. Color normalChooseColor = new Color(144,144,144);
  9. JPanel chooseTitlePanel, chooseButtonsPanel;
  10. JLabel chooseTitleLabel;
  11. JButton chooseMageButton, chooseWarriorButton, chooseArcherButton;
  12. String choosenClass;
  13. Color chooseClassColor = new Color(100,100,100);
  14. ClassHandler classHandler = new ClassHandler();
  15. AveragePanel averagePanel = new AveragePanel(this);
  16. public HeroClasses(Start start){
  17. this.start = start;
  18. }
  19. public void createClassChoose(){
  20. start.startButtonPanel.setVisible(false);
  21. start.startTitle.setVisible(false);
  22. start.frame.getContentPane().setBackground(normalChooseColor);
  23. chooseTitlePanel = new JPanel();
  24. chooseTitlePanel.setBounds(162,200,700,100);
  25. chooseTitlePanel.setBackground(normalChooseColor);
  26. chooseTitleLabel= new JLabel();
  27. chooseTitleLabel.setText("Choose Class!");
  28. chooseTitleLabel.setFont(start.chooseTitleFont);
  29. chooseTitlePanel.add(chooseTitleLabel);
  30. start.container.add(chooseTitlePanel);
  31. chooseButtonsPanel = new JPanel();
  32. chooseButtonsPanel.setBounds(162,500,700,100);
  33. chooseButtonsPanel.setLayout(new GridLayout(1,3,50,0));
  34. chooseButtonsPanel.setBackground(normalChooseColor);
  35. //CLASSES
  36. chooseMageButton = new JButton("Mage");
  37. chooseMageButton.setBackground(chooseClassColor);
  38. chooseMageButton.setFont(start.startTitleButton);
  39. chooseMageButton.addActionListener(classHandler);
  40. chooseMageButton.setActionCommand("Mage");
  41. chooseMageButton.setFocusPainted(false);
  42. chooseButtonsPanel.add(chooseMageButton);
  43. chooseWarriorButton = new JButton("Warrior");
  44. chooseWarriorButton.setBackground(chooseClassColor);
  45. chooseWarriorButton.setFont(start.startTitleButton);
  46. chooseWarriorButton.addActionListener(classHandler);
  47. chooseWarriorButton.setActionCommand("Warrior");
  48. chooseWarriorButton.setFocusPainted(false);
  49. chooseButtonsPanel.add(chooseWarriorButton);
  50. chooseArcherButton = new JButton("Archer");
  51. chooseArcherButton.setBackground(chooseClassColor);
  52. chooseArcherButton.setFont(start.startTitleButton);
  53. chooseArcherButton.addActionListener(classHandler);
  54. chooseArcherButton.setActionCommand("Archer");
  55. chooseArcherButton.setFocusPainted(false);
  56. chooseButtonsPanel.add(chooseArcherButton);
  57. start.container.add(chooseButtonsPanel);
  58. }
  59. public class ClassHandler implements ActionListener{
  60. @Override
  61. public void actionPerformed(ActionEvent ex) {
  62. choosenClass = ex.getActionCommand();
  63. averagePanel.mainPanel();
  64. }
  65. }
  66. }

AveragePanel.java

  1. package com.raising.darkness;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. public class AveragePanel {
  5. Start start;
  6. HeroClasses heroClasses;
  7. String actualClass;
  8. JPanel picturePanel, statsPanel, storyPanel, choicesPanel;
  9. JLabel pictureLabel;
  10. ImageIcon imageIcon;
  11. public AveragePanel(HeroClasses heroClasses){this.heroClasses = heroClasses;}
  12. public AveragePanel(Start start){this.start = start;}
  13. public void mainPanel(){
  14. heroClasses.chooseButtonsPanel.setVisible(false);
  15. heroClasses.chooseTitlePanel.setVisible(false);
  16. actualClass = heroClasses.choosenClass ;
  17. System.out.println("Current Class is :" +actualClass);
  18. picturePanel = new JPanel();
  19. picturePanel.setBounds(50,50,500,350);
  20. picturePanel.setBackground(Color.WHITE);
  21. start.container.add(picturePanel);
  22. }
  23. }

答案1

得分: 0

以下是您要翻译的内容:

  1. AveragePanel类中有2个构造函数。您使用了public AveragePanel(HeroClasses heroClasses){this.heroClasses = heroClasses;},所以您的字段start为空,您有两个选择。
    1. 更改mainPanel方法,并从heroClasses获取start面板:heroClasses.start.container.add(picturePanel); 方法将如下所示:
    1. public void mainPanel(){
    2. heroClasses.chooseButtonsPanel.setVisible(false);
    3. heroClasses.chooseTitlePanel.setVisible(false);
    4. actualClass = heroClasses.choosenClass;
    5. System.out.println("Current Class is :" + actualClass);
    6. picturePanel = new JPanel();
    7. picturePanel.setBounds(50, 50, 500, 350);
    8. picturePanel.setBackground(Color.WHITE);
    9. heroClasses.start.container.add(picturePanel);
    10. }
    1. 更好的解决方案是更改构造函数,并使用heroClasses设置start面板。然后您可以同时使用两个构造函数,方法mainPanel()将按相同的方式工作。以下是构造函数:
    1. public AveragePanel(HeroClasses heroClasses){
    2. this.heroClasses = heroClasses;
    3. this.start = heroClasses.start;
    4. }
    5. public AveragePanel(Start start){this.start = start;}

    方法mainPanel()没有更改。

最佳实践是在构造函数中初始化字段。在您的情况下,您需要在HeroClasses类中进行更改。通过构造函数初始化averagePanel字段:

  1. public class HeroClasses{
  2. // 其他字段...
  3. AveragePanel averagePanel;
  4. public HeroClasses(Start start){
  5. this.start = start;
  6. this.averagePanel = new AveragePanel(this);
  7. }
  8. // 其他方法...
  9. }

这是您的翻译,请使用这些翻译来替代原始文本中的相应部分。

英文:

You have 2 constructors in AveragePanel class. You use public AveragePanel(HeroClasses heroClasses){this.heroClasses = heroClasses;}, so your field start is null, you have two options.

  1. Change method main panel, and get start panel from heroClasses: heroClasses.start.container.add(picturePanel); Method will be looks like:

    1. public void mainPanel(){
    2. heroClasses.chooseButtonsPanel.setVisible(false);
    3. heroClasses.chooseTitlePanel.setVisible(false);
    4. actualClass = heroClasses.choosenClass ;
    5. System.out.println("Current Class is :" +actualClass);
    6. picturePanel = new JPanel();
    7. picturePanel.setBounds(50,50,500,350);
    8. picturePanel.setBackground(Color.WHITE);
    9. heroClasses.start.container.add(picturePanel);
    10. }
  2. Better solution is change constructor, and set start panel using heroClasses. Then you can use both constructors and method mainPanel() will works this same.
    Below constructors:

    1. public AveragePanel(HeroClasses heroClasses){
    2. this.heroClasses = heroClasses;
    3. this.start = heroClasses.start;
    4. }
    5. public AveragePanel(Start start){this.start = start;}

method mainPanel() with no changes.

The best practice is initializion field in constructor. In your case, you have to change that in your HeroClasses class. Initialize field averagePanel by contructor:

  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. public class HeroClasses{
  6. Start start;
  7. Color normalChooseColor = new Color(144,144,144);
  8. JPanel chooseTitlePanel, chooseButtonsPanel;
  9. JLabel chooseTitleLabel;
  10. JButton chooseMageButton, chooseWarriorButton, chooseArcherButton;
  11. String choosenClass;
  12. Color chooseClassColor = new Color(100,100,100);
  13. ClassHandler classHandler = new ClassHandler();
  14. AveragePanel averagePanel;
  15. public HeroClasses(Start start){
  16. this.start = start;
  17. this.averagePanel = new AveragePanel(this);
  18. }
  19. public void createClassChoose(){
  20. start.startButtonPanel.setVisible(false);
  21. start.startTitle.setVisible(false);
  22. start.frame.getContentPane().setBackground(normalChooseColor);
  23. chooseTitlePanel = new JPanel();
  24. chooseTitlePanel.setBounds(162,200,700,100);
  25. chooseTitlePanel.setBackground(normalChooseColor);
  26. chooseTitleLabel= new JLabel();
  27. chooseTitleLabel.setText("Choose Class!");
  28. chooseTitleLabel.setFont(start.chooseTitleFont);
  29. chooseTitlePanel.add(chooseTitleLabel);
  30. start.container.add(chooseTitlePanel);
  31. chooseButtonsPanel = new JPanel();
  32. chooseButtonsPanel.setBounds(162,500,700,100);
  33. chooseButtonsPanel.setLayout(new GridLayout(1,3,50,0));
  34. chooseButtonsPanel.setBackground(normalChooseColor);
  35. //CLASSES
  36. chooseMageButton = new JButton("Mage");
  37. chooseMageButton.setBackground(chooseClassColor);
  38. chooseMageButton.setFont(start.startTitleButton);
  39. chooseMageButton.addActionListener(classHandler);
  40. chooseMageButton.setActionCommand("Mage");
  41. chooseMageButton.setFocusPainted(false);
  42. chooseButtonsPanel.add(chooseMageButton);
  43. chooseWarriorButton = new JButton("Warrior");
  44. chooseWarriorButton.setBackground(chooseClassColor);
  45. chooseWarriorButton.setFont(start.startTitleButton);
  46. chooseWarriorButton.addActionListener(classHandler);
  47. chooseWarriorButton.setActionCommand("Warrior");
  48. chooseWarriorButton.setFocusPainted(false);
  49. chooseButtonsPanel.add(chooseWarriorButton);
  50. chooseArcherButton = new JButton("Archer");
  51. chooseArcherButton.setBackground(chooseClassColor);
  52. chooseArcherButton.setFont(start.startTitleButton);
  53. chooseArcherButton.addActionListener(classHandler);
  54. chooseArcherButton.setActionCommand("Archer");
  55. chooseArcherButton.setFocusPainted(false);
  56. chooseButtonsPanel.add(chooseArcherButton);
  57. start.container.add(chooseButtonsPanel);
  58. }
  59. public class ClassHandler implements ActionListener{
  60. @Override
  61. public void actionPerformed(ActionEvent ex) {
  62. choosenClass = ex.getActionCommand();
  63. averagePanel.mainPanel();
  64. }
  65. }
  66. }

huangapple
  • 本文由 发表于 2020年8月9日 05:00:53
  • 转载请务必保留本文链接:https://go.coder-hub.com/63320189.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定