2011-10-28 13 views
1

私は自分のウェブサイトで使用するゲームアプレットを作成しています。スイングのレイアウト/レンダリングの方法は嫌です。だから私は、自分が何をやっているのか、どのようにして行うのか(手動でウィンドウマネージャにいつコンポーネントをレンダリングするのか、レイアウトの絶対的な配置を使用するのか)を設定できると思った。 ここに私のコードは、GameApp.javaです:
トップレベルコンポーネントのみがレンダリングされるのはなぜですか?

import javax.swing.JApplet; 

public class GameApp extends JApplet { 

    private Background background; 
    private Foreground foreground; 

    @Override 
    public void init() { 
     background = new Background(); 
     foreground = new Foreground(); 
    } 

    @Override 
    public void start() { 
     background.render(this); 
     foreground.render(this); 
    } 
} 

Foreground.java:

import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JButton; 

public class Foreground extends UIElement { 

    private String buttonText; 
    private JButton startButton; 

    @Override 
    public void fetchDependencies() throws Exception { 
     buttonText = "Play!"; 
     startButton = new JButton(buttonText); 
    } 

    @Override 
    public void create() { 
     setLayout(null); 
     startButton.setBounds(350, 260, 100, 30); 
     startButton.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseEntered(MouseEvent e) { 
      } 

      @Override 
      public void mouseExited(MouseEvent e) { 
      } 
     }); 
     add(startButton); 
    } 
} 

Background.java:

import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.net.URL; 

public class Background extends UIElement { 

    private Image backdrop; 

    @Override 
    public void fetchDependencies() throws Exception { 
     backdrop = Toolkit.getDefaultToolkit().getImage(new URL("mywebpage")); 
    } 

    @Override 
    public void create() { 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     g.drawImage(backdrop, 0, 0, parent); 
    } 
} 

UIElement.java:

import javax.swing.JApplet; 
import javax.swing.JComponent; 

public abstract class UIElement extends JComponent { 

    protected JApplet parent; 

    public UIElement() { 
     try { 
      fetchDependencies(); 
     } catch(Exception e) { 
      System.err.println(e); 
     } 
    } 

    public abstract void fetchDependencies() throws Exception; 
    public abstract void create(); 

    public void render(JApplet p) { 
     addParent(p); 
     create(); 
     p.getContentPane().add(this); 
    } 

    private void addParent(JApplet ja) { 
     parent = ja; 
    } 
} 

このアプレットを実行すると、最後に追加されたUIElementのみが表示されます。何故ですか?

答えて

4

トップレベルコンテナ(JApplet、JFrameなど)はBorderLayoutを使用します。したがって、アプレットのコンテンツペインにコンポーネントを追加すると、コンポーネントはデフォルトで「CENTER」に追加されます。したがって、すべてのコンポーネントが同じ領域を占めるため、最後に追加されたコンポーネントのみが表示されます。

スイングの使い方を学び、独自のカスタムレンダリングを作成しないことをお勧めします。

コンポーネントのレンダリング時にウィンドウに指示するだけではありません。 Swingには明確なペイントメカニズムがある理由が分からないうちに、コンポーネントのペインティングが自動的に行われるのは異なる時期があります。

+0

私はシステムの再描画とアプリケーションの再描画について知っていますが、私はシステムの再描画について何もできないことを知っています。私はもう少しビューをコントロールできるようにしたい。それで、あなたはどう思いますか? JAppletのレイアウトもnullにする必要がありますか? – Benjamin

+1

@ベンジャミン私はあなたが望むようにコンポーネントを配置することを可能にする 'LayoutManager'を学びます。私の意見では、 'NullLayout'は本当にオプションではありません。 'GridBagLayout'、' GridLayout'、 'BoxLayout'を見ることができます。あなたが必要としているものとまったく同じであるものが存在します。 – Laf

+0

レイアウトマネージャを使用する必要があります。あなたの質問には何も見えません。問題はレイアウトマネージャではありません。あなたの問題は、3Dレイアウトではなく、コンポーネントの2次元レイアウトを扱うレイアウトマネージャとは何の関係もなく、2つのコンポーネントを重ねてスタックしようとしていることです。おそらく、JLayeredPaneを使うか、[Background Panel](http://tips4java.wordpress.com/2008/10/12/background-panel/)のようなものを使う必要があります。 – camickr

関連する問題