-6

public void paint(Graphics g) 不是为 double 绘制,而是为 string 绘制,我想将 string 转换为 double。

所以我试图做一个堆栈计算器,我使用链表来做它,把油漆的部分加倍没有做我想要的。我想要的是我有按钮来按住加法和除法等。我试图输入一个数字,它会立即在我的窗口上绘制它,但它没有这样做。我使用日食。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import NumberTree.Ornament;
import java.util.Iterator;
import java.util.LinkedList;

public class StackCalc extends JFrame implements ActionListener {
    private   LinkedList<Double> values;
    double value1 , value2 ;

    JTextField theTextField;
    JButton boxButton;

    public static void main ( String[] args) {
         new StackCalc();
    }

    public StackCalc() {
        setDefaultCloseOperation( EXIT_ON_CLOSE );

        setLayout( new FlowLayout());
        setTitle("StackCalc");
        setSize(new Dimension(600,600));

        boxButton = new JButton("add");
        add(boxButton);
        boxButton.addActionListener( this );
        boxButton = new JButton("multi");
        add(boxButton);
        boxButton.addActionListener( this );
        boxButton = new JButton("divide");
        add(boxButton);
        boxButton.addActionListener( this );
        boxButton = new JButton("subt");
        add(boxButton);
        boxButton.addActionListener( this );

        theTextField = new JTextField("Write Something ");
        add(theTextField);
        theTextField.addActionListener( this );

        values = new LinkedList<Double>(); // make the stack
        setVisible(true);
  }

public void actionPerformed(ActionEvent e) {
    if  ( e.getSource()==theTextField )  {
        value1 = Double.parseDouble(theTextField.getText());
        values.push(value1);
      }
}

public void add() {//return nothing
    value1=values.pop();
    value2=values.pop();
    values.push (value1 + value2);
}

public void multi() { //return nothing
    value1=values.pop();
    value2=values.pop();
    values.push (value1 * value2);
}

public void divide() {//return nothing
    value1=values.pop();
    value2=values.pop();
    values.push (value1 / value2);
}

public void subt() {//return nothing
    value1=values.pop();
    value2=values.pop();
    values.push (value1 - value2);
}

public void paint( Graphics g ) {
    Iterator it = values.iterator();
    while (it.hasNext()) {
        double d = (Double)(it.next()); 
        Double d1 = (Double)(it.next()); 
        System.out.println("d="+d + d1 );

        super.paint(g);
        //((LinkedList) values).paint(g);
        //values = LinkedList.paint(g);

        g.create(29, 40, 100, 200); // at the bottom of the screen
        //g.drawString( value2, 50,420 ); 
       //g.drawString( values, 50,480 );    
    }
}
4

2 回答 2

0

您可以使用 String.valueOf(d) 将 Double 转换为 String,然后使用 g.drawString 方法将其绘制在图形上

于 2013-10-09T22:16:44.580 回答
0

这个问题的上下文很少,因此很难提供合适的答案。

首先,每次调用时super.paint,您都有可能清除之前绘制的内容,使整个循环变得毫无价值......

其次,您还应该尽可能避免使用幻数。

第三,在it.next循环中进行两次迭代 ( ) 可能会导致 `NoSuchElementException

第四,Graphics不提供任何方法来绘制除 a 以外的任何东西String,因此您必须将double值转换为String值,没有其他选择...

public void paint( Graphics g )
{
    super.paint(g);
    FontMetrics fm = g.getFontMetrics();
    Iterator it = values.iterator();
    int width = getWidth();
    int height = getHeight();   
    int y = height;
    while (it.hasNext())
    {
        double d = (Double)(it.next()); 
        y -= fm.getHeight();
        String text = NumberFormatter.getNumberFormat().format(d);
        int x = width - fm.stringWidth(text);
        g.drawString(text, x, y + fm.getAscent());
    }
}

您可能希望特别了解2D 图形使用文本 API

最后,您应该避免覆盖该paint方法。如果您从JFrameor之类的东西覆盖它Frame,那么您应该创建一个自定义组件(从类似的东西扩展JPanel)并将您的自定义绘画放在那里。除此之外,它是双缓冲的。

于 2013-10-09T23:28:49.493 回答