4

私はJava(およびプログラミング全般)に不慣れで、最初のプログラムを作成しようとしています。私は今、約5時間同じ問題に悩まされているので、助けを求めることにしました。

基本的にはボード上に約20ポジションのプログラム(2Dゲーム)を作ろうとしています。各位置は、青(player1が所有)、赤(player2が所有)、または黒(誰も所有していない)のいずれかです。

これについては、主にセットアップゲームを呼び出すメソッドを配置し、次にゲームをプレイするメソッドを配置します。私はセットアップゲームに取り組んでいます。基本的には、クラスのオブジェクトを作成しBackground(extends JPanel、overrides paintComponent())、クラスのオブジェクトを20個作成しますPosition(JPanelをextends、overrides paintComponent())。

これまでのところ、これらのPositionオブジェクトをBackgroundオブジェクトの上に配置することに固執しています。

私がする時:

Background background= new Background();
frame.getContentPane().add(background);
Position position1= new Position;
frame.getContentPane().add(position1);
frame.setVisible(true);

期待していたように、円のみが表示され、背景は表示されません。最初に位置を追加してから背景を追加すると、背景のみが表示され、円は表示されません。

とにかく、私はJavaに不慣れで、まだ自分の道を見つけるのに苦労していますが、解決策を探してみましたが、この問題に対するさまざまな解決策を見つけました(最初に背景に位置を追加する、次に、フレームに背景を追加するなど)が、それらのいずれも機能させることができませんでした。

両方をフレームに追加する方法が(おそらく)完全に間違っていることは承知していますが、そのように書いたので、(願わくば)私が書いたものが実際にそれぞれのコードを示していることを確認してくださいそれらのクラスのうち、画面に何かを描画します。

PS:変数名とメソッド名のほとんどが英語ではないため、ここにコードをコピーしなかったため、読みにくいですが、それでも必要だと思われる場合は、追加します。また、おそらくばかげた質問をしてすみませんが、ここで壁にぶつかってしまい、他に何を試すべきかわかりません。

4

5 に答える 5

2

基本的にはボード上に約20ポジションのプログラム(2Dゲーム)を作ろうとしています。各位置は、青(player1が所有)、赤(player2が所有)、または黒(誰も所有していない)のいずれかです。

  1. Swingでのペイントは、デフォルトでは返されません。getPreferedSize()をオーバーライドPreferredSizeするために必要です。

  2. JPanelFlowLayoutはAPIに実装されており、 PreferredSizeのみを受け入れるこのLayoutManagerは、このコンテナーに追加されたJComponentsからのものです。

  3. SSCCEを投稿するための変更後、短く、実行可能、コンパイル可能

于 2013-02-27T20:13:08.853 に答える
1
Background background= new Background();
frame.getContentPane().add(background);
Position position1= new Position;
frame.getContentPane().add(position1);

JFrameはデフォルトでBorderLayoutを使用します。また、デフォルトでは、BorderLayoutを使用するコンテナにコンポーネントを追加すると、コンポーネントがCENTERに追加されます。CENTERに追加できるコンポーネントは1つだけなので、PositionコンポーネントがBackgroundコンポーネントに置き換わります。

背景に位置を追加してから、フレームに背景を追加します。何かのようなもの:

Background background= new Background();
Position position1= new Position;
background.add(position1);
frame.add(background);

注:コンポーネントをフレームに追加するときにgetContentPane()を使用する必要はありません。

于 2013-02-27T20:41:53.590 に答える
0

ルートパネルは、その下にContainerクラスがあるJFrameである必要があります。someRoot.window.container = yourJPanelを呼び出すと、JPanelがJFrameのメインコンポーネントビューとして読み込まれます。JFrameは1つのJPanelのみを保持できますが、他のJPanelは他のJPanelを保持できることに注意してください。最初のJPanelをJFRamに追加するのと同じように、JPanel自身のコンテナーを別のJPanelにすることができます。お役に立てれば。

このような:

JPanel temp = new JPAnel();
frame.getContentPane().add(temp);
temp.getContentPane().add(new JPanel());

これらの追加の後、私を描いているコマンドがありますが、JFrameを呼び出してリアルタイムで更新します。私はそれが次のようなものだと思います:

frame.validate();  //thanks @SMT

か何か、

于 2013-02-27T20:12:29.193 に答える
0

次のようなものを使用してみてください

jPanelExampleName.validate();
jPanelExampleName.repaint();

JPanelsを追加した後。

于 2013-02-27T20:12:55.500 に答える
0

1つのJFrameを使用して、それにJPanelsをアタッチしたいようです。これが私が個人的に行う方法です。

JFrameとJPanelsを宣言します

JFrame frame1 = new JFrame( "App Name");
JPanel panel1 = new JPanel(); 
JPanel panel2 = new JPanel(); 
JPanel panel3 = new JPanel(); 
JPanel panel4 = new JPanel(); 

背景を設定します(私は色を使用していますが、あなたは考えを理解します)

panel1.setBackground(Color.orange);
panel2.setBackground(Color.orange);
panel3.setBackground(Color.orange);
panel4.setBackground(Color.orange);

JFrameのレイアウトを設定します(私はBoxLayoutを使用していますが、どちらが最適かわかりません)ここで、最適なレイアウトといくつかのサンプルコードを見つけることができますまた、デフォルトのクローズ操作を設定するだけです。

frame1.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame1.setLayout( new BoxLayout( frame1.getContentPane(), BoxLayout.Y_AXIS ) );

次に、JPanelsをアタッチするだけです

frame1.add( panel1);
frame1.add( panel2);
frame1.add( panel3);
frame1.add( panel4);
frame1.pack();
frame1.setVisible( true );

これにより、作成したJPanelsを使用して、他の方法で色を変更できます。

于 2013-02-27T20:56:19.367 に答える