Java Swing-鼠标进入JFrame后组件消失
我是Java的初学者,我正在尝试制作一个空中曲棍球项目。为了做到这一点,我必须首先测试一下木槌和冰球是否接触。我已经创建了一个程序,允许我这样做。这是电路板的代码:Java Swing-鼠标进入JFrame后组件消失,java,swing,graphics,Java,Swing,Graphics,我是Java的初学者,我正在尝试制作一个空中曲棍球项目。为了做到这一点,我必须首先测试一下木槌和冰球是否接触。我已经创建了一个程序,允许我这样做。这是电路板的代码: package airhockey; import javax.swing.*; import java.awt.*; public class Board { static Mallet m; public static void main(String[] args) { JFrame
package airhockey;
import javax.swing.*;
import java.awt.*;
public class Board {
static Mallet m;
public static void main(String[] args)
{
JFrame f = new JFrame("Air Hockey");
JPanel j = new JPanel();
j.setPreferredSize(new Dimension(600,400));
f.add(j);
f.pack();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.setResizable(false);
f.setLocationRelativeTo(null);
m = new Mallet();
Puck p = new Puck();
f.add(m);
j.addMouseMotionListener(m);
f.add(p);
p.t.start();
}
}
对于木槌:
package airhockey;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Mallet extends JPanel implements MouseMotionListener {
int x = 300;
int y = 200;
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.RED);
g.fillOval(x-30, y-30, 60, 60);
}
@Override
public void mouseDragged(MouseEvent e) {}
@Override
public void mouseMoved(MouseEvent e)
{
if(e.getX() >= 570) x = 570;
else if(e.getX() <= 30) x = 30;
else x = e.getX();
if(e.getY() >= 370) y = 370;
else if(e.getY() <= 30) y = 30;
else y = e.getY();
repaint();
}
}
package曲棍球;
导入javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
公共类Mallet扩展JPanel实现MouseMotionListener{
int x=300;
int y=200;
公共组件(图形g)
{
超级组件(g);
g、 setColor(Color.RED);
g、 椭圆形(x-30,y-30,60,60);
}
@凌驾
公共无效mouseDragged(MouseEvent e){}
@凌驾
public void mouseMoved(MouseEvent e)
{
如果(e.getX()>=570)x=570;
如果(e.getX()=370)y=370;
否则,如果(e.getY()将两个组件添加到JFrame的contentPane(默认情况下使用BorderLayout的容器)中,因此一个组件覆盖另一个组件。我建议您更改程序结构,只使用一个JPanel来完成所有绘制,并将gui精灵设为逻辑和非gui组件类的结构ng Puck和Mallot类不会扩展JPanel,但会有一个public void draw(图g)
方法,绘制JPanel将在其paintComponent方法中调用该方法。您可以将两个组件添加到JFrame的contentPane中,这是一个默认使用BorderLayout的容器,因此一个组件覆盖另一个组件。我建议您更改程序结构,只使用一个JPanel来完成所有绘制,并且你让你的gui精灵被构造成逻辑和非gui组件类。这意味着Puck和Mallot类不会扩展JPanel,而是会有一个public void draw(图g)
绘画JPanel将在其paintComponent方法中调用的方法。谢谢。我创建了一个名为Panel的新类,用于绘制两个组件。该程序现在完全按照我的要求运行。谢谢。我创建了一个名为Panel的新类,用于绘制两个组件。该程序现在完全按照我的要求运行。
package airhockey;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Puck extends JPanel implements ActionListener{
int x = 300;
int y = 200;
int v = 0;
int h = 0;
Timer t = new Timer(20,this);
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillOval(x-20, y-20, 40, 40);
}
@Override
public void actionPerformed(ActionEvent e)
{
if(Math.pow((x-Board.m.x)+(y-Board.m.y),2) <= 50) System.out.println("Touching");
}
}