【问题标题】:ActionListener for one of the Jbuttons doesn't get called没有调用其中一个 Jbutton 的 ActionListener
【发布时间】:2015-02-11 20:23:36
【问题描述】:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;



@SuppressWarnings("serial")
public class Gui extends JFrame {

private ExpPanel panel1;
private Expression expression;
private ColorPanel panel2;
private SetValsPanel panel3;
int xIndex;
int cIndex;

public Gui(){
    setLayout(new GridLayout(3,1,0,0));
    panel1 = new ExpPanel();
    panel2 = new ColorPanel();
    panel3 = new SetValsPanel();

    add(panel1);
    add(panel2);
    add(panel3);

    panel1.setExp.addActionListener(
            new ActionListener() {

                public void actionPerformed(ActionEvent arg0) {
                    String temp = panel1.setExp.getText();
                    expression = new Expression(temp);
                    boolean[] isValid = expression.checkValid();
                    if(isValid[0]){
                        panel1.setExp.setText(expression.getExpression());
                        panel1.valid.setText("");
                        getContentPane().remove(panel2);
                        getContentPane().remove(panel3);
                        if (expression.getVars().length==0)
                            panel1.valid.setText("There's no variables in the entered expression.");
                        else if(expression.getVars().length==1){
                            panel3 = new SetValsPanel(expression);
                            add(panel3);

                        }
                        else {
                        panel2 = new ColorPanel(expression);
                        add(panel2);

                    }
                    }
                    else {


                        if(!isValid[1])
                            panel1.valid.setText("Invalid Expression (The prantheses don't match). Re-enter the expression." );

                        if(!isValid[3])
                            panel1.valid.setText("Invalid Expression (The expression must not continue after the last pranthes OR Invalid function name). Re-enter the expression." );

                        if(!isValid[2])
                            panel1.valid.setText("Invalid Expression (At least one argument of one of the functions is not entered). Re-enter the expression." );

                        if(!isValid[4])
                            panel1.valid.setText("Invalid Expression (You've entered two arguments for a single argument function). Re-enter the expression." );

                        getContentPane().remove(panel2);
                        getContentPane().remove(panel3);

                    }
                    validate();
                    repaint();
                }
            }
            );

    panel1.setbtn.addActionListener(
            new ActionListener() {

                public void actionPerformed(ActionEvent arg0) {
                    System.out.println("in this shit");
                    String temp = panel1.setExp.getText();
                    expression = new Expression(temp);
                    boolean[] isValid = expression.checkValid();
                    if(isValid[0]){
                        panel1.setExp.setText(expression.getExpression());
                        panel1.valid.setText("");
                        getContentPane().remove(panel2);
                        getContentPane().remove(panel3);
                        if (expression.getVars().length==0)
                            panel1.valid.setText("There's no variables in the entered expression.");
                        else if(expression.getVars().length==1){
                            panel3 = new SetValsPanel(expression);
                            add(panel3);

                        }
                        else {
                        panel2 = new ColorPanel(expression);
                        add(panel2);

                    }
                    }
                    else {


                        if(!isValid[1])
                            panel1.valid.setText("Invalid Expression (The prantheses don't match or don't exist). Re-enter the expression." );

                        if(!isValid[3])
                            panel1.valid.setText("Invalid Expression (The expression must not continue after the last pranthes OR Invalid function name). Re-enter the expression." );

                        if(!isValid[2])
                            panel1.valid.setText("Invalid Expression (At least one argument of one of the functions is not entered). Re-enter the expression." );

                        if(!isValid[4])
                            panel1.valid.setText("Invalid Expression (You've entered two arguments for a single argument function). Re-enter the expression." );

                        getContentPane().remove(panel2);
                        getContentPane().remove(panel3);

                    }
                    validate();
                    repaint();
                }
            }
            );

    panel2.setbtn.addActionListener(
            new ActionListener() {


                public void actionPerformed(ActionEvent arg1) {
                    if (panel2.cIndex == panel2.xIndex)
                        JOptionPane.showMessageDialog(null, "You can't choose the same variable for x-axis and color", "Error!", JOptionPane.ERROR_MESSAGE);
                    else {
                        String temp;
                        temp = expression.getVars()[xIndex];
                        expression.setVars(xIndex,expression.getVars()[0]);
                        expression.setVars(0,temp);
                        temp = expression.getVars()[cIndex];
                        expression.setVars(xIndex,expression.getVars()[1]);
                        expression.setVars(1,temp);
                        temp = null;
                        getContentPane().remove(panel3);
                        panel3 = new SetValsPanel(expression);
                        add(panel3);
                        validate();
                        repaint();
                    }
                }
            }
            );

}



}


