私は自分のウェブサイトで使用するゲームアプレットを作成しています。スイングのレイアウト/レンダリングの方法は嫌です。だから私は、自分が何をやっているのか、どのようにして行うのか(手動でウィンドウマネージャにいつコンポーネントをレンダリングするのか、レイアウトの絶対的な配置を使用するのか)を設定できると思った。 ここに私のコードは、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のみが表示されます。何故ですか?
私はシステムの再描画とアプリケーションの再描画について知っていますが、私はシステムの再描画について何もできないことを知っています。私はもう少しビューをコントロールできるようにしたい。それで、あなたはどう思いますか? JAppletのレイアウトもnullにする必要がありますか? – Benjamin
@ベンジャミン私はあなたが望むようにコンポーネントを配置することを可能にする 'LayoutManager'を学びます。私の意見では、 'NullLayout'は本当にオプションではありません。 'GridBagLayout'、' GridLayout'、 'BoxLayout'を見ることができます。あなたが必要としているものとまったく同じであるものが存在します。 – Laf
レイアウトマネージャを使用する必要があります。あなたの質問には何も見えません。問題はレイアウトマネージャではありません。あなたの問題は、3Dレイアウトではなく、コンポーネントの2次元レイアウトを扱うレイアウトマネージャとは何の関係もなく、2つのコンポーネントを重ねてスタックしようとしていることです。おそらく、JLayeredPaneを使うか、[Background Panel](http://tips4java.wordpress.com/2008/10/12/background-panel/)のようなものを使う必要があります。 – camickr