2012-12-19 14 views
5

Próbuję ustawić dwa zestawy przycisków dla GUI kalkulatora. Każdy używa GroupLayout do ich tworzenia. Jeden zestaw to liczby (i "."), Drugi to przyciski operacyjne. To zasadniczo działa, ale jeśli jeden z przycisków ma podwójną długość (na przykład przycisk równości na moim zestawie operacji), wyrzuca pozostałe przyciski poza linię. Użyję operacji przedstawionych jako przykład. Są dwie kolumny i cztery rzędy przycisków. Ostatni rząd ma tylko jeden przycisk - równy. Chcę, aby ta podwójna długość rozciągała się na obydwu kolumnach. W tej chwili po prostu popycha drugą kolumnę wzdłuż jej końca, kiedy chcę, aby druga kolumna usiadła na niej.Java - Mieszanie komponentów w GroupLayout

Oto kod układu - operLayout to nazwa układu operacji, lewy i prawy nawias w pierwszym rzędzie, + i - na drugim, * i/na trzecim i równy w ostatnim rzędzie . Każdy przycisk ma ustawiony minimalny rozmiar w innym miejscu (wszystkie są takie same, z wyjątkiem równego dwa razy dłuższego).

operLayout.setAutoCreateGaps(true); 
operLayout.setAutoCreateContainerGaps(true); 
operLayout.setVerticalGroup(operLayout 
     .createSequentialGroup() 
     .addGroup(
operLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(leftBracket) 
          .addComponent(rightBracket)) 
      .addGroup(operLayout.createParallelGroup().addComponent(add).addComponent(subtract)) 
      .addGroup(operLayout.createParallelGroup().addComponent(multiply).addComponent(divide)) 
      .addGroup(operLayout.createParallelGroup().addComponent(equals))); 
    operLayout.setHorizontalGroup(operLayout 
      .createSequentialGroup() 
      .addGroup(
        operLayout.createParallelGroup().addComponent(leftBracket).addComponent(add) 
          .addComponent(multiply).addComponent(equals)) 
      .addGroup(
        operLayout.createParallelGroup().addComponent(rightBracket).addComponent(subtract) 
          .addComponent(divide))); 

Rozumiem, dlaczego tak się dzieje, ale nie jestem pewien, jak to rozwiązać. Czy istnieje prosty sposób? Czy powinienem zmienić sposób, w jaki to robię? Dzięki

+0

Pochwalam za wybór "GroupLayout" dla tego zadania. Uważam, że ten układ jest najpotężniejszy do układania standardowych formularzy. Łatwo go przeoczyć, ponieważ jest skomplikowany w użyciu. Po nauczeniu się, jak to działa, używam go prawie wyłącznie. –

+0

można ponownie sformatować swój kod? Aktualne, y jest raczej nieczytelne. – ArtB

+0

tak, proszę, chociaż ktoś mógł cię do tego pobić. Dziękujemy @ErickRobertson, wiem, co masz na myśli, wydaje się to skomplikowane, ale kiedy już to zrozumiesz, to naprawdę przydatne! – PatrickJBC

Odpowiedz

3

Umieść komponent equals we własnej równoległej grupie poziomej.

Przede wszystkim upewnij się, że używasz stałego wcięcia, gdy używasz GroupLayout. Stwierdziłem, że jest to absolutnie niezbędne w śledzeniu tego, co się dzieje.

Przyczyną obserwowanego zachowania jest to, że znak równości jest częścią tej samej poziomej grupy równoległej co pierwsza kolumna przycisków. Więc gdy robisz to podwójnie szeroko, popycha drugą kolumnę przycisków po prawej. Dokładnie to robisz, ponieważ mówisz, żeby pozostała w pierwszej równoległej grupie (kolumnie).

Aby uzyskać pożądane zachowanie, należy ustawić ten przycisk oddzielnie, równolegle do innych przycisków. Robisz to, umieszczając go w swojej równoległej grupie. Prawdopodobnie chcesz również zestroić tę grupę, aby uzyskać najlepsze zachowanie. Myślę, że GroupLayout.Alignment.CENTER jest tym, czego potrzebujesz.

Należy również pamiętać, że nie trzeba tworzyć nowej grupy, jeśli ma ona tylko jeden składnik. Po prostu dodaj ten komponent.

operLayout.setVerticalGroup(operLayout.createSequentialGroup() 
    .addGroup(operLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
     .addComponent(leftBracket) 
     .addComponent(rightBracket)) 
    .addGroup(operLayout.createParallelGroup() 
     .addComponent(add) 
     .addComponent(subtract)) 
    .addGroup(operLayout.createParallelGroup() 
     .addComponent(multiply) 
     .addComponent(divide)) 
    .addComponent(equals)); 
operLayout.setHorizontalGroup(operLayout.createParallelGroup() 
    .addGroup(operLayout.createSequentialGroup() 
     .addGroup(operLayout.createParallelGroup() 
      .addComponent(leftBracket) 
      .addComponent(add) 
      .addComponent(multiply)) 
     .addGroup(operLayout.createParallelGroup() 
      .addComponent(rightBracket) 
      .addComponent(subtract) 
      .addComponent(divide))) 
    .addComponent(equals)); 
+0

dziękuję za pomoc! Tak, zdaję sobie sprawę, że właśnie to mówiłem, wynik, który otrzymałem, nie zaskoczył mnie, po prostu nie byłem pewien, jak zmienić to ustawienie, aby to naprawić. Nie bardzo rozumiem, co mówisz zrobić, jak mówisz, aby umieścić go w swojej równoległej grupie (poziomej lub pionowej? Zakładam, że jest pionowa, a może obie?), Ale wtedy mówisz, że jeśli jest to jeden komponent, to nie robi tego ". t potrzebuję grupy. Próbowałem kodu, który podałeś, a także odmiany tego, co powiedziałeś z grupami/tylko komponentem, używając wyrównania środka, ale nie zmieniłem tego, co miałem. – PatrickJBC

+0

OK, przepraszam, tylko zdałem sobie sprawę z tego, że powiedziałeś, że możesz zacząć od poziomu, ale to nie rozwiązuje problemu. – PatrickJBC

+0

Nie wiem, dlaczego to nie rozwiązuje problemu.Upewnij się, że wcięcia są wyrównane z nawiasami, dzięki czemu dodajesz składnik do odpowiedniej grupy. Powinien być dodawany równolegle do grupy sekwencyjnej, która zawiera dwie kolumny w grupie poziomej. To działa, więc nie jestem pewien, co robisz inaczej. Ale nie zdziwiłbym się, gdyby znajdował się w niewłaściwym miejscu, w oparciu o sposób, w jaki był zorganizowany oryginalny kod. –

Powiązane problemy