Java 动作侦听器不工作

Java 动作侦听器不工作,java,swing,Java,Swing,我不熟悉java swing 当我想将actionlistener设置为其中一个按钮时,它必须获取textArea内容并将其发送到另一个类。它没有以我所期望的方式工作 相反,当我更改文本区域的内容时,它会起作用,我不知道发生了什么 我命名为按钮的第一个按钮,当我在名为Clac的按钮actionlistener中使用另一个actionlistener时,发生了相同的问题 这是我的密码: package FFT; import java.awt.BorderLayout; import java.

我不熟悉java swing

当我想将actionlistener设置为其中一个按钮时,它必须获取textArea内容并将其发送到另一个类。它没有以我所期望的方式工作

相反,当我更改文本区域的内容时,它会起作用,我不知道发生了什么

我命名为按钮的第一个按钮,当我在名为Clac的按钮actionlistener中使用另一个actionlistener时,发生了相同的问题

这是我的密码:

package FFT;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class FFT_Main_Frame extends JFrame {

JLabel label;
JButton button;
TextPanel txtPanel;
JButton Button;
JLabel label1;
//JTextArea[] BoxArray;
makePolynomial mp;
JButton Calc;
Complex[] Nums;
Complex[] Result;
int input;
FFT_Main fft_main;
ShowResult shr;

public FFT_Main_Frame()
{
    super ("F F T");
    //final int input;
    label=new JLabel();
    txtPanel=new TextPanel();
    Button=new JButton("OK");

    label.setText("Please Enter your Polynomial Degree");
    setLayout(new FlowLayout());
    add(label);
    add(txtPanel);
    add(Button);

    Calc=new JButton("Claculate");



    Button.addActionListener(new ActionListener()
    {
        //Test t;

        //Integer content;
        @Override
        public void actionPerformed(ActionEvent arg0) {

            try{
            Integer   content=new   Integer(Integer.parseInt(txtPanel.getTextArea()));
            input=content;
            System.out.println(input);
            //inputt=input;
            mp=new makePolynomial(content);
            setLayout(new FlowLayout());
            add(mp);
            //setLayout(new BorderLayout());
            add(Calc);

            Nums=new Complex[input+1];
            Calc.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                for(int i=input;i>=0;i--)
                    {
                        Nums[i]=new  Complex(Double.parseDouble(mp.BoxArray[2*(i+1)- 1].getText()),Double.parseDouble(mp.BoxArray[2*i].getText()));
                    }

                    for (int i=0;i<=input;i++)
                    {
                        System.out.println(Nums[i]);
                    }
                    fft_main=new FFT_Main();
                    Result=new Complex[input];

                    Result=fft_main.Recursive_FFT(Nums);

                    shr=new ShowResult(Result);

                    setLayout(new BorderLayout());
                    add(shr,BorderLayout.CENTER);

                    System.out.println("Result\n\n");
                    for (int i=0;i<=input;i++)
                    {
                        System.out.println(Result[i]);
                    }

                }
                });



            }
            catch (NumberFormatException exception)
            {
                JOptionPane.showMessageDialog(null, "Please Enter Just Numbers! " , "Wrong Value", JOptionPane.ERROR_MESSAGE);

            }
        }
    }
            );
    //Integer k=new Integer(Integer.parseInt(txtPanel.getTextArea()));
    //System.out.println();
    //Nums=new Complex[input+1];





    setSize(600,500);
    setVisible(true);






  }

}
包FFT;
导入java.awt.BorderLayout;
导入java.awt.FlowLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JOptionPane;
公共类FFT_主框架扩展了JFrame{
JLabel标签;
按钮;
TextPanel txtPanel;
按钮;
JLabel标签1;
//JTextArea[]BoxArray;
makemp;
JButton-Calc;
复杂[]Nums;
复杂的结果;
int输入;
FFT_Main FFT_Main;
显示结果shr;
公共FFT_主框架()
{
超级(“F T”);
//最终整数输入;
label=新的JLabel();
txtPanel=newtextpanel();
按钮=新按钮(“确定”);
label.setText(“请输入多项式次数”);
setLayout(新的FlowLayout());
添加(标签);
添加(TXT面板);
添加(按钮);
Calc=新按钮(“Claculate”);
addActionListener(新建ActionListener())
{
//试验t;
//整数内容;
@凌驾
已执行的公共无效操作(操作事件arg0){
试一试{
整数内容=新整数(Integer.parseInt(txtPanel.getTextArea());
输入=内容;
系统输出打印项次(输入);
//输入=输入;
mp=新的生成多项式(内容);
setLayout(新的FlowLayout());
添加(mp);
//setLayout(新的BorderLayout());
添加(计算);
Nums=新复合体[输入+1];
Calc.addActionListener(新ActionListener()
{
@凌驾
已执行的公共无效操作(操作事件arg0){
对于(int i=input;i>=0;i--)
{
Nums[i]=new Complex(Double.parseDouble(mp.BoxArray[2*(i+1)-1].getText()),Double.parseDouble(mp.BoxArray[2*i].getText());
}
对于(int i=0;i=1)
{
标签[b-1]=新的JLabel();
标签[b-1].setText(“IX”+b+”);
添加(标签[b-1]);
}
如果(b==0)
{
JLabel l1=新的JLabel();
l1.setText(“我”);
添加(l1);
}
b--;
}
}
}
展示结果类别:

package FFT;

import java.awt.FlowLayout;

import javax.swing.JLabel;
import javax.swing.JPanel;

public class ShowResult extends JPanel {
JLabel[] label;


public ShowResult(Complex[] c) {


    label=new JLabel[c.length];
    System.out.println("Complex"+c.length);

    setLayout(new FlowLayout());

    for (int i=0;i<c.length;i++)
    {
        label[i]=new JLabel();
        label[i].setText("y["+i+"]= "+c[i].toString());

        add(label[i]);

    }




  }



  }
包FFT;
导入java.awt.FlowLayout;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
公共类ShowResult扩展了JPanel{
JLabel[]标签;
公开展示结果(综合体[]c){
标签=新的JLabel[c.长度];
System.out.println(“复杂”+c.长度);
setLayout(新的FlowLayout());

对于(int i=0;i作为一个代码部分较小的可运行程序的示例,请参见下文。为了保持简短,我用一个
JPanel
替换了
makepolymonery
类。我添加了代码以隐藏
按钮的
actionPerformed
方法中的三个初始组件,但我非常确定有我们有更好的方法来做到这一点

此程序是否在您的机器上按预期工作

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ActionListenerBug {
    public static void main(final String[] arguments) {
        SwingUtilities.invokeLater(() -> new ActionListenerBug().createAndShowGui());
    }

    private void createAndShowGui() {
        final JFrame frame = new JFrame("Stack Overflow");
        frame.setBounds(100, 100, 800, 600);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        final JPanel panel = new JPanel();

        JLabel label = new JLabel();
        // TextPanel is a class?
        JTextPane txtPanel = new JTextPane();
        JButton Button = new JButton("OK");

        label.setText("Please Enter your Polynomial Degree");

        panel.setLayout(new FlowLayout());
        panel.add(label);
        panel.add(txtPanel);
        panel.add(Button);

        Button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                try {
                    int input = Integer.parseInt(txtPanel.getText());
                    System.out.println(input);
                    //mp = new makePolynomial(content);
                    JPanel mp = new JPanel();
                    mp.add(new JLabel("input: " + input));

                    // Hide other components for now. Showing a different panel would be
                    // better.
                    label.setVisible(false);
                    txtPanel.setVisible(false);
                    Button.setVisible(false);

                    panel.setLayout(new FlowLayout());
                    panel.add(mp);
                    //setLayout(new BorderLayout());
                    JButton Calc = new JButton("Claculate");
                    panel.add(Calc);
                    panel.revalidate();
                } catch (NumberFormatException exception) {
                    JOptionPane.showMessageDialog(null, "Please Enter Just Numbers! ", 
                                                  "Wrong Value", 
                                                  JOptionPane.ERROR_MESSAGE);
                }
            }
        });

        frame.getContentPane().add(panel);
        frame.setVisible(true);
    }
}

有什么不符合我的期望?你期望什么?请检查如何提出好的问题,以便得到好的答案。特别是提供一个(关注最小值)重现问题-您的代码很可能包含太多不需要演示问题的内容。这也是跟踪问题的一般方法:将代码减少到绝对最小值(使用git等版本控制系统,以便跟踪更改)。您的代码乱七八糟。请尝试遵循良好的命名约定,以使其更具可读性。Button是类的名称,而不是变量。请将变量名称以小写开头,这样我们就知道您不是在引用类。请重新格式化代码,并尽可能多地删除代码,以便我们能够集中精力解决问题。否则,它将不太可能是l我相信你会得到答案。你有一个名为
JButton
按钮和另一个名为
按钮
。这是一个糟糕的命名方式。用描述性的方式命名变量,并且总是以小写字母开头,然后再加上CamelCase。(因此,变量名中每个新词的开头都有一个大写字母)。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ActionListenerBug {
    public static void main(final String[] arguments) {
        SwingUtilities.invokeLater(() -> new ActionListenerBug().createAndShowGui());
    }

    private void createAndShowGui() {
        final JFrame frame = new JFrame("Stack Overflow");
        frame.setBounds(100, 100, 800, 600);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        final JPanel panel = new JPanel();

        JLabel label = new JLabel();
        // TextPanel is a class?
        JTextPane txtPanel = new JTextPane();
        JButton Button = new JButton("OK");

        label.setText("Please Enter your Polynomial Degree");

        panel.setLayout(new FlowLayout());
        panel.add(label);
        panel.add(txtPanel);
        panel.add(Button);

        Button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                try {
                    int input = Integer.parseInt(txtPanel.getText());
                    System.out.println(input);
                    //mp = new makePolynomial(content);
                    JPanel mp = new JPanel();
                    mp.add(new JLabel("input: " + input));

                    // Hide other components for now. Showing a different panel would be
                    // better.
                    label.setVisible(false);
                    txtPanel.setVisible(false);
                    Button.setVisible(false);

                    panel.setLayout(new FlowLayout());
                    panel.add(mp);
                    //setLayout(new BorderLayout());
                    JButton Calc = new JButton("Claculate");
                    panel.add(Calc);
                    panel.revalidate();
                } catch (NumberFormatException exception) {
                    JOptionPane.showMessageDialog(null, "Please Enter Just Numbers! ", 
                                                  "Wrong Value", 
                                                  JOptionPane.ERROR_MESSAGE);
                }
            }
        });

        frame.getContentPane().add(panel);
        frame.setVisible(true);
    }
}