WebHU - Programozási kérdések és válaszok

Egynél több JPanel egy keretben / egy keretes képpel és egy másik réteggel a tetején komponensekkel

Van egy JFrame-em egy JPanel-lel, amelyben van egy JLabel egy ImageIcon()-val. Minden tökéletesen működik, a probléma az, hogy most egy másik JPanel-t szeretnék hozzáadni az összes többi dologgal, például gombokkal és így tovább a JFrame-hez. De továbbra is a háttérképet mutatja felül, és semmit a második JPanelnél.

Tud valaki segíteni? Íme egy kivonat a kódomból:

JFrame window = new JFrame("Http Download");


/*
 * Background Section
 */
JPanel panel1 = new JPanel();

JLabel lbl1 = new JLabel();


/*
 * Component Section
 */
JPanel panel2 = new JPanel();

JLabel lbl2 = new JLabel();


/*
 * Dimension Section
 */
Dimension windowSize = new Dimension(800, 600);
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();

public HTTPDownloadGUI() {

    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel1.setLayout(null);
    panel1.setSize(windowSize);
    panel1.setOpaque(false);

    panel2.setLayout(null);
    panel2.setSize(windowSize);
    panel2.setOpaque(false);

    lbl1.setSize(windowSize);
    lbl1.setLocation(0, 0);
    lbl1.setIcon(new ImageIcon(getClass().getResource("bg1.png")));
    panel1.add(lbl1);

    lbl2.setBounds(0, 0, 100, 100);
    //lbl2.setIcon(new ImageIcon(getClass().getResource("bg2.png")));
    lbl2.setBackground(Color.GREEN);
    panel2.add(lbl2);

    panel1.add(panel2);

    window.add(panel1);

    int X = (screen.width / 2) - (windowSize.width / 2);
    int Y = (screen.height / 2) - (windowSize.height / 2);

    window.setBounds(X,Y , windowSize.width, windowSize.height);
    window.setVisible(true);

}

Válaszok:


1
  1. Kerülje a null elrendezést, itt több baj van, mint megéri
  2. A keret elrendezésének beállítása BorderLayout
  3. Adja hozzá a címkét a kerethez
  4. Állítsa a címkék elrendezését a következőre: BorderLayout
  5. Hozzon létre saját panelt, és állítsa átlátszatlan tulajdonságát false értékre
  6. Adja hozzá a többi komponenst a szokásos módon
  7. Adja hozzá a panelt a címkéhez

Pénztár

Például

Frissítés példával

  • panel1 a fő háttér...
  • panel1 elrendezésének beállítása BorderLayout
  • lbl1 hozzáadása ehhez: panel1
  • lbl1 elrendezésének beállítása BorderLayout
  • Állítsa be a panel2 elrendezését arra, amit használni szeretne...
  • panel2 átlátszatlanság tulajdonságának beállítása false (panel2.setOpacity(false)) értékre
  • lbl2 hozzáadása ehhez: panel2
  • panel2 hozzáadása ehhez: lbl1
  • Add hozzá a panel1-t ahhoz, amit csak akarsz.

adja meg itt a kép leírását

public class TestLayout17 {

    public static void main(String[] args) {
        new TestLayout17();
    }

    public TestLayout17() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        /*
         * Background Section
         */
        JPanel panel1 = new JPanel();
        JLabel lbl1 = new JLabel();
        /*
         * Component Section
         */
        JPanel panel2 = new JPanel();
        JLabel lbl2 = new JLabel();
        /*
         * Dimension Section
         */
        Dimension windowSize = new Dimension(800, 600);
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();

        public TestPane() {

            setLayout(new BorderLayout());

            panel1.setLayout(new BorderLayout());

            lbl1.setLayout(new BorderLayout());
            URL url = getClass().getResource("/bg1.gif");
            System.out.println(url);
            try {
                BufferedImage image = ImageIO.read(url);
                Image smaller = image.getScaledInstance(-1, image.getHeight() / 2, Image.SCALE_SMOOTH);
                lbl1.setIcon(new ImageIcon(smaller));
            } catch (Exception e) {
                e.printStackTrace();
            }
//            lbl1.setIcon(new ImageIcon(url));
            panel1.add(lbl1);

            add(panel1);

            panel2.setLayout(new GridBagLayout());
            panel2.setOpaque(false);

            lbl2.setBorder(new EmptyBorder(8, 8, 8, 8));
            lbl2.setBackground(Color.GREEN);
            lbl2.setText("Say hello");;
            lbl2.setOpaque(true);
            panel2.add(lbl2);

            lbl1.add(panel2);

        }
    }
}
14.12.2012
  • Milyen címkékre, milyen keretre és panelre gondolsz? Megpróbálnád kicsit bővebben elmagyarázni, kérlek? 15.12.2012
  • Szuper, tökéletesen működik. Az volt a hibám, hogy a panel2-t hozzáadtam a panel1-hez a label1 helyett. Köszönöm haver a segítséget! 16.12.2012

  • 2

    Az ok, amiért úgy tűnik, hogy a panel2 nem jelenik meg, az az oka, hogy nincs mit megjeleníteni. A lbl2 szövegének egyszerű beállítása megmutatja, hogy maga a JPanel látható:

    JLabel lbl2 = new JLabel("Some text");
    

    Nem javaslom azonban az null elrendezés használatát, mivel ez a fejlesztőre hárítja a helyek és méretek beállítását, amelyeket a elrendezéskezelő könnyen kezelheti Ön helyett.

    14.12.2012

    3

    Azt tanácsolom, hogy fogadja meg a MadProgrammer tanácsát. Ha úgy döntött, hogy nulla elrendezést használ, győződjön meg arról, hogy eltávolítja az előző JPanel elemet, és hozzáadja az újat a tartalom ablaktáblához window.setContentPane(panel2);, és hívja a window.repaint().

    14.12.2012
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..