2016-02-20 3 views
1

Я новичок в Java, и я пытаюсь сделать программу воздушного хоккея. Чтобы это сделать, я должен сначала проверить, тронут ли молоток и шайба. Я создал программу, которая позволяет мне это делать. Вот код для Совета:
Java Swing - компонент исчезает после того, как мышь вводит 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(); 
    } 
} 

и для Puck:

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

Когда я запускаю программу, Шайба появляется в середина, но Малле нет. Однако, когда мышь входит в Совет, шайба исчезает и появляется Mallet. Тем не менее, консоль говорит «Прикосновение», когда Маллет приближается к месту, где находился Пак. Почему шайба исчезает, когда мышь входит в доску, и как я могу снова открыть Puck?

ответ

4

Добавление двух компонентов в контентную панель JFrame, контейнер, который использует BorderLayout по умолчанию, и поэтому один компонент охватывает другой. Я рекомендую вам изменить структуру вашей программы, чтобы у вас была всего одна JPanel, чтобы сделать всю картину, и что вы создаете свои gui sprites как логические и не-gui-компоненты. Значение классов Puck и Mallot не будет расширять JPanel, но будет иметь метод public void draw(Graphics g), который будет рисовать JPanel в рамках метода paintComponent.

+0

спасибо. Я создал новый класс под названием Panel, который рисует оба компонента. Теперь программа работает точно так, как я этого хотел. –

Смежные вопросы