@SuppressWarnings("serial")
class ExpPanel extends JPanel{

String expression;
JTextField setExp;
JButton setbtn;
JLabel instruction;
JLabel valid;
boolean isValid;
public ExpPanel(){

    setLayout(new GridLayout(2, 1, 5, 5));
    setExp = new JTextField(10);
    setbtn = new JButton("Set");    
    instruction = new JLabel("Enter Expression : ");
    valid = new JLabel("", JLabel.CENTER);

    JPanel up = new JPanel();
    up.add(instruction,BorderLayout.WEST);
    up.add(setExp,BorderLayout.CENTER);
    up.add(setbtn,BorderLayout.EAST);

    add(up);
    add(valid);

}



 }

@SuppressWarnings("serial")
class ColorPanel extends JPanel{

JButton setbtn = new JButton("Set");
JRadioButton[] xAxisbtns;
JRadioButton[] colorbtns;
int xIndex= -1;
int cIndex = -1;
public ColorPanel(){

}

public ColorPanel(Expression a){
    int num = a.getVars().length;
    xAxisbtns = new JRadioButton[num];
    colorbtns = new JRadioButton[num];
    ButtonGroup colorgroup = new ButtonGroup();
    ButtonGroup axisgroup= new ButtonGroup();
    setLayout( new GridLayout(4,1,0,0));
    JLabel instr = new JLabel("Select the variables for x-Axis and Color : ",JLabel.CENTER);
    JPanel cPanel = new JPanel();
    JPanel xPanel = new JPanel();
    cPanel.setLayout(new GridLayout(1, num + 1, 1, 1));
    xPanel.setLayout(new GridLayout(1, num + 1, 1, 1));
    cPanel.add(new JLabel("Select the variable for Color :",JLabel.CENTER));
    xPanel.add(new JLabel("Select the variable for x-Axis :",JLabel.CENTER));
    for(int i =0;i<num;i++){
        xAxisbtns[i] = new JRadioButton(a.getVars()[i]);    
        colorbtns[i] = new JRadioButton(a.getVars()[i]);
        colorgroup.add(colorbtns[i]);
        axisgroup.add(xAxisbtns[i]);
        xPanel.add(xAxisbtns[i]);
        cPanel.add(colorbtns[i]);
        xAxisbtns[i].addItemListener(new xhandler(i));
        colorbtns[i].addItemListener(new chandler(i));
    }
    JPanel btnPanel = new JPanel();
    btnPanel.add(setbtn,JPanel.LEFT_ALIGNMENT);
    add(instr);
    add(xPanel);
    add(cPanel);
    add(btnPanel);
}

  private class xhandler implements ItemListener{
    private int index;

    @Override
    public void itemStateChanged(ItemEvent arg0) {

        xIndex = index;
    }
    public xhandler(int i){
        index = i;
    }

}

  private class chandler implements ItemListener{
    private int index;

    @Override
    public void itemStateChanged(ItemEvent arg0) {

        cIndex = index;
    }
    public chandler(int i){
        index = i;
    }

 }
 }
@SuppressWarnings("serial")
class SetValsPanel extends JPanel{

 JTextField[][] vals;
 JButton drawIt = new JButton("Draw this shit");
 JLabel[][] labels;

 public SetValsPanel(){

    drawIt.setEnabled(false);

}

public SetValsPanel(Expression a){

    int num = a.getVars().length;
    vals = new JTextField[3][num];
    labels = new JLabel[3][num];
    JPanel[] rows = new JPanel[num];
    setLayout(new GridLayout(num+2,1,5,5));
    add(new JLabel("Set the Range and the inital value for each variable : "));
    for(int i=0;i<num;i++){
        labels[0][i] = new JLabel("Range for " + a.getVars()[i] + " :",JLabel.CENTER);
        labels[1][i] = new JLabel(" to ",JLabel.CENTER);
        labels[2][i] = new JLabel(" Inital value = " + a.getVars()[i] + " :",JLabel.CENTER);
        vals[0][i] = new JTextField(3);
        vals[1][i] = new JTextField(3);
        vals[2][i] = new JTextField(3);
        rows[i] = new JPanel();
        rows[i].setLayout(new GridLayout(1, 6, 2, 2));
        rows[i].add(labels[0][i]);
        rows[i].add(vals[0][i]);
        rows[i].add(labels[1][i]);
        rows[i].add(vals[1][i]);
        if (i!=0) {
            rows[i].add(labels[2][i]);
            rows[i].add(vals[2][i]);
        }
        add(rows[i]);
    }

    add(drawIt);

}

}

第二个按钮的动作监听器不起作用,而第一个动作监听器工作正常。我试图通过将 system.out 添加到 actionPerformed 方法来检查它是否被调用,该方法显示当我单击按钮时甚至没有调用 actionlistener。

Edit = panel2.setbtn.addActionListener 这个不起作用。

Edit = 这是表达式类

public class Expression {

private String expression;
protected String[] vars;
private String[] varValues;

public Expression(String expression){

    this.expression = ExpressionFunctions.toValid(expression);


    vars = new String[0];
    varValues = new String[0];

    extractVars();
}

public void extractVars() {

    String temp = expression;
    temp = temp.toLowerCase();

    String[] names1 = {"div\\(" , "idiv\\(" , "mod\\(" , "pow\\("};
    String[] names2 = {"cotan\\(" , "arccos\\(" , "arccosh\\(" , "arcsinh\\(" , "cos\\(", "arccot\\(" , "arccoth\\(" , 
            "arcsin\\(" , "arcsinh\\(" , "arccosh\\(", "arctanh\\(" , "cosh\\(" , "exp\\(" , "ln\\(", "fact\\(" , 
            "fib\\(" , "sinh\\(" , "tanh\\(" };
    for(String x : names1)
        temp = temp.replaceAll(x, "add\\(");
    for(String x : names2)
        temp = temp.replaceAll(x, "sin\\(");

    EvalExperession a = new EvalExperession(temp, vars, varValues);
    boolean rep = true;


    while (rep) {
        try {
            a.run();
            rep = false;
        } catch (IllegalArgumentException e) {

            add(e.getMessage());

         a = new EvalExperession(temp, vars, varValues);

        }
    }



}

private void add(String message) {
    String[] temp1 = new String[vars.length];
    String[] temp2 = new String[vars.length];
    for(int i =0;i<vars.length;i++){
        temp1[i] = vars[i];
        temp2[i] = varValues[i];
}
    vars = new String[temp1.length+1];
    varValues = new String[temp2.length+1];
    for(int i =0;i<temp1.length;i++){
        varValues[i] = temp2[i];

        vars[i] = temp1[i];}
    vars[temp1.length] = message;
    varValues[temp1.length] = "1.0";

    temp1=null;
    temp2 = null;
}

public String getExpression() {
    return expression.toLowerCase();
}

public void setExpression(String expression) {
    this.expression = expression;
}

public String[] getVars() {
    return vars;
}

public void setVars(int i,String a) {
    this.vars[i] = a;
}

public String[] getVarValues() {
    return varValues;
}

public void setVarValues(String[] varValues) {
    this.varValues = varValues;
}

public boolean[] checkValid(){

    int right=0;
    int left=0;

    boolean[] res = new boolean[5];
    for (int i =0;i<5;i++)
        res[i] = true;



    for (int i=0; i<expression.length(); i++){



        if(expression.charAt(i) == '(')
            left++;
        if(expression.charAt(i) == ')')
            right++;
        if (right>left){
            res[0] = false;
            res[1] = false;
            return res;}
    }

    if (right!=left || (right == 0 && left == 0))
    {
        res[0] = false;
        res[1] = false;
        return res;}

    for (String x : vars){
        if((x + "a").equals("a") || x.indexOf("(")!= -1 || x.indexOf(",")!= -1 || x.indexOf(")")!= -1){
            if((x + "a").equals("a")){
                res[0] = false;
                res[2] = false;
                return res;
            }

            if(x.indexOf("(")!= -1 || x.indexOf(")")!= -1 ){

                res[0] = false;
                res[3] = false;
                return res;
            }

            if(x.indexOf(",")!= -1){
                res[0] = false;
                res[4] = false;
                return res;
            }

        }

    }

    return res;

}


}

toValid 函数只是纠正一个字符串,你可以忽略它。

【问题讨论】:

  • 您接受 J-F Savard 的回答吗?如果没有,您能否提供 Expression 的代码?我正在尝试模拟它以调试您的代码,但这有点复杂。
  • 我按照你的要求做了。将不胜感激任何帮助。 J-F Savard 的回答没有帮助,因为代码仅适用于 panel1 按钮的动作侦听器。
  • @ShayanAkbari:如果您尝试理解基本信息,他的回答确实会有所帮助:如果您不向其添加 ActionListener,则 JButton 什么也不做。我建议您检查所有不起作用的 JButton,并确保您已为其添加了侦听器。此外,考虑重构该代码,因为它不必要地非常复杂,这使您(和我们)很难调试它。简化。提取有用的类。限制类之间的连接(减少耦合)。你不会后悔这样做的。
  • 感谢您的建议,但我确实为按钮添加了一个动作侦听器,但它不会;在单击按钮时不会被调用。
  • 感谢您添加表达式。当您的编辑到达时,我实际上已经创建了一个假人。下面的谜题的解决方案,在答案部分!

标签: java swing jbutton actionlistener


【解决方案1】:

这就是我认为正在发生的事情。开始时,您使用 ColorPanel() 创建一个 ColorPanel,并将一个 ActionListener 添加到它的 setbtn。

然后,在顶部面板中输入表达式并按下其按钮后,使用 ColorPanel(string) 创建一个新的 ColorPanel。但是,新 ColorPanel 中的新 setbtn 没有给定 ActionListener。

可能的快速解决方案:向构造函数添加一个 Button 参数并将旧的 setbtn 传递给新实例。那将是快速和肮脏的。

panel2 = new ColorPanel(expression, panel2.setbtn);

在对新 panel2 的调用中,以及

public ColorPanel(Expression a, JButton setbtn){
    this.setbtn = setbtn;

在颜色面板中。这对我有用。

【讨论】:

  • 非常感谢。它奏效了,我明白了自己所犯的错误。
  • 感谢您的支持,HFOE。已删除评论。很抱歉违反了礼节。一旦你删除你的,也会删除这个,所以人们不会认为你指的是 OP 回复。
【解决方案2】:

您永远不会将任何listener 添加到drawIt 按钮。执行与 setbtn 按钮相同的操作。编译器不会自己猜测它需要添加一个监听器......

你可能想添加

SetValsPanel.drawIt.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
    ...
    }
}

【讨论】:

  • 它没有改变。我的问题是第二个按钮的动作监听器在被点击时甚至没有被调用。
【解决方案3】:

建议:

  • 您需要阅读并使用 CardLayout,它可以让您轻松交换 JPanel 或任何其他组件,并有助于简化您的程序。
  • 您可能不想创建和交换多个 SetValPanel,对于 ColorPanel 也是如此。我打赌你只想创建一个并在需要时交换它们。如果需要,请确保将新的 Expression 对象传递到面板中,但如果不需要,请避免创建和丢弃。这将有助于简化您的代码并避免您的 ActionListener 问题。
  • 避免让一个类直接操作其他类的字段,例如在您的代码中,您有一个类直接将 ActionListener 添加到另一个类持有的 JButton,因为这会增加连接/耦合。相反,请将您的字段设为私有,并且如果您计划允许其他类将侦听器添加到包含的组件,请为此目的为该类提供一个公共方法。例如public void addSetBtnActionListener(ActionListener listener) {...}
  • 还可以阅读 MVC,即模型-视图-控制设计模式,因为它可以帮助您降低代码的复杂性。

【讨论】:

  • 很好的建议。将使用。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2021-02-08
  • 2012-09-10
  • 2014-12-21
  • 2012-12-26
  • 2020-11-01
  • 2011-09-14
相关资源
最近更新 更多