java - 如何将多个组件添加到 JFrame

标签 java swing graphics

我正在尝试使用多个显示敌人(红色圆圈)、玩家(橙色菱形)和基地(轮廓黑色矩形)的 JPanel 向我的 JFrame“框架”添加多个类,但它们显示不正确.我有四个类,“Assignment6”(任务名称和我的主要任务)、“Enemy”(创建敌人的类)、“Player”(创建和移动玩家的类)和“Base”(创建敌人无法进入的基地的类)。我还没有在“基地”中制作敌人接触碰撞的方法。

作业 6:

import javax.swing.*;
import java.awt.Color;
import java.awt.FlowLayout;
public class Assignment6 extends JFrame {
    public static void main(String[] args){
        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
        JPanel panel3 = new JPanel();
        panel1.add(new Base());
        panel2.add(new Enemy());
        panel3.add(new Player());
        JFrame frame = new JFrame("Assignment 6");
        frame.setLayout(new FlowLayout());
        frame.setBackground(Color.WHITE);
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setSize (1000, 1000);
        frame.getContentPane().add(panel1);
        frame.getContentPane().add(panel2);
        frame.getContentPane().add(panel3);
        frame.setVisible (true);
   }
}

敌人:

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.*;
public class Enemy extends JComponent {
    public Enemy(){
        setPreferredSize(new Dimension(100, 100));
    }
    public int createEnemyX(){
        int enemyX = (int)(100 * Math.random());
        return enemyX;
    }
    public int createEnemyY(){
        int enemyY = (int)(100 * Math.random());
        return enemyY;
    }
    @Override
    public void paintComponent(Graphics g){
       super.paintComponent(g);
       g.setColor(Color.RED);
       g.fillOval(createEnemyX(), createEnemyY(), 100, 100);
    }
}   

玩家:

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.*;
import javax.swing.*;
public class Player extends JComponent implements KeyListener{
    public int height = getHeight();
    public int width = getWidth();
    public int x = 500;
    public int y = 500;
    public Player(){
        setPreferredSize(new Dimension(100, 100));
        addKeyListener(this);
    }
    @Override
    public void paintComponent(Graphics g){
       super.paintComponent(g);
       Color orange = new Color(210, 105,30);
       g.setColor(orange);
       int[]x1 = {x-50, x, x+50, x};
       int[]y1 = {y, y-50, y, y+50};
       g.fillPolygon(x1, y1, 4);
    }
    @Override
    public void keyPressed(KeyEvent e){
        if (e.getKeyCode() == KeyEvent.VK_LEFT)
            x -= 10;
        else if (e.getKeyCode() == KeyEvent.VK_RIGHT)
            x += 10;
        else if (e.getKeyCode() == KeyEvent.VK_UP)
            y -= 10;
        else if (e.getKeyCode() == KeyEvent.VK_DOWN)
            y += 10;
        repaint();
    }
    @Override
    public void keyReleased(KeyEvent e){
        ;
    }
    @Override
    public void keyTyped(KeyEvent e){
        ;
    }
}

基地:

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.*;
public class Base extends JComponent {
    public Base(){
        setPreferredSize(new Dimension(200, 200));
    }
    @Override
    public void paintComponent(Graphics g){
       super.paintComponent(g);
       g.setColor(Color.BLACK);
       g.drawRect(400,400,200,200);

    }
}

一旦我运行项目,敌人(红色圆圈)就会出现但被白色矩形切断。我假设调用了 paintComponent 方法,但没有渲染它们。

我使用这个问题和答案作为我的代码的主要基础: How to add multiple classes to a single JFrame

最佳答案

您的整体程序设计看起来有误,需要重新设计,具体来说,我说的是让您的可绘制实体类、Base、Enemy 和 Player 都扩展 JComponent,因为这允许这些组件仅在它们的 JComponent 和它们的 JComponent 中绘制,而不在其他任何地方绘制。相反:

  • 让您的可绘制实体类(例如 Player、Base 和 Enemy)实现一个通用接口(interface)(例如 Drawable),该接口(interface)具有绘画方法(例如 draw(Graphics g))。
  • 不要让它们扩展 JComponent、JPanel 或任何其他 Swing 组件。
  • 而是为图形创建一个类,比如将其称为 DrawingPanel,并让它扩展 JPanel 或 JComponent。
  • 在此 DrawingPanel 的单个 paintComponent 方法中,绘制每个实体(如果它位于需要绘制的游戏部分内)。
  • 努力将 View 代码、GUI 代码与程序模型代码(控制逻辑实体行为和位置的代码)分开,最好将它们放在不同的类中,甚至可能是不同的包中。

关于问题:

I am currently trying to make Drawable interface, what should I put in the method?

接口(interface)在方法中不会有任何代码。任何实现该接口(interface)的类都需要具有允许该类的对象自行绘制的代码。

If I have the DrawingPanel class, would I even need the Drawable interface?

是的,因为 DrawingPanel 会保存您的 Drawable 对象的集合,并会在其 paintComponent 方法中绘制它们,如上所述。

关于java - 如何将多个组件添加到 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33488331/

相关文章:

java - 如何从 PDF 中提取书签?

python - pygame中有popMatrix、pushMatrix、Translate吗?

c - C 中的 OpenCV - 绘制一个应该只出现在图像上半部分的圆圈?

java - swing java app 和 iframe - 双向通信

java - 多个 Swingbuilder 实例?

c++ - 组合位图/图像列表 (Win32)

java - 在 Swing Java 中打印变量中的值

java - XPath、Java 和序列化 xml

java - Ant : Junit failure triggers a haltonfailure

java - WindowAdapter 调度窗口事件(关闭窗口)