2017-12-12 16 views
0

クラスの複数のインスタンスをjavaのJFrameに追加しようとしていますが、2つの異なるインスタンスをJFrameに追加しようとすると、最近追加されたインスタンスのみが表示されます。複数のクラスインスタンスをjframeに追加

私はここに示すの答えを見てきました: How to add multiple components to a JFrame?、ここで:Adding multiple classes to a Jframe

私のコードはhttps://www.youtube.com/watch?v=I3usNR8JrEE&index=51&list=PL53A7C2BE1F8D780C 後にモデル化されており、私は、EclipseのJava酸素放出4.7.1a を使用していますが、何も私のために働いていません。ここに私の主な機能です:

package BlockPack; 

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class Block extends JPanel implements ActionListener { 

    @Override public Dimension getPreferredSize() { 
     return new Dimension(900, 900); 
    } 

    Timer tm = new Timer(50, this); 
    int blockWidth, blockHeight; 
    int x, y, velX = 2, velY = 0, gravity = 0; 
    String thisName; 
    boolean collidingGround = false; 

    public Block(String _name, int _x, int _y, int _width, int _height) { 
     thisName = _name; 
     x = _x; 
     y = _y; 
     blockWidth = _width; 
     blockHeight = _height; 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.RED); 
     g.fillRect(x, y, blockWidth, blockHeight); 

     tm.start(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     performMovement(); 
     repaint(); 
    } 

    private void performMovement() { 

     y += 1; 

    } 

    public static void main(String[] args) { 
     Block b = new Block("block1", 10, 30, 50, 50); 
     Block bb = new Block("block2", 30, 60, 10, 60); 

     JFrame jf = new JFrame(); 

     jf.setLayout(new FlowLayout()); 

     jf.setTitle("Ball"); 
     jf.setSize(600, 400); 

     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Container c = jf.getContentPane(); 
     c.add(new Block("block1", 10, 30, 50, 50)); 
     c.add(new Block("block2", 30, 60, 10, 60)); 

     jf.setVisible(true); 
    } 

} 
+0

を参照してください。https://stackoverflow.com/questions/10086936/java-adding-components-to-jframe – IEE1394

+0

問題を再現する完全な最小例を投稿してください。ここではうまく動作しますが、ブロックを追加した後にフレームを表示させる必要がありますが、スイングのスレッドルールを尊重してください。ここに私の完全な最小限の例があります:https://gist.github.com/jnizet/3910ae413d22ca7f153d9fdc41e22086 –

+0

@ IEE1394推奨していただきありがとうございますが、以前と同じ結果が得られました。追加された最後のものだけが表示されます – Ninjakid14

答えて

0
  1. jf.setLayout(new FlowLayout());が必要になるのは、デフォルトのBorderLayoutの中心位置に両方のコンポーネントを追加しているので、コメントアウトされているので、もちろん最後のものだけが表示されています。
  2. ブロックはgetPreferredSize()をオーバーライドしないため、デフォルト値(10 x 10)が返され、コンポーネントはこの優先サイズ外に描画されます。
  3. スイングのスレッドルールを尊重しておらず、フレームが表示される前に追加するのではなく、フレームを表示した後でコンポーネントを追加します。
+0

ありがとう!だから、もし私がsetLayout行をコメントアウトしなければ、何も表示されないので、関係ないと思った。また、私のコードを変更してgetPreferredSize()をオーバーライドする方法もあります。 – Ninjakid14

+0

これをオーバーライドします。たとえば、次のようになります。 '@Override public Dimension getPreferredSize(){ return new Dimension(200,200); } ' –

+0

極端な未経験者は申し訳ありませんが、私はJavaの真新しい人です。オーバーライドディメンションをBlockクラスの最上部に配置するはずですか?ブロック()オブジェクトの両方をどのように表示させるのか分かりません。私は自動的にそれを実行するのですか、どこかに呼び出さなければなりませんか? – Ninjakid14

関連する問題