Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swing中的.getText()出错,在java中获取NullPointerException_Java_Swing_Nullpointerexception - Fatal编程技术网

swing中的.getText()出错,在java中获取NullPointerException

swing中的.getText()出错,在java中获取NullPointerException,java,swing,nullpointerexception,Java,Swing,Nullpointerexception,我有一个空指针异常,我似乎找不到解决方案。我在网上搜索了几个小时,但似乎找不到我的问题 问题是.getText()给了我null。现在,我找不到修复的方法。代码如下: import javax.swing.JFrame; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Random; public class MainPart extends JFrame { priv

我有一个空指针异常,我似乎找不到解决方案。我在网上搜索了几个小时,但似乎找不到我的问题

问题是.getText()给了我null。现在,我找不到修复的方法。代码如下:

import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Random;

public class MainPart extends JFrame
{
    private String currentuser;
    public JPanel north, center, south;
    private JButton testone, buy, sell, ButtonSetBalance, ButtonAddBalance;
    public JTextField nums, share, price, thebalance;
    public JLabel result, mybalance, myshowbalance;
    public double balance;


    public MainPart()
    {
    }


    public MainPart(String username)
    {
        currentuser = username;

        GridBagConstraints c = new GridBagConstraints();

        north = new JPanel(new GridBagLayout());
        north.setBackground(Color.cyan);
        north.setSize(300,300);
        getContentPane().add(north, BorderLayout.SOUTH);

        testone = new JButton("Start/Stop");
        c.gridx = 0;
        c.gridy = 0;
        north.add(testone, c);

        nums = new JTextField(10);
        c.gridx = 1;
        c.gridy = 0;
        north.add(nums, c);

        result = new JLabel("result");
        c.gridx = 2;
        c.gridy = 0;
        north.add(result, c);

        ButtonSetBalance = new JButton("Set Balance");
        c.gridx = 0;
        c.gridy = 1;
        north.add(ButtonSetBalance, c);

        ButtonAddBalance = new JButton("Add Balance");
        c.gridx = 1;
        c.gridy = 1;
        north.add(ButtonAddBalance, c);

        thebalance = new JTextField(10);
        c.gridx = 2;
        c.gridy = 1;
        north.add(thebalance,c);

        mybalance = new JLabel("Balance: ");
        c.gridx = 0;
        c.gridy = 2;
        north.add(mybalance, c);

        myshowbalance = new JLabel(Double.toString(balance));
        c.gridx = 1;
        c.gridy = 2;
        north.add(myshowbalance,c);

        System.out.println("The balance: " + thebalance.getText());

        newevent e = new newevent();

        testone.addActionListener(e);
        ButtonAddBalance.addActionListener(e);
        ButtonSetBalance.addActionListener(e);

    }

    public class newevent extends MainPart implements ActionListener
    {
        public boolean engine = false;
        public Thread t;
        MainPart action;        
        public void actionPerformed(ActionEvent evt)
        {   

            if(evt.getSource() == testone)
            {

                //t = new Thread(new StockNums(true));
                //t.start();

               if(engine == false)
               {
                    t = new Thread(new StockNums(true));
                    t.start();
                    System.out.println("Start");
                    engine = true;
                }
                else
                {
                    t.interrupt();
                    System.out.println("Stop");
                    engine = false;
                }

            }
            else if(evt.getSource() == ButtonSetBalance)
            {
                System.out.println("Inside set theres: ");
                try
                {
                    action = new MainPart();
                    action.setBalance(Double.parseDouble(thebalance.getText()));
                }
                catch(Exception e){System.out.println(e);}
            }
            else if(evt.getSource() == ButtonAddBalance)
            {
                try
                {
                    action = new MainPart();
                    action.addBalance(Double.parseDouble(thebalance.getText()));
                }
                catch(Exception e){ System.out.println(e);}
            }
        }
    }

    public void setBalance(double bal)
    {
        balance = bal; 
        System.out.println("Balance = £" + balance);

    }

    public void addBalance(double bal)
    {
        balance += bal;
        System.out.println("Added " + bal + " to balance. New balance = £");

    }

    public void setLabelText(String i)
    {
        result.setText(i);
    }
}
问题具体出现在它侦听ButtonAndBalance和ButtonSetBalance的事件中。它给出了一个NullPointerException,我没有找到修复的方法。它应该从标签“thebalance”中获取文本,并将其解析为Double,然后根据具体情况,将其添加到balance或将其设置为balance全局Double变量。谢谢大家!

此处出现错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at MainPart$newevent.actionPerformed(MainPart.java:115)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6373)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6138)
    at java.awt.Container.processEvent(Container.java:2085)
    at java.awt.Component.dispatchEventImpl(Component.java:4735)
    at java.awt.Container.dispatchEventImpl(Container.java:2143)
    at java.awt.Component.dispatchEvent(Component.java:4565)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4621)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4282)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4212)
    at java.awt.Container.dispatchEventImpl(Container.java:2129)
    at java.awt.Window.dispatchEventImpl(Window.java:2478)
    at java.awt.Component.dispatchEvent(Component.java:4565)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:679)
    at java.awt.EventQueue.access$000(EventQueue.java:85)
    at java.awt.EventQueue$1.run(EventQueue.java:638)
    at java.awt.EventQueue$1.run(EventQueue.java:636)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
    at java.awt.EventQueue$2.run(EventQueue.java:652)
    at java.awt.EventQueue$2.run(EventQueue.java:650)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:649)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
