2013-11-02 4 views
1

Я знаю, что раньше было много тем по этому вопросу, и я широко использовал Google, чтобы понять это, но что бы я ни делал, я не могу получить две панели для отображения в одном JFrame. Я пробовал много вещей, включая CardLayout, но это, похоже, не сработало. У меня такое ощущение, что это очень простое решение.Две панели в одном JFrame

Цель состоит в том, чтобы увидеть разницу между двумя панелями из-за случайного позиционирования.

Вот некоторые из файлов Java (только соответствующего кода - есть также Snowman.java, но это только дает рисунок для снеговиков, подобных ghost.java):

Ghost.java

import java.awt.*; 

public class Ghost 
{ 
private int x, y; 
private String name; 
private boolean happy; 
private Color color; 

public Ghost (Color shade, int upperX, int upperY, String a, boolean b) 
{ 
    color = shade; 
    x = upperX; 
    y = upperY; 
    name = a; 
    happy = b; 
} 

public void draw (Graphics page) 
{ 
    page.setColor(color); 
    page.fillOval (x, y, 50, 125); 
    page.fillRect (x+1, y+60, 49, 75); // body of ghost 

    page.setColor(Color.black); 
    page.fillOval (x+12, y+10, 8, 8); 
    page.fillOval (x+32, y+10, 8, 8); // eyes 

    page.setColor(Color.white); 
    page.drawString(name, x+8, y-5); // name 

    page.setColor(Color.black); 
    if (happy == true) 
    page.fillArc (x+10, y+30, 33, 10, 180, 180); 
    else 
    page.fillArc (x+10, y+30, 33, 10, 0, 180); // smile/frown 
}  

public void setColor (Color shade) 
{ 
    color = shade; 
} 

public void setX (int upperX) 
{ 
    x = upperX; 
} 

public void setY (int upperY) 
{ 
    y = upperY; 
} 

HalloweenPanel.java:

import javax.swing.*; 
import java.awt.*; 
import java.util.Random; 

public class HalloweenPanel extends JPanel 
{ 
private Ghost ghost1, ghost2, ghost3; 
private Snowman snowman1, snowman2; 

public HalloweenPanel() 
{ 
    setBackground (Color.black); 

    Random rand = new Random(); 
    int randomX = rand.nextInt(700)+50; 
    int randomY = rand.nextInt(400)+50; 
    boolean randomHappy = (Math.random() < 0.5); 
    boolean randomHappy2 = (Math.random() < 0.5); 

    ghost1 = new Ghost (Color.white, randomX, randomY, "Scary", randomHappy2); 
    ghost2 = new Ghost (Color.blue, randomX, 100, "Happy", true); 
    ghost3 = new Ghost (Color.yellow, 300, randomY, "Scared", randomHappy); 

    snowman1 = new Snowman (500, 50); 
    snowman2 = new Snowman (750, 100); 
    } 

    public void paintComponent (Graphics page) 
    { 
    Random rand = new Random(); 
    int randomX2 = rand.nextInt(900); 
    int randomY2 = rand.nextInt(500); 
    super.paintComponent(page); 
    ghost2.setX(randomX2); 
    ghost3.setY(randomY2); 
    ghost1.draw(page); 
    ghost2.draw(page); 
    ghost3.draw(page); 
    snowman1.draw(page); 
    snowman2.draw(page); 
} 
} 

HalloweenDriver.java:

import javax.swing.*; 
import java.awt.*; 

public class HalloweenDriver 
{ 
public static void main (String[] args) 
{ 
    JFrame frame = new JFrame ("Halloween - Winter is Coming.."); 
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 

    JPanel mainPanel = new JPanel(); 
    HalloweenPanel panel = new HalloweenPanel(); 
    HalloweenPanel panel2 = new HalloweenPanel(); 

    mainPanel.setLayout(new GridLayout(1,0)); 

    mainPanel.add(panel); 
    mainPanel.add(panel2); 

    frame.add(mainPanel); 

    frame.pack(); 
    frame.setVisible(true); 
} 
} 
+0

Не забудьте вызвать super.paintComponent и вместо использования setPreferredSize вы должны рассмотреть возможность переопределения метода getPreferredSize вместо – MadProgrammer

ответ

4
frame.getContentPane().add(panel); 
frame.getContentPane().add(panel2); 

Вы пытаетесь добавить две панели в ЦЕНТР BorderLayout. Это невозможно.

Try:

frame.getContentPane().add(panel, BorderLayout.CENTER); 
frame.getContentPane().add(panel2, BorderLayout.SOUTH); 

, чтобы увидеть разницу.

Если это не то, что вы хотите, попробуйте другой менеджер компоновки. Прочтите учебник Swing по телефону Layout Managers.

Или, если вы пытаетесь уложить две панели друг над другом (по оси Z), попробуйте OverlayLayout. Это не рассматривается в учебнике, поэтому вам нужно будет взглянуть на API. Вам также необходимо сделать «верхнюю» панель непрозрачной(), чтобы она не рисовала поверх нижней панели.

+0

Спасибо за комментарий. Я попытался добавить borderlayouts, и оба они теперь отображаются. Тем не менее, верхняя часть имеет намного меньше места, чем нижняя панель, поэтому некоторые объекты не отображаются должным образом. Как я могу заставить обе панели иметь одинаковый размер? Я заглянул в OverlayLayout и попытался создать для этого новый контейнер, но он как бы объединил их. Я очень новичок в java и участвую в этом, поэтому, пожалуйста, простите меня. Еще раз спасибо! –

+0

Хорошо, +1 для вас. Спасибо за урок! :) – slackmart

+1

Прочтите учебник о том, как работает BorderLayout. Размер экрана, вероятно, недостаточно большой, чтобы отображать оба компонента, поэтому SOUTH получает свой предпочтительный размер, и CENTER получает то, что осталось. Если вы хотите, чтобы они были одинакового размера, используйте «GridLayout». Опять же, учебник - ваш друг. «Я очень новичок в java, и я участвую в этом», поэтому я дал вам ссылку на учебник. Вам нужно потратить время, чтобы прочитать его, чтобы понять основы Swing. – camickr

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