制作一个游戏,单击一个圆圈并出现一个新圆圈,但无法弄清楚如何使圆圈成为按钮



我对 JAVA 很陌生,仍在学习,无法弄清楚如何制作我的按钮 iCirclePosX 和 iCirclePosY 的位置并使其形状与圆形相同(按钮重新绘制圆圈(我很确定我必须使用 BorderLayout 以外的东西,但我不知道它是如何工作的,需要一些帮助。谢谢!

package stackover;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import static java.lang.Math.random;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
import so61997395.Board;
import so61997395.Circle;
import so61997395.Game;


/**
*
* @author 18086
*/
public class PaintFrame extends JFrame {
public static int iCircleSize() {
return (int)(Math.random() * 100 + 1);
}
public static int iCirclePosX() {
return (int)(Math.random() * 750 + 1);
}
public static int iCirclePosY() {
return (int)(Math.random() * 750 + 1);
}
private JPanel content = new JPanel();
private JButton drawButton = new JButton("Draw");
private PaintPanel paintPanel = new PaintPanel();
public PaintFrame() {
getContentPane().add(content);
content.setLayout(new BorderLayout());
drawButton.setSize(100, 500);
drawButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// drawButton is fired, repaint the paintPanel
paintPanel.repaint();
}
});
content.add(drawButton, BorderLayout.WEST);
content.add(paintPanel, BorderLayout.CENTER);
}
public static void main(String[] args) {
new PaintFrame().start();
}
public void start() {
int iSize = iCircleSize();
PaintPanel board = new PaintPanel();
board.add(new Circle(iCirclePosX(), iCirclePosY(), new 
Dimension(iSize+100, iSize+100)));
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(800, 800);
frame.setContentPane(board);
frame.setVisible(true);
}
}

class PaintPanel extends JPanel {
PaintPanel() {
super(null);
}
public void PaintPanel() {
setSize(750, 750);
setBackground(Color.PINK);
}
}   
class Circle extends JComponent {
Circle(int x, int y, Dimension size) {
setBounds(new Rectangle(new Point(x, y), size));
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
paintPanel.repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.YELLOW); 
// draw 5 random circles 
int count = 1;
PaintPanel repaintPanel = new PaintPanel();
for (int i = 0; i < count; i++) {
g.fillOval(0, 0, getWidth(), getHeight());
}
}
}

有一个可点击的圆圈

一种可能性是创建一个Jbutton的子类并重写paint方法来绘制圆。但这将导致许多其他问题。

另一个方法是维护所有绘制圆圈的集合,并监听鼠标在容器面板上的单击,以查看鼠标是否被单击在按钮上。

然而,另一个解决方案(我将选择的解决方案(是创建一个自定义组件来绘制圆圈并侦听鼠标单击。

定位圆圈

最好的布局将是null.使用null布局,您有一个绝对布局,其中组件根据其边界进行定位 https://docs.oracle.com/javase/tutorial/uiswing/layout/none.html:


编辑;添加示例代码

package so61997395;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class Game {
public static void main(String[] args) {
new Game().start();
}
public void start() {
Board board = new Board();
board.add(new Circle(150, 80, new Dimension(30, 30)));
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setContentPane(board);
frame.setVisible(true);
}
}
class Board extends JPanel {
Board() {
super(null);
}
}
class Circle extends JComponent {
Circle(int x, int y, Dimension size) {
setBounds(new Rectangle(new Point(x, y), size));
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
move();
}
});
}
private void move() {
Container board = SwingUtilities.getAncestorOfClass(JPanel.class, this);
setLocation(new Point(
ThreadLocalRandom.current().nextInt(board.getWidth()),
ThreadLocalRandom.current().nextInt(board.getHeight())
));
}
@Override
protected void paintComponent(Graphics g) {
g.setColor(Color.RED);
g.fillOval(0, 0, getWidth(), getHeight());
}
}

相关内容

最新更新