簡體   English   中英

為什么只渲染頂級組件?

[英]Why is only the top-level component rendered?

我正在創建一個在我的網站上使用的游戲小程序,我討厭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);
    }
}

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,JFrame)使用BorderLayout。 因此,當您將組件添加到applet的內容窗格時,組件將默認添加到“CENTER”。 因此,只顯示添加的最后一個組件,因為所有組件都占用相同的區域。

我建議你學習如何使用Swing工作,不要試圖創建自己的自定義渲染。

您不能只告訴窗口何時渲染組件。 有不同的時間,組件的繪制是在沒有您知道的情況下自動完成的,這就是Swing具有明確定義的繪制機制的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM