【问题标题】:public void paint( Graphics g ) is not painting for double it is painting for stringpublic void paint(Graphics g) 不是为 double 绘制而是为 string 绘制
【发布时间】:2013-10-17 12:00:17
【问题描述】:

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 );    
    }
}

【问题讨论】:

  • 等等,是添加dd1 而不是连接它们吗?
  • 你的问题对我来说太不清楚了。
  • 给定 2 个值,您希望打印什么?现在,对于值“1”和“2”,这将打印“D=12”(因为它是“D=1”+“1”+“2”作为字符串。)如果你想添加数字,你需要另一组括号:"d=" + (d+d1)
  • 您能否 [edit] 提出您的问题并包括输入数据、预期和实际输出的示例?
  • 嗯,它是 super.paint(g)

标签: java eclipse


【解决方案1】:

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

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

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

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

第四,Graphics 不提供除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 GraphicsWorking with Text APIs

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

【讨论】:

    【解决方案2】:

    你可以用String.valueOf(d)把Double转成String,然后用g.drawString方法把它画在图形上

    【讨论】:

    • 我想把String转成Double
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2014-04-14
    • 2010-10-04
    • 2019-11-23
    相关资源
    最近更新 更多