这里还有StockNums类(尽管我不认为这个错误需要它):


问题是:
newevent
扩展了
MainPart
(据我所知,这是不必要的)。这意味着
newevent
中的
balance
不是封装的
main部分的
balance
字段,而是
newevent
本身的
balance
字段,它从不初始化


如注释中所述,此代码还存在其他各种问题,但这正是导致
NullPointerException
的原因。删除
extends MainPart
,您应该能够继续。忽略println in按钮,忘记取出,正在检查代码是否正在执行并定位错误。请始终逐字粘贴完整的错误。否则人们不得不猜测。你的
StockNums(布尔)
构造函数在哪里?我是说全班:-)编辑了帖子并添加了!:对我来说,你的整个编码风格都是错误的。为什么要为
controller
类扩展
GUI
类,为什么不将这些东西放在给定的
GUI
类中,而不是将它们放在一起。很多事情都是错误的,或者说方案写错了,大多数都不符合
Java
为开发人员制定的标准。你知道吗?不要在GUI中使用
Thread.sleep(…)
,这可能会导致应用程序闪烁或冻结。+1,毫无疑问,代码有太多缺陷,很难逐一解释,直到和除非OP无法面对面。书面交流太难解释了。是的,的确如此!!为此干杯!我不知道我不必扩展MainPart来使用它的变量!对于相同的代码,我还有一个问题:为什么StockNums类中线程的run()方法不更改MainPart的标签?如果在while循环中取消注释已注释代码,您将看到该语句!不知道StockNums类做什么,我真的不能说。然而,有一件事值得知道,如果要读取或写入Swing组件,则需要在事件分派线程中执行。因此,如果要修改标签,可能需要将
setText()
调用包装在
Runnable
中,并使用
SwingUtilities.invokeLater()调用它。看见
import java.util.*;

public class StockNums extends MainPart implements Runnable
{
   int num;
   boolean active;
   Random r = new Random();
   MainPart n = new MainPart();

   public StockNums(boolean get)
   {
       System.out.println("Inside StockNums");
       active = get;
    }


    public void run()
    {
        try
        {
            while(active == true)
            {
                //result.setText(Double.toString(random(Integer.parseInt(nums.getText()))));
                System.out.println(Double.toString(random(1000)));
                Thread.sleep(1000); // One second refresh
            }
        }
        catch(Exception e){}
    }

    public double random(int num)
    {
        Random number = new Random();
        return number.nextInt(num); 

    }

    //result.setText(Double.toString(random(Integer.parseInt(nums.getText()))));
}