Чаму прайграны толькі кампанент верхняга ўзроўню?

I'm creating a game applet for use on my website and I hate Swing's way of laying out/rendering components. So I thought I could set up an arrangement that allowed me to do things, how I like to do them (manually tell the window manager when to render a component as well as using absolute positioning for the layout). Here's my code, 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. Чаму гэта?

1

1 адказы

кантэйнеры верхняга ўзроўню (напрыклад, JApplet, JFrame) выкарыстоўваюць BorderLayout. Такім чынам, пры даданні кампаненты да панэлі змесціва аплета кампанент дадаецца ў «CENTER» па змаўчанні. Такім чынам, толькі апошні кампанент, дададзены адлюстроўваецца, так як усе кампаненты займаюць тую ж плошчу.

Я прапаную вам даведацца, як выкарыстоўваць Swing, працуе і не спрабаваць стварыць свой уласны карыстацкі рэндэрынг.

Вы не можаце проста сказаць акно, калі для візуалізацыі кампанентаў. Ёсць розныя часы карціна кампанента адбываецца аўтаматычна без вашага ведама пра гэта, таму свінг мае выразна пэўны механізм фарбы.

4
дададзена
Вы павінны выкарыстоўваць менеджэр кампаноўкі. Я нічога не бачу ў вашым пытанні, які прапанаваў б у адваротным выпадку. Ваша праблема не менеджэр кампаноўкі. Ваша праблема заключаецца ў тым, што вы спрабуеце скласці два кампанента па-над адзін сябар, які не мае нічога агульнага з сапраўды мэнэджэрамі кампаноўкі, якія маюць справу з 2-мернай кампаноўкай кампанентаў, а не 3D макета. Можа быць, вам трэба выкарыстоўваць JLayeredPane або можа быць нешта накшталт фону панэлі </а >.
дададзена аўтар camickr, крыніца
@Benjamin я б даведацца LayoutManager , які дазваляе размяшчаць кампаненты так, як вы хочаце. <�Код> NullLayout гэта не варыянт, на мой погляд. Вы можаце паглядзець на GridBagLayout , то GridLayout і BoxLayout . Некаторыя іншыя існуе, што можа быць толькі тое, што вам трэба.
дададзена аўтар Laf, крыніца
Ну, я ведаю пра сістэму перамалёўкі і перамалёўкі прыкладанняў, і я ведаю, што я нічога не магу пра сістэму перамалёўкі рабіць, і гэта нармальна. Я проста хачу, каб мець магчымасць кантраляваць выгляд крыху больш. Дык што ж вы думаеце? Тое, што я павінен абнуліць макет JApplet, а?
дададзена аўтар Benjamin, крыніца