在Liang的Java编程简介(第7版)的第15章中,他介绍了一个程序,该程序可以在JPanel上制作一个(2-D)球,并在单击“放大/缩小”按钮时对其进行放大.我已经修改了程序,使其也可以:1)如果用户单击/选项单击,则放大/缩小球; 2)允许您通过按按钮选择球的颜色; 3)允许移动圆用鼠标拖动它.
最后的修改是给我一段时间带来麻烦的,因为我想在开始时将球居中,但随后允许用户用鼠标来移动球.我想出的解决方案是让paintComponent方法仅在第一次绘制时相对于getWidth()和getHeight()设置球的x和y坐标.为此,我在BallCanvas类中添加了一个paintCount变量,并创建了一个if语句,使其仅在第一次执行.当我最初试图弄清楚该怎么做时,我看到了其他解决方案,例如此处给出的解决方案:Why can’t I access my panel’s getWidth() and getHeight() functions?,但我发现我的解决方案要简单得多.
所以问题是:我认为编码风格不好吗?专业的程序员会嘲笑这种解决方案吗?还是可以吗?
更重要的是,是否有一种更好的(但也相对简单)的方法可以完成,而又不需要设置计数器?
以下是相关的代码位:
BallCanvas的开始:
public static class BallCanvas extends JPanel {
private int radius = 20;
private Color color = Color.BLACK;
private int ballX;
private int ballY;
private int paintCount = 0;
...
move方法(响应MouseDragged事件):
public void move(MouseEvent e){
ballX = e.getX() - radius;
ballY = e.getY() - radius;
repaint();
}
paintComponent方法:
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(color);
if(paintCount < 1){
ballX = getWidth()/2 - radius;
ballY = getHeight()/2 - radius;
}
g.fillOval(ballX, ballY, 2*radius, 2*radius);
paintCount++;
}
完整程序:
// Reference: Liang's Intro to Java Programming
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ControlBall extends JFrame{
private JButton jbtRed = new JButton("Red");
private JButton jbtGreen = new JButton("Green");
private JButton jbtBlue = new JButton("Blue");
private JButton jbtBlack = new JButton("Black");
private BallCanvas canvas = new BallCanvas();
private JMenuBar menuBar = new JMenuBar();
private JMenu menu = new JMenu("Edit");
private JMenuItem miEnlarge = new JMenuItem("Enlarge");
private JMenuItem miShrink = new JMenuItem("Shrink");
public ControlB