2015-11-02 3 views
2

Я пытаюсь добавить несколько классов в «рамку» JFrame, используя несколько JPanels, показывающих врага (красный круг), игрока (оранжевый бриллиант) и базу (очерченный черный прямоугольник), но они отображаются неправильно. У меня есть четыре класса: «Assignment6» (название задания и моя основная), «Enemy» (класс для создания врагов), «Player» (класс для создания и перемещения игрока) и «Base» (класс, который создает базу, которую враги не могут ввести). Я еще не использовал метод «База» для контактного столкновения противника.Как добавить несколько компонентов в JFrame

Assignment6:

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

Enemy:

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

ответ

4

Ваш общий дизайн программы выглядит ошибочными и должны быть переделаны, и, в частности, я говорю о том, с вашими выделенными классами сущностей, Base, Enemy и Player, каждая из которых расширяется JComponent, поскольку это позволяет использовать эти компоненты внутри JComponent и их JComponent только и нигде. Вместо этого:

  • Сделайте ваши Drawable классы сущностей, таких как плеер, Base и Enemy реализовать общий интерфейс, скажем Drawable, что есть метод живописи, скажем draw(Graphics g).
  • Не используйте их JComponent, JPanel или любой другой компонент Swing.
  • Вместо этого создайте один класс для графики, скажем, назовите его DrawingPanel и расширьте его JPanel или JComponent.
  • В рамках единственного метода paintComponent этой DrawingPanel нарисуйте каждый объект, если он находится в пределах раздела игры, для которого требуется рисование.
  • Стремитесь отделить свой код вида, код GUI, от кода вашей модели программы, код, который управляет вашими поведениями и местоположениями логических сущностей, желательно иметь их в отдельных классах и, возможно, даже в отдельных пакетах.

Что касается вопросов:

В настоящее время я пытаюсь сделать Drawable интерфейс, что я должен положить в методе?

Интерфейс не будет содержать никакого кода внутри метода. Любые классы, реализующие интерфейс, должны иметь код, который позволяет объектам этого класса рисовать себя.

Если у меня есть класс DrawingPanel, нужен ли мне интерфейс Drawable?

Да, поскольку DrawingPanel будет содержать коллекцию ваших объектов, пригодных для рисования, и нарисовал бы их в своем методе paintComponent, как уже упоминалось выше.

+0

Благодарим за отзыв, я в настоящее время пытаюсь сделать Drawable интерфейс, что я должен положить в метод? Если у меня есть класс DrawingPanel, нужен ли мне интерфейс Drawable? –

+0

@MichaelMcGrath: см. Править для ответа. –

+0

Я знаю, что интерфейс не будет иметь никакого тела, так как это интерфейс. Как бы я сделал объект, который нарисовал бы себя? –

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