Jakiego Layout Managera użyć?

0

Hej

piszę małą grę i chcę na wstępie zaprojektować rozkład wszystkich paneli na ramce. Taki jest pomysł, aby każde pole to był osobny JPanel, aby móc każdym indywidualnie zarządzać. Problem w tym, że nie potrafię wybrać Layout Managera, który umożliwiłby mi rozkład paneli w układzie jak w załączniku.

Chciałbym zachować proporcje pól jak na rysunku, tzn. title wąsko u góry, reszta pól trochę wyższa(będą dynamicznie wypełniane), ale czy użyję GridBagLayout'u, czy BoxLayout, nie potrafię dojść do celu. Problem też mam z tym jak rozciągnąć pole "graphs", aby było rozciągnięte od "game area" do "ranking". Próbowałem GroupLayoutu, ale też nie wychodzi, wtedy ustawia się bezpośrednio pod "game area".

Proszę chociaż o pseudokod jakbyście to widzieli, czego użyć, jak rozmieścić. Jakieś rady?

Dzięki.

918d13762f.png

0

Ja proponuje użyć GridBagLayout. Moim zdaniem daje on największe możliwości. Jeśli nadasz odpowiednie wartości polom GridBagConstraints.anchor i GridBagConstraints.fill, to łatwo uzyskasz taki układ:) Jak chcesz to mogę Ci z tym pomóc. Napisz na priv jak cos. Pole "graphs" także łatwo rozciągnąć przy użyciu właśnie GridBagLayout. Wystarczy dobrze określić wartości pol składowych zmiennej klasy GridBagConstraints.

1

Mozesz posluzyc sie moim ponizszym kodem (troche zmodyfikowalem progra, ktory kiedys tam pisalem)

klasa Ramka

 
import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

class Ramka extends JFrame
{
    public Ramka()
    {
        setTitle("Gra");
        setSize(ROZMIAR*2, ROZMIAR);
        setResizable(false);
        
        Container powZawartosci = getContentPane();
        GridBagLayout uklad = new GridBagLayout();
        powZawartosci.setLayout(uklad);
        
        try
        {
            String wyglad = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
            UIManager.setLookAndFeel(wyglad);
            SwingUtilities.updateComponentTreeUI(this);
        }
        catch(Exception w)
        {
            w.printStackTrace();
        }
        
        GridBagConstraints wytyczne = new GridBagConstraints();
        
        // stowrzenie komponentow i dodanie ich do ramki
        JLabel etykieta = new JLabel("Tytul");
        wytyczne.weightx = 100;
        wytyczne.weighty = 100;
        add(etykieta, 2, 0, 1, 1, wytyczne);
        
        JButton button1 = new JButton("button1");
        add(button1, 0, 1, 3, 1, wytyczne);
        
        JButton button2 = new JButton("button2");
        add(button2, 0, 4, 3, 1, wytyczne);
        
        JTextArea ranking = new JTextArea(5, 20);
        ranking.setEditable(false);
        ranking.setText("tu bedzie ranking");
        add(ranking, 4, 1, 3, 1, wytyczne);
        
        JTextArea panelGameArea = new JTextArea(5, 20);
        panelGameArea.setText("tu bedzie GameArea");
        add(panelGameArea, 1, 1, 3, 3, wytyczne);
        
        JTextArea panelGraphs = new JTextArea(5, 40);
        panelGraphs.setText("tu bedzie Graphs");
        add(panelGraphs, 1, 4, 3, 4, wytyczne);
    }
    
    // metoda dodajaca komponent do ramki
    public void add(Component k, int x, int y, int w, int s, 
            GridBagConstraints wytyczne)
    {
        wytyczne.gridx = x;
        wytyczne.gridy = y;
        wytyczne.gridheight = w;
        wytyczne.gridwidth = s;
        getContentPane().add(k, wytyczne);
    }
    
    public static final int ROZMIAR = 200;
}


klasa Testowa

import javax.swing.JFrame;

public class Test 
{
    public static void main(String[] args)
    {
        Ramka ramka = new Ramka();
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ramka.setVisible(true);
    }
}
 

Mysle, ze mniej wiecej o to Ci chodzi. Musisz zmienic tylko komponenty na takie jakie chcesz dodac w swoim projekcie.

0

Kod pomógł. Główny problem wciąż miałem z polem title - chciałem, aby reszta pól "podciągała" się do niego w przypadku rozciągania, np. maksymalizacji okna. GridBag ma taki minus, że rozciąga wszystkie pola równomiernie, czyli przy maksymalizacji pole tytułu zajmowałoby 1/3 wysokości okna. Udało mi się to obejść poprzez zrobienie dodatkowych paneli titlePanel i bodyPanel, do body upakowałem resztę pól i te dwa główne panele były w nadrzędnym panelu o layoucie BoxLayout z parametrem Y_AXIS, aby te dwa panele były pod sobą. Tak piszę jakby ktoś też miał takie problem.
Dzięki. Pozdr.

0

GridBagLayout daje Ci właśnie duże możliwosci jeśli chodzi o rozciąganie kolumn i manipulowanie położeniem komponentu w komórkach (powinny zainteresować Cię szczególnie pola składowe GridBagConstraints.weightx i GridBagConstraints.weighty). Proponuję poczytać o klasie GridBagConstraints. Jesli dobrze określisz stan obiektu tej klasy, to możesz uzyskać zadowalający efekt w swoich aplikacjach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1