Neden sadece en üst düzey bileşen oluşturulur?

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;
    }
}

Bu uygulamayı çalıştırdığımda, yalnızca en son eklenen UIElementi gösterecektir. Neden?

1

1 cevap

Üst düzey kaplar (JApplet, JFrame gibi) bir BorderLayout kullanır. Bu nedenle, uygulama bileşeninin içerik bölmesine bir bileşen eklediğinizde, bileşen varsayılan olarak "MERKEZ" e eklenir. Bu nedenle, tüm bileşenler aynı alanı işgal ettiğinden sadece son bileşen eklenir.

Swing çalışmalarını nasıl kullanacağınızı ve kendi özel oluşturmayı oluşturmayı denemediğinizi öğrenmenizi öneririm.

Pencereyi bileşenlerin ne zaman işleneceğini söyleyemezsiniz. Bir bileşenin resmini bilmeden otomatik olarak yapmanın farklı zamanları vardır, bu yüzden Swing'in iyi tanımlanmış bir boya mekanizması vardır.

4
katma
Bir düzen yöneticisi kullanmalısınız. Sorunuzda aksini önerecek hiçbir şey göremiyorum. Sorununuz düzen yöneticisi değil. Sorununuz, birbiri üzerine iki bileşen yığmaya çalıştığınızdır; bu, 3 boyutlu düzende değil, bileşenlerin 2 boyutlu düzenini ele alan düzen yöneticileriyle hiçbir ilgisi yoktur. Belki de bir JLayeredPane kullanmanız veya belki de Arka Plan Paneli .
katma yazar camickr, kaynak
@Benjamin Ben bileşenleri istediğiniz gibi yerleştirmek için izin veren bir LayoutManager öğrenecekti. NullLayout benim fikrimde gerçekten bir seçenek değil. GridBagLayout , GridLayout ve BoxLayout 'a bakabilirsiniz. Diğer ihtiyaçlarınız tam olarak ihtiyacınız olan şey olabilir.
katma yazar Laf, kaynak
Sistem repaints ve uygulama repaints hakkında biliyorum ve sistem repaints hakkında bir şey yapamayacağımı biliyorum ve bu iyi. Sadece görünümü biraz daha kontrol edebilmeyi istiyorum. Yani ne düşünüyorsun? JApplet'in düzenini de unutmam mı gerekiyor?
katma yazar Benjamin, kaynak