1

わかりましたので、8ビットキメラと呼ばれるJavaでこのゲームに取り組んでいます。現在、メイン メニューに取り組んでいますが、カード レイアウトを使用しているときに、何らかの理由でウィンドウが開きません。ここにいくつかのコードがあります。

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

public class MainScreen extends JFrame{

String Title = "MainMenu";
MainMenuComp MMC = new MainMenuComp();
BreedingGround BGR = new BreedingGround();

public MainScreen() {

    setTitle("8-bit Chimera "+Title);
    setSize(800,600);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    add(MMC);
    add(BGR);

}

public static void main(String[] args){

    new MainScreen();
    }
}

それがメインウィンドウでした

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

public class MainMenuComp extends JPanel implements ActionListener{

BreedingGround BGR = new BreedingGround();
ImageData ID = new ImageData();
Image TitleBg;
Image Title;
CardLayout CL;
JButton Play;

public MainMenuComp() {

setLayout(new GridBagLayout());
GridBagConstraints GBC = new GridBagConstraints();
ImageIcon TitleData = new ImageIcon(ID.TitleSource);
ImageIcon TitleBackGroundData = new ImageIcon(ID.TitleBackGroundSource);
ImageIcon PlayData = new ImageIcon(ID.PlaySource);
TitleBg = TitleBackGroundData.getImage();
Title = TitleData.getImage();
Play = new JButton();
Play.setIcon(PlayData);
add(Play,GBC);
add(BGR,"Breed");
}

public void actionPerformed(ActionEvent AE){

    if(AE.getSource() == Play){

        CL.show(this, "Breed");
        }
    }

public void paintComponent(Graphics g){

    g.drawImage(TitleBg,0,0,800,600,this);
    g.drawImage(Title,250,80,280,140,this);
    }
}

これがカードレイアウトでした

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

public class BreedingGround extends JPanel{

ImageData ID = new ImageData();
Image Swamp;
CardLayout CL;

public BreedingGround(){

    setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    ImageIcon SwampData = new ImageIcon(ID.SwampSource);
    Swamp = SwampData.getImage();
}

public void paintComponent(Graphics g){

    g.drawImage(Swamp,0,0,800,600,this);
    }

}

それが私がCardLayoutを開いて欲しかったものでした。問題は、実行しようとするとウィンドウが実行されず、コンパイラに表示され続けることです。

--------------------構成: 8 ビット Chimera - JDK バージョン 1.6.0_26 - ----------------- ---

Exception in thread "main" java.lang.IllegalArgumentException: cannot add to layout: constraints must be a GridBagConstraint
    at java.awt.GridBagLayout.addLayoutComponent(GridBagLayout.java:685)
    at java.awt.Container.addImpl(Container.java:1074)
    at java.awt.Container.add(Container.java:927)
    at MainMenuComp.<init>(MainMenuComp.java:26)
    at MainScreen.<init>(MainScreen.java:7)
    at MainScreen.main(MainScreen.java:23)

プロセスが完了しました。

私が本当に知りたいのは、これが何を言っているのかということだけです。

4

2 に答える 2

4

コンテナのレイアウトを CardLayout に設定した場所は見当たりません。レイアウトをこれに設定しないと、魔法のように使用できません。CardLayoutのチュートリアルをまだ読んでいない場合は、ここですべて説明されているので、試してみることを検討してください。


Alexander Kim からの1 コメントを編集:

cardbagLayout を追加すると、画像が読み込まれず、ボタンのサイズが画面全体に表示されます。グリッドも外しました

レイアウトをネストするには、JPanel をネストする必要があります。単一の JPanel を CardLayout コンテナーとして使用します。その単一の機能は、他の JPanel (「カード」) を表示することです。これらの他の JPanel は、JButton や「グリッド」(それらが何であれ) など、保持するコンポーネントを適切に表示するために必要なレイアウトを使用します。また、これらの JPanel でさえ、他のレイアウトを使用する他の JPanel を保持する場合があります。

繰り返しますが、レイアウトのチュートリアルをよく読んでください。これを行うことを後悔することはありません。

編集 2
CardLayout を使用する非常に単純な例を次に示します。JPanel を使用して CardLayout によって表示されるコンポーネント (cardContainer と呼ばれる) は、コンボボックスで選択されたアイテムに応じて変更されます。

CardLayout とそれを使用する JPanel は次のとおりです。

private CardLayout cardLayout = new CardLayout();

   // *** JPanel to hold the "cards" and to use the CardLayout:
   private JPanel cardContainer = new JPanel(cardLayout); 

次に、JPanel を使用して cardlayout にコンポーネントを追加する方法を示します。

  JPanel redPanel = new JPanel();
  //...
  String red = "Red Panel";
  cardContainer.add(redPanel, red); // add the JPanel to the container with the String

また、String を JComboBox に追加して、後でこのコンボ ボックスを使用して、ユーザーが同じ JComboBox で項目「Red」を選択した場合に、この JPanel (redPanel) を表示するよう CardLayout に指示できるようにします。

  cardCombo.addItem(red); // also add the String to the JComboBox

JPanel を使用して cardlayout に表示される項目を変更できる JComboBox の ActionListener を次に示します。

  cardCombo.addActionListener(new ActionListener() {

     public void actionPerformed(ActionEvent e) {
        String item = cardCombo.getSelectedItem().toString();

        // *** if combo box changes it tells the CardLayout to
        // *** swap views based on the item selected in the combo box:
        cardLayout.show(cardContainer, item);
     }
  });

そして、ここにシバン全体があります:

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

public class SimpleCardLayoutDemo {
   private CardLayout cardLayout = new CardLayout();

   // *** JPanel to hold the "cards" and to use the CardLayout:
   private JPanel cardContainer = new JPanel(cardLayout); 
   private JComboBox cardCombo = new JComboBox();
   private JPanel comboPanel = new JPanel();;

   public SimpleCardLayoutDemo() {
      JPanel greenPanel = new JPanel(new BorderLayout());
      greenPanel.setBackground(Color.green);
      greenPanel.add(new JScrollPane(new JTextArea(10, 25)), BorderLayout.CENTER);
      greenPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
      greenPanel.add(new JButton("Bottom Button"), BorderLayout.PAGE_END);
      String green = "Green Panel";
      cardContainer.add(greenPanel, green);
      cardCombo.addItem(green);

      JPanel redPanel = new JPanel();
      redPanel.setBackground(Color.red);
      redPanel.add(new JButton("Foo"));
      redPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
      String red = "Red Panel";
      cardContainer.add(redPanel, red);
      cardCombo.addItem(red);

      JPanel bluePanel = new JPanel();
      bluePanel.setBackground(Color.blue);
      JLabel label = new JLabel("Blue Panel", SwingConstants.CENTER);
      label.setForeground(Color.white);
      label.setFont(label.getFont().deriveFont(Font.BOLD, 32f));
      bluePanel.add(label);
      String blue = "Blue Panel";
      cardContainer.add(bluePanel, blue);
      cardCombo.addItem(blue);

      comboPanel.add(cardCombo);
      cardCombo.addActionListener(new ActionListener() {

         public void actionPerformed(ActionEvent e) {
            String item = cardCombo.getSelectedItem().toString();

            // *** if combo box changes it tells the CardLayout to
            // *** swap views based on the item selected in the combo box:
            cardLayout.show(cardContainer, item);
         }
      });
   }

   public JPanel getCardContainerPanel() {
      return cardContainer;
   }


   public Component getComboPanel() {
      return comboPanel ;
   }

   private static void createAndShowUI() {
      SimpleCardLayoutDemo simplecardDemo = new SimpleCardLayoutDemo();

      JFrame frame = new JFrame("Simple CardLayout Demo");
      frame.getContentPane().add(simplecardDemo.getCardContainerPanel(), BorderLayout.CENTER);
      frame.getContentPane().add(simplecardDemo.getComboPanel(), BorderLayout.PAGE_END);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   // to run Swing in a thread-safe way
   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}
于 2011-07-31T23:53:41.500 に答える
0

あなたの問題はadd(BGR,"Breed");. のレイアウトは MainMenuCompであるGridBagLayoutため、制約はGridBagConstraintではなく でなければなりませんString("Breed"制約として持っています)。

于 2011-07-31T23:51:23.370 に答える