Używam wielu komponentów z malowaną ramką. Czy istnieje jakiś prosty sposób dodania marginesu do komponentu, aby obramowania nie były tak blisko siebie pomalowane?Jak dodać margines poza obrębem komponentu w Swing?
Odpowiedz
Zazwyczaj robi się to przy użyciu menedżera układu. Na przykład, jeśli używasz GridBagLayout
, ustawisz insets
na obiekcie GridBagConstraint
na żądaną wartość.
Inną opcją jest użycie obiektu Box
i dodanie struktury poziomej lub pionowej. Zobacz javadoc dla Box.createVerticalStrut(int width)
i podobne createHorizontalStrut
.
Innym sposobem, aby dostać to, czego chcę, to:
- uzyskać aktualny
Border
swojego urządzenia - jeżeli
null
, ustawićEmptyBorder
dla komponentu - jeśli nie
null
, stworzyć nowyCompoundBorder
(zEmptyBorder
i aktualnymBorder
z component) i ustawić go dla komponentu
W kodzie , który powinien wyglądać tak (przepraszam, że jej nie testowane):
Border current = component.getBorder();
Border empty = new EmptyBorder(top, left, bottom right);
if (current == null)
{
component.setBorder(empty);
}
else
{
component.setBorder(new CompoundBorder(empty, current));
}
Gdzie:
- komponent to komponent Swing do , do którego chcesz dodać margines
- górny, lewy, dolny, prawy to liczba pikseli w rozmiarze chcesz dodać około komponentu
Należy zauważyć, że metoda ta może mieć wpływ (rozmiar, wyrównanie) na kształt formy, w zależności od LayoutManager
używasz. Ale myślę, że warto spróbować.
Ta metoda tworzyła dla mnie nieprzejrzyste granice, a nie przezroczyste. To był problem. Użyłem zmodyfikowanej wersji: zamiast ustawiać ramkę na komponencie, utwórz nowy panel i ustaw dla niego granicę, a następnie dodaj komponent do tego panelu. Po wykonaniu tej czynności granica była przejrzysta zgodnie z oczekiwaniami. @jfpoilpret Czy mógłbyś zaktualizować swoją odpowiedź? – Loduwijk
Tak, mógłbym użyć 'Box', ale kod będzie tak brzydki, jeśli mam wiele marginesów Box ... – Jonas
Czy próbowałeś używać wstawek? Jaki układ obecnie używasz? Jak skomplikowany jest twój wyświetlacz? –
Układ jest złożony, jest klasą faktury, która implementuje 'Printable', więc używam wielu różnych menedżerów layoutu,' SpringLayout', 'BorderLayout',' BoxLayout' i tak dalej ... Postaram się użyć Insets, dziękuję. – Jonas