1

Web サイトで使用するゲーム アプレットを作成していますが、Swing のコンポーネントのレイアウト/レンダリング方法が嫌いです。そこで、自分の好きなように物事を行うことができる配置をセットアップできると考えました (レイアウトの絶対配置を使用するだけでなく、いつコンポーネントをレンダリングするかをウィンドウマネージャーに手動で伝えます)。これが私のコード、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);
    }
}

前景.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

1 に答える 1

4

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

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

コンポーネントをレンダリングするタイミングをウィンドウに伝えることはできません。コンポーネントの描画が知らないうちに自動的に行われる場合があります。そのため、Swing には明確に定義された描画メカニズムがあります。

于 2011-10-28T14:11:12.170 に答える