我正在尝试从处理Java 1.0的Java In A Nutshell Book中编译示例1-2。我得到一个错误,说选择无法转换为Button。现在,我不知道这是否是当前Java不支持我正在调用的库,或者某些东西已关闭的问题。
小程序应该是一种绘图板,错误位于第14行/ clear_button = new Choice();
import java.applet.*;
import java.awt.*;
public class Scribble extends Applet {
private int last_x = 0;
private int last_y = 0;
private Color current_color = Color.black;
private Button clear_button;
private Choice color_choices;
public void init(){
this.setBackground(Color.white);
clear_button = new Choice();
clear_button.setForeground(Color.black);
clear_button.setBackground(Color.lightGray);
this.add(clear_button);
color_choices = new Choice();
color_choices.addItem("black");
color_choices.addItem("red");
color_choices.addItem("yellow");
color_choices.addItem("green");
color_choices.setForeground(Color.black);
color_choices.setBackground(Color.lightGray);
this.add(new Label("Color: "));
this.add(color_choices);
}
public boolean mouseDown(Event e, int x, int y){
last_x = x; last_y = y;
return true;
}
public boolean mouseDrag(Event e, int x, int y){
Graphics g = this.setGraphics();
g.setColor(current_color);
g.drawline(last_x, last_y, x, y);
last_x = x;
last_y = y;
return true;
}
public boolean action(Event event, Object arg) {
if (event.target == clear_button) {
Graphics g = this.getGraphics();
Rectangle r = this.bounds();
g.setColor(this.getBackground());
g.fillRect(r.x, r.y, r.width, r.height);
return true;
}
else if (event.target == color.choices) {
if (arg.equals("black")) current_color = color.black;
else if (arg.equals("red")) current_color = color.red;
else if (arg.equals("yellow")) current_color = color.yellow;
else if (arg.equals("green")) current_color = color.green;
return true;
}
else return super.action(event, arg);
}
}
答案 0 :(得分:1)
这是因为Choice不会从Button扩展。类型不兼容。
https://docs.oracle.com/javase/7/docs/api/java/awt/Choice.html
为了解决这个问题,您需要将clear_button的类型更改为选择,如下所示:
private Choice clear_button;
我刚检查了旧的java 1.0.2文档,而Choice也没有从Button扩展:
http://web.mit.edu/java_v1.0.2/www/javadoc/java.awt.Choice.html#top
根据您的评论,this.setGraphics()在现代Java中既不存在于Java 1.0.2中也不存在。
从你的代码判断你应该用this.getGraphics()替换它。
获取Graphics处理程序的另一种方法是覆盖:
public void paint(Graphics g)
您可以在班级中覆盖此方法。