【问题标题】:How to add multiple classes to a single JFrame?如何将多个类添加到单个 JFrame?
【发布时间】:2015-02-03 03:17:59
【问题描述】:

所以我尝试使用 JPanel 'panel' 向我的 JFrame 'frame' 添加多个类,但它似乎没有任何效果。这是我的主要课程:

import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Frame
{
    public static void main (String[] args)
    {
        JPanel panel = new JPanel();
        panel.setBackground (Color.WHITE);
        panel.add (new Player()); // Class with paintComponent method.
        panel.add (new Terrain()); // Class with paintComponent method.

        JFrame frame = new JFrame ("Java Game");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setSize (1000, 600);
        frame.getContentPane().add (panel);
        frame.setVisible (true);
    }
}

当我运行程序时,JFrame 以白色背景显示,但没有调用来自 Player 和 Terrain 类的 paintComponent 方法,因此没有渲染任何其他内容。这段代码有什么问题吗?谢谢。

编辑:这是我的 Player 和 Terrain 类:

玩家:

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;

@SuppressWarnings ("serial")
public class Player extends JComponent
{
    int x = 50;
    int y = 450;

    public void paintComponent (Graphics graphics)
    {
        graphics.setColor (Color.BLACK);
        graphics.fillRect (x, y, 50, 50);
    }
}

地形:

import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JComponent;

@SuppressWarnings ("serial")
public class Terrain extends JComponent
{
    Player playerClass = new Player();

    public void paintComponent (Graphics graphics)
    {
        graphics.setColor (Color.GREEN);
        graphics.fillRect (0, 500, 1000, 500);
    }
}

【问题讨论】:

  • 考虑提供一个runnable example 来证明您的问题。这将导致更少的混乱和更好的响应
  • 您可能正在使用长时间运行或阻塞的代码阻塞事件调度线程;您可能没有覆盖PlayerTerrian 类的getPreferredSize,导致它们以0x0 的默认大小布置;你不能打电话给super.paintComponent,导致各种奇怪的绘画问题;要我继续猜吗?

标签: java swing jframe jpanel paintcomponent


【解决方案1】:
  1. 您未能覆盖getPreferredSize 中的PlayerTerrain,导致它们以默认大小0x0 布局
  2. 您没有调用super.paintComponent 已经破坏了绘制链,这可能会导致绘制问题和伪影无休止
  3. TerrainPlayer的引用与屏幕上的引用无关

查看Laying Out Components Within a ContainerPainting in AWT and SwingPerforming Custom Painting 了解更多详情

【讨论】:

  • Player in Terrain 的引用实际上是我之前工作的一个工件。 :P
  • 感谢您的信息(再次)。我添加了 super.paintComponent 并覆盖了 getPreferedSize 以匹配我在 Player 和 Terrain 中的窗口大小。但现在只有我在 Frame.java 中添加到 JPanel 的第一个类(在本例中为 Player)被渲染。
  • 是的,通常使用 FlowLayout,它们会被并排添加(尝试在框架上调用 pack 而不是 setSize),而是尝试将玩家添加到地形中。顺便说一句,我通常会避免基于组件的实体,而是设计一个概念,如果某些东西是可绘制的,并将它们全部绘制在一个组件中
  • 这就是我最终所做的,是的。或类似的东西。我希望。
猜你喜欢
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2011-09-13
  • 2013-12-12
  • 1970-01-01
相关资源
最近更新 更多