1

この件については以前にも多くのトピックがあったことを知っており、これを理解するために Google を広範囲に使用してきましたが、何をしても 1 つの JFrame に 2 つのパネルを表示することはできません。CardLayout を含む多くのことを試しましたが、うまくいかないようです。これは非常に簡単な解決策だと感じています..

目的は、ランダムな配置による 2 つのパネルの違いを確認することです。

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

ハロウィーン パネル.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);
 }
}

ハロウィンドライバー.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);
 }
}   
4

1 に答える 1

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

BorderLayout の CENTER に 2 つのパネルを追加しようとしています。これはできません。

試す:

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

違いを見るために。

これが望ましくない場合は、別のレイアウト マネージャーを試してください。Layout Managerに関する Swing チュートリアルを読んでください。

または、2 つのパネルを互いに (Z 軸上で) 積み重ねようとしている場合は、 を試してくださいOverlayLayout。これはチュートリアルではカバーされていないため、API を確認する必要があります。また、「上部」パネルを non-opaque() にして、下部パネルの上にペイントしないようにする必要があります。

于 2013-11-02T22:17:27.350 に答える