Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing-鼠标进入JFrame后组件消失_Java_Swing_Graphics - Fatal编程技术网

Java Swing-鼠标进入JFrame后组件消失

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

我是Java的初学者,我正在尝试制作一个空中曲棍球项目。为了做到这一点,我必须首先测试一下木槌和冰球是否接触。我已经创建了一个程序,允许我这样做。这是电路板的代码:

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");
    }
}