-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

質問には文脈がほとんどないため、適切な回答を提供することは困難です。

まず、 を呼び出すたびにsuper.paint、以前にペイントされたものをクリアして、ループ全体を価値のないものにする可能性があります...

第二に、可能な場合はマジック ナンバーも避ける必要があります。

第三に、ループ内で二重反復 ( it.next) を実行すると、`NoSuchElementException が発生する可能性があります。

第四に、Graphicsa 以外のものをペイントする手段を提供しないため、値を値Stringに変換する必要があります。他に選択肢はありません...doubleString

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をご覧になることをお勧めします。

最後に、メソッドをオーバーライドしないようにする必要がありますpaintJFrameまたは などからこれをオーバーライドする場合はFrame、カスタム コンポーネント ( などから拡張JPanel) を作成し、そこにカスタム ペイントを配置する必要があります。何よりも、ダブルバッファリングされています。

于 2013-10-09T23:28:49.493 に答える
0

String.valueOf(d) を使用して Double を String に変換し、g.drawString メソッドを使用してグラフィックスにペイントできます。

于 2013-10-09T22:16:44.580 に答える