Mam średni-duży interfejs użytkownika, który używa BorderLayout; Środek jest panelem z zakładkami, zawierającym różne panele o różnych układach, itp.Zachowanie preferowanych rozmiarów komponentów w środku BorderLayout
Chcę, aby panel w środku tego układu krawędzi zmieniał rozmiar w zależności od rozmiaru okna, ale nie chcę, aby komponenty w nim panel do rozciągnięcia. Etykiety, pola kombi, pola tekstowe, przyciski - chcę, aby pozostały w preferowanych rozmiarach i pozwoliłyby rozciągnąć panel, który je zawiera. Umieszczam je w panelu przewijania w przypadku, gdy przestrzeń jest zbyt mała dla panelu.
Różne plakaty z kolorowymi słownictwami ostrzegają przed niebezpieczeństwem użycia dowolnej metody setXXXsize() na komponentach. Właśnie to robię teraz i chciałbym się nauczyć, jak tego uniknąć.
GridBagLayout nie jest odpowiedni dla niektórych z moich paneli. Z natury jest zorientowany na rzędy i kolumny, a nie wszystko pasuje do rzędów i kolumn. Oczywiście mógłbym stworzyć sztuczne rzędy i kolumny, aby dopasować wszystko, ale mam nadzieję, że Swing ma więcej opcji układu niż to.
Klej pionowy też tego nie robi. Podaję je w HFOE ukochanego SSCE:
package example;
import java.awt.BorderLayout;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class BorderAndBox extends JFrame
{
public static void main(String args[])
{
BorderAndBox bnb = new BorderAndBox();
bnb.createUI();
bnb.setVisible(true);
}
public void createUI()
{
JPanel borderPanel = new JPanel(new BorderLayout());
JLabel northLabel = new JLabel("Nawth");
borderPanel.add(northLabel, BorderLayout.NORTH);
String[] southComboChoices = { "one", "two", "three" };
JComboBox southCombo = new JComboBox(southComboChoices);
borderPanel.add(southCombo, BorderLayout.SOUTH);
JPanel centerPanel = new JPanel();
centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS));
String[] firstChoices = { "first", "uno", "UN" };
String[] secondChoices = { "second", "dos", "zwei" };
String[] thirdChoices = { "third", "tres", "drei" };
JComboBox firstCombo = new JComboBox(firstChoices);
JComboBox secondCombo = new JComboBox(secondChoices);
JComboBox thirdCombo = new JComboBox(thirdChoices);
centerPanel.add(firstCombo);
centerPanel.add(secondCombo);
centerPanel.add(thirdCombo);
centerPanel.add(Box.createVerticalGlue()); // first attempt; does NOT
// take up available vertical space, instead it appears to create a space
// that is shared equally among the (now) four components of this space.
borderPanel.add(centerPanel, BorderLayout.CENTER);
getContentPane().add(borderPanel);
pack();
}
}
Jeśli powiększyć okno, comboboxes w centrum powiększyć; jak napisano, pionowy kawałek kleju pod nimi również się powiększa, ale nie zajmuje całej dostępnej przestrzeni. Wygląda na to, że otrzymuje tyle miejsca, ile każdy z nich.
Jaki jest dobry sposób podejścia do tego?
* ".. ukochana SSCE:" * Ja też to kocham. I to jest SSCCE (2 Cs). ;) –
to nie może być tylko mały samodzielny przykład? – arcy
* "to nie może być tylko mały, samodzielny przykład?" * [Cytując] (http://sscce.org/#co) jeden z moich ulubionych ludzi: * "W tym dokumencie poprawne (lub możliwe do kompilacji, co w szczególności odnosi się do kodu źródłowego komputera) oznacza zapewnienie, że twój przykład pasuje do zaakceptowanych standardów i protokołów. "* najbardziej znaczący podpunkt *" Upewnij się, że twój przykład jest poprawny. Albo przykład kompiluje się czysto, albo pojawia się dokładny komunikat o błędzie, potrzebujesz pomocy. "* Kod skompilowany i pokazany problem, łatwe do zrobienia. To * jest * SSCCE. :) –