2015-02-03 5 views
0

Итак, я пытаюсь добавить несколько классов в «фрейм» JFrame с помощью панели JPanel, но это, похоже, не имеет никакого эффекта. Вот мой основной класс:Как добавить несколько классов в один JFrame?

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

Когда я запускаю программу, фрейм появляется с белым фоном, но методы paintComponent от игрока и классов Terrain не называют, так что ничего не визуализируется. Что-то не так с этим кодом? Благодарю.

Edit: Вот мои игрока и Рельефный классы:

игрока:

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); 
    } 
} 
+1

Рассмотрите возможность использования [runnable example] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это приведет к меньшему путанице и лучшим ответам. – MadProgrammer

+1

Вы можете блокировать поток событий Dispatching с длинным ходом или кодом блокировки; Возможно, у вас не было переопределенного 'getPreferredSize' классов' Player' или 'Terrian', заставляя их выкладываться с размером по умолчанию' 0x0'; Вы не могли бы называть 'super.paintComponent', вызывать всевозможные странные проблемы с живописью; Хочешь, я продолжу гадать? – MadProgrammer

ответ

2
  1. Вы не смогли перекрыть getPreferredSize из Player и Terrain, заставляя их раскладываться по умолчанию по умолчанию: 0x0
  2. Вы нарушили лакокрасочное цепь, не вызывая super.paintComponent, который не может привести ни конца вопросов живописи и артефактов
  3. Отнесение Player в Terrain не имеет ничего общего со ссылкой на экране

Взгляните на Laying Out Components Within a Container, Painting in AWT and Swing и Performing Custom Painting для получения более подробной информации.

+0

Ссылка на Player in Terrain на самом деле является артефактом того, над чем я работал раньше. : P – AmiableNebula

+0

Спасибо за информацию (снова). Я добавил super.paintComponent и переопределяю getPrefferedSize, чтобы соответствовать размеру моего окна как в Player, так и в Terrain. Но теперь только первый класс, который я добавил в мой JPanel в Frame.java (в данном случае это был бы Player), был рендер. – AmiableNebula

+0

Да, обычно с FlowLayout, они добавляются бок о бок (попробуйте вызвать пакет на фрейме вместо setSize), вместо этого попробуйте добавить игрока в рельеф. Кстати, я обычно избегал основанных на компонентах сущностей и вместо этого разрабатывал концепцию, если что-то, что можно покрасить, и нарисовать все в одном компоненте. – MadProgrammer