java jpanel 位置_java-是否有更好的方法来设置JPanel图形的初始位置?)

本文讨论了如何在Java Swing中将JPanel上的图形初始化为居中,并允许用户通过鼠标拖动移动。作者分享了一个解决方案,即在`paintComponent`方法中使用一个计数器来设置初始位置,并询问是否存在更简洁的方法。示例代码展示了如何处理颜色更改、大小调整和鼠标事件。
摘要由CSDN通过智能技术生成

在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值