public void paint(Graphics g)不是为double绘画,它是为字符串绘画而我想将字符串转换为double。
所以我试着做一个堆栈计算器,我使用链表来完成双打 油漆的部分没有做我想要的。而我想要的是我有按钮来保持添加和分割等等。我试图打入一个数字,它会立即在我的窗口上绘制它,而不是那样做。我正在使用eclipse。
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 );
}
}
答案 0 :(得分:0)
您可以使用String.valueOf(d)将Double转换为String,然后使用g.drawString方法将其绘制在图形上
答案 1 :(得分:0)
这个问题背景很少,难以提供合适的答案。
首先,每当你打电话给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 Graphics和Working with Text APIs。
最后,您应该避免覆盖paint
方法。如果您从JFrame
或Frame
这样的内容覆盖了此内容,那么您应该创建一个自定义组件(从JPanel
扩展)并在那里放置自定义绘画。除了其他任何东西,它是双重缓冲。