按下按钮时JLabel不更新

时间:2016-05-16 04:33:39

标签: java jpanel jbutton jlabel

为决赛制作计算器,我的JLabel更新有困难。当Label初始化时,它会显示opNum的起始值,但是无论何时调用该方法将数字添加到opNum的末尾,它似乎都不会更新。我不确定它是否重新粉刷,或者当我从按钮调用方法时出现问题。我做了一些愚蠢或坏事,或两者兼而有之。帮助

JLabel和Methods类:

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

public class NumberText extends JPanel
{
private JLabel opNumLabel;
private String opNum;
private double storeNum = 0;
private boolean firstOp = true;
private char op;
private char sign = '+';

//Panel for Number
public NumberText()
{
    //I heard that it could be an issue with the Label not having enough space, though this didnt help
    opNumLabel = new JLabel ("1234567890111");
    opNumLabel.setText(opNum);
    add(opNumLabel);
    setPreferredSize (new Dimension (150, 40));
    setBackground (Color.white);
}

//Clears the current typed number
public void Clear ()
{
    opNum = "";
    opNumLabel.setText(opNum);
}

//Sets it back to conditions like the start of the program
public void ClearAll ()
{
    opNum = "";
    storeNum = 0;
    firstOp = true;
    opNumLabel.setText(opNum);
}


//for storing the operation
public void OpStore (char newOp)
{
    op = newOp;
    firstOp = false;
}

//for adding to the opNum
public void Edit (String button)
{
    opNum = opNum + button;
    opNumLabel.setText(opNum);
    opNumLabel.repaint();
}

//for testing for the first Operation
public boolean IsFirstOp ()
{
    return firstOp;
}

//for changing the sign
public void SignChange ()
{
    if (sign == '+')
    {
        opNum = "-" + opNum;
        opNumLabel.setText(opNum);
        sign = '-';
    }

    else if (sign == '-')
    {
        opNum.replaceAll("-", "");
        opNumLabel.setText(opNum);
        sign = '+';
    }
}

//for storing a number when an operation is pressed
public void StoreNum ()
{
    storeNum = Double.parseDouble(opNum);
    opNum = "";
}

//Math when an Operation is to be done
public void Operation()
{
    double value = Double.parseDouble(opNum);
    double total = 0;

    switch(op)
    {
        case '+': total = storeNum + value;
            break;

        case '-': total = storeNum - value;
            break;

        case '/': total = storeNum / value;
            break;

        case '*': total = storeNum * value;
            break;

        case '%': total = storeNum % value;
            break;
    }

    opNum = Double.toString(total);
    opNumLabel.setText(opNum);
}


}

按钮示例:

public class Button1 extends JPanel
{
private JButton push;
private JLabel label;
public Button1 ()
{

  push = new JButton ("1");
  push.addActionListener (new ButtonListener());

  add (push);
}
private class ButtonListener implements ActionListener
{
  public void actionPerformed (ActionEvent event)
  {
      //to avoid non-static cant be ref by static
     NumberText NumberText = new NumberText();
     NumberText.Edit("1");
  }
}
}

1 个答案:

答案 0 :(得分:0)

actionPerformed(...)编辑NumberText.Edit("1")的{​​{1}}新NumberText未添加到任何框架中。如果您希望在Edit(...)方法中所做的更改生效,则需要获得对已显示的NumberText的引用。

以下是一个例子:

public static void main(String[] args) {
    JFrame frame = new JFrame();
    ....
    NumberText numberText = new NumberText();
    Button1 button = new Button1(numberText);
    JPanel pan = new JPanel();
    pan.add(numberText);
    pan.add(button);
    frame.add(pan);
    .....
}


public class Button1 extends JPanel {
    private JButton push;
    private JLabel label;
    NumberText alreadyDisplayed;
    public Button1 (NumberText alreadyDisplayed) {
        this.alreadyDisplayed = alreadyDisplayed;
        push = new JButton ("1");
        push.addActionListener (new ButtonListener());
        add(push);
    }

    private class ButtonListener implements ActionListener {
        public void actionPerformed (ActionEvent event) {
            alreadyDisplayed.Edit("1");
        }
    }
}