Java [1242]

Zapisz się
Dodaj kartkę Dodaj bana
Powód wlepienia kartki
Wybierz wątek docelowy z listy lub wpisz jego ID
  • Anonim

    Ok, mam taki problem, który nie wiem jak ugryźć. Zrzucę to może na... nagłe zaćmienie umysłu. :)

    Otóż chcę zrobić okno (JFrame), w którym znajdują się obok siebie w poziomie dwa przyciski (JButton). Po wciśnięciu któregoś z przycisków, czcionka napisu na nim znajdującego się powiększa się o jeden punkt. Warunkiem jest to, ażeby w miarę powiększania się tekstu na przyciskach, był on zawsze całkowicie widoczny, a zatem wiąże się to z powiększaniem JFrame'u. Nie byłoby z tym żadnego problemu, gdyby nie to, że użycie funkcji pack() z klasy JFrame nie jest w tym przypadku mile widziane.

    Dlaczego?

    Otóż, wyobraźmy sobie sytuację, w której chcemy, ażeby nasze okno miało stałą wysokość (przynajmniej do czasu). W miarę klikania w któryś z przycisków, tekst na nim powiększa się i okno rozszerza swój rozmiar poziomy, ażeby zmieścić całość tekstu. Po jakimś czasie zaczyna brakować miejsca w pionie na wyświetlenie pełnego napisu i dopiero wtedy okno rozszerza się w pionie.

    Funkcja pack() natomiast powoduje, że przy każdym wciśnięciu przycisku i tym samym powiększeniu się któregoś z napisów, powiększa zarówno poziomy jak i pionowy rozmiar JFrame'u.

    Poprosiłbym może o jakąś wskazówkę lub podpowiedź, która nakierunkowały by mnie na rozwiązanie, zamiast gotowej odpowiedzi. Chciałem bowiem sam pokombinować.

    Próbowałem ugryźć to stosując różne kombinacje z Preferred/Minimum/MaximumSize( ) dla JFrame/JButton, albo może jakaś funkcja sprawdzająca jaki jest stosunek wysokości czcionki (w px nie pt) w stosunku do wysokości przycisku, ale chyba to jest takie zabieranie się, że tak powiem, od dupy strony. :)

    I jeszcze jedno. Czy funkcja pack() z klasy JFrame działa w ten sposób, że bierze getPreferredSize() ze wszystkich komponentów znajdujących się w ContentPane JFrame'a, potem,biorąc pod uwagę Layout ContentPane'a, sumuje PreferredSize'y i na ich podstawie określa rozmiar JFrame'a? Czy jakoś inaczej?
  • Anonim

    public void pack()

    ... >> The Window will be validated after the preferredSize is calculated. << ... i wszystko jasne...

    A co do rozmiaru okna... postaraj sie pobrac getHeight() i getWidth() (podejrzewam ze z JLabel) - potem ustawisz rozmiar okna na postawie tych danych jakims tam stosunkiem wielkosci i nastepnie setSize() dla JFrame i repaint() :) - powinno dzialac na chlopski rozum no nie?
  • Anonim

    >(...)postaraj sie pobrac getHeight() i
    >getWidth() (podejrzewam ze z JLabel) - potem ustawisz
    >rozmiar okna na postawie tych danych jakims tam stosunkiem
    >wielkosci i nastepnie setSize() dla JFrame i repaint() :) -
    >powinno dzialac na chlopski rozum no nie?

    Niestety nie jest to JLabel, a JButton. I tu jest problem, bo na JButtonie, podczas powiększania stopniowo (o 1 pt. po wciśnięciu JButtona) rozmiaru tekstu JButtona, tekst jest do pewnego czasu widoczny w całości. Potem natomiast wiadomo, widoczna jest jedynie jego część + trzy kropki, z racji tego, że jest on np. szerszy niż sam JButton. Chodzi o to, ażeby w jakiś sposób sprawdzić czy tekst mieści się jeszcze w JButtonie, a jeśli nie, to odpowiednio powiększyć rozmiar horyzontalny JButtona (jak i JFrame'a, w którym JButton się znajduje) oraz, jeśli zajdzie taka potrzeba, w stosownym momencie powiększyć również rozmiary pionowe (jeśli tekst przestaje mieścić się w pionie).

    Próbowałem też w ten sposób:
    Funkcja getSize() z klasy Font zwraca rozmiar czcionki, ale niestety w punktach i nijak się to ma do rozmiaru zwracanego przez getSize() z klasy Component, po której dziedziczy klasa JButton i która zwraca nam obiekt klasy Dimension, którego pola stanowią w tym przypadku piksele, a nie punkty. Więc nie ma za bardzo czego tu porównywać. Wyniki, poddane jakiejkolwiek konwersji, nie były by wiarygodne i dlatego tą drogę już porzuciłem. Przynajmniej tak mi się wydaje.

    Zresztą, przecież wystarczy, że zmieni się czcionkę, znajdującą się na przycisku i już pojawia się kolejny problem.

    (Możliwe, że trochę pokręciłem.; ))

    Jestem w kropce.
  • Dzemus

    "Niestety nie jest to JLabel, a JButton."
    Hmm.. a jakbyś sobie przeciążył JButtona i umieścił na nim JLabel'a? :P Albo w ogóle stwórz sobie JLabel'a który po prostu nie będzie Visible i będziesz sobie z niego pobierał wymagane wymiary do resize'a buttona. (późno już, to pewnie z rana uznam to za idiotyczny pomysł... :P)
  • Anonim

    wywolaj validate() na rzecz JFrame
  • Anonim

    Wiecie co? Ale namieszałem.

    Podstawowy błąd jaki popełniłem, to nieustawienie domyślnej początkowej wartości rozmiarów JFrame'a, np. 300x300. Drugi błąd, to ustawienie Layout'u ContentPane'a na GridLayout, zamiast FlowLayout, przez co podczas samego osadzenia JButtona w JFrame, zakładając, że JFrame ma stały rozmiar, JButton wypełniał całą jego powierzchnię, przez co tracił proporcję odstępów pomiędzy jego tekstem, a granicami JButtona (Insets) i dlatego, wpędziłem się w te kłopoty z próbami mierzenia rozmiaru pionowego czcionek (żeby wogóle tekst mieścił się w JButtonie).

    (Aczkolwiek użycie niewidocznego JLabela, na pewno by temu w pewnym stopniu zaradziło).

    Teraz wrzuciłem FlowLayout i poradzony przez Marka validate() (przedtem próbowałem repaint()) i wszystko gra. :) Jeszcze tylko dodam obok drugi JButton, robiący to samo oraz funkcję sprawdzającą czy po powiększeniu tekstu na którymś z JButtonów ich sumaryczne rozmiary nie wyjdą poza granice JFrame'u (jeśli tak, to JFrame, się odpowiednio powiększy) i szafa gra. :D

    Dzięki wielkie. :)
  • kei

    No tak, widze ze zadanie z POJ; )
    Oj nieladnie, nieladnie :P Wlasnie sie nad nim męcze. Chyba troche pozno heh; )