【问题标题】:Java Trying to add 2 objects in a JFrame but only 1 is showingJava 试图在 JFrame 中添加 2 个对象,但只显示 1 个
【发布时间】:2014-11-20 08:09:39
【问题描述】:

我正在尝试制作一个对象试图追逐另一个对象的游戏。但是在 JFrame 中只显示了 1 个对象。你能帮帮我吗?

主类:

package catchbutterfly;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import java.util.Random;


public class CatchButterFly extends JPanel implements ActionListener, KeyListener {

    Timer tm = new Timer(5, this);
    Random generator = new Random();
    int x = 400, y = 800, velX = 0, velY = 0;
    public static void main(String[] args) {

        JFrame frame = new JFrame("Catch The ButterFly");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int width = (int) screenSize.getWidth();
        int height = (int) screenSize.getHeight();
        frame.setSize(width, height);
        frame.setVisible(true);
        JPanel panel = new JPanel();
        Graphics g = panel.getGraphics();
        Catcher t = new Catcher();
        Butterfly fly = new Butterfly();
        frame.add(t);
        frame.add(fly);


    }
    public void actionPerformed(ActionEvent e) {
    }
    public void keyTyped(KeyEvent e) {
    }
    public void keyPressed(KeyEvent e) {

    }
    public void keyReleased(KeyEvent e) {
    }
}

随着键盘输入移动的椭圆类:

package catchbutterfly;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import java.util.Random;

public class Catcher extends JPanel implements ActionListener, KeyListener{  
    Timer tm = new Timer(5, this);
    Random generator = new Random();
    int x = 400, y = 800, velX = 0, velY = 0;
    public Catcher(){
        tm.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        System.out.println("obje catcher olustu");
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.fillOval(x, y, 50, 50);
        tm.start();
    }
    public void actionPerformed(ActionEvent e) {
        if(x < 0){
            velX = 0;
            x = 0;
        }
        if(x > 1366 - 50){
            velX = 0;
            x = 1366 - 50;
        }
        if(y < 0){
            velY = 0;
            y = 0;
        }
        if(y > 670){
            velY = 0;
            y = 0;
        }
        x = x + velX;
        y = y + velY;
        repaint();
    }
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if(code == KeyEvent.VK_LEFT){
            velX = -4;
            velY = 0;
        }
        if(code == KeyEvent.VK_UP){
            velX = 0;
            velY = -4;
        }
        if(code == KeyEvent.VK_RIGHT){
            velX = 4;
            velY= 0;
        }
        if(code == KeyEvent.VK_DOWN){
            velX = 0;
            velY = 4;
        }
    }
    public void keyTyped(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    public void keyReleased(KeyEvent e) {
        velX = 0;
        velY = 0;
    }
}

移动 x += 4 的正方形类(未显示):

package catchbutterfly;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.JPanel;
import javax.swing.Timer;


public class Butterfly extends JPanel implements ActionListener, KeyListener {
    Timer tm = new Timer(5, this);
    int x = 800, y = 500, velX = 4, velY = 4;

    public Butterfly(){
        tm.start();
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillOval(x, y, 50, 50);
        tm.start();
    }
    public void actionPerformed(ActionEvent e) {
        if(x < 0 || x > 1366 - 50){
            velX = -velX;
        }
        if(y < 0 || y > 670){
            velY = -velY;
        }
        x = x + velX;
        y = y + velY;
    }
    public void keyTyped(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    public void keyPressed(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    public void keyReleased(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}

【问题讨论】:

  • frame.add(t); ---> JFrame 有 BorderLayout,请参阅 Oracle trail about Layout manager in AWT/Swing,
  • Swing JComponents 中不要使用 NullLayout 和 KeyListener
  • mKorbel 我真的是Java 初学者,我不明白你在说什么。你能再解释一下吗?
  • BorderLayout 有第 5 个区域,您可以只将一个 JComponent 放在其中一个区域(实际上您使用 CENTER == frame.add(t); ),必须使用另一个区域(不在 BOrderLayout 中按比例调整大小)或另一个 LayoutManager
  • 您的蝴蝶和捕手是两个不同的 JPanel,因此如果您使用 add 方法添加两者而不指定任何布局或区域,它将转到 JFrame 的中心,并且只有您添加的 Jpanel 可见最后,第二件事,如果您使用两个 JPanel,如何捕捉蝴蝶,您只需要一个 Jpanel 即可使游戏正常运行。

标签: java swing object graphics jframe


【解决方案1】:

正如Muhammadsage88 已经指出的那样,您的蝴蝶和捕手位于不同的面板中,因为它们的类继承自JPanel(扩展了JPanel)。您在 main 方法中创建了一个名为 panel 的面板,但该面板并未添加到您的框架中。

困难在于当两个面板都添加到框架时,只有一个是可见的:

    frame.add(t);
    frame.add(fly);

您可以通过用这个块替换前两行来检查这一点:

    t.setPreferredSize(new Dimension(width, height / 2));
    t.setBackground(Color.YELLOW);
    fly.setPreferredSize(new Dimension(width, height / 2));
    fly.setBackground(Color.ORANGE);
    frame.getContentPane().setLayout(new FlowLayout());
    frame.getContentPane().add(t);
    frame.getContentPane().add(fly);

这只是有助于澄清问题,但不能解决问题。两个面板都调整大小以共享框架高度的一半并获得背景颜色。布局管理器(控制组件如何在容器中显示的对象)设置为流式布局,并且 t 和 fly 都添加到框架的内容窗格中。

如前所述,我会将代码更改为有一个单独的面板来绘制蝴蝶和捕手。

编辑 - 一个简单的单个面板可能如下所示:

public class MainPanel extends JPanel {
    private Butterfly butterfly;
    private Catcher catcher;

    public MainPanel(final Butterfly butterfly, final Catcher catcher) {
        this.butterfly = butterfly;
        this.catcher = catcher;
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillOval(butterfly.x, butterfly.y, 50, 50);
        g.setColor(Color.RED);
        g.fillOval(catcher.x, catcher.y, 50, 50);
    }
}

您可以在 CatchButterFly.main 方法中创建一个 MainPanel 对象(传入蝴蝶和捕手对象)并将其添加到那里的框架中。

【讨论】:

  • Bruijn 感谢您的澄清。我明白你所说的,但问题是我不知道如何创建 1 个面板在其中添加两个对象,因为当我删除捕手和蝴蝶中的两个面板时,代码不起作用
  • @MertKarakas 我添加了一个简单的示例,说明带有蝴蝶和捕手绘制代码的单个面板的外观。
  • 我试过但没有用。感谢您的建议。我正在尝试一些关于 JPanels 和 Graphics 的教程。希望我能解决它。
猜你喜欢
  • 2021-07-30
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2020-01-15
相关资源
最近更新 更多