zmiana wygladu gui(swing) dla wielu komponentow jednoczesnie

0

Witam,

Program ktory produkuje bedzie skladal sie z wielu JFramow, jLabelsow, jTextFieldow itp. - po prostu duzo bedzie komponentow swingu, duuuuze gui ogolnie. Tak wiec przykladowo frame1 jest nastepujacy:

jFrameLogin - GUI logowania
jLabelLogin, jTextFieldEnterLogin
jLabelPassword, jTextFieldEnterPassword
jButtonLogIn

Moj problem wyglada nastepujaco, chcialbym za jednym zamachem zmienic kolor czcionki, kolor tla, rozmiar czcionki itp. (czyli setFont(), setBackground() itp.). Program bedzie mial wiele komponentow GUI i dodawanie do kazdego komponentu wartosci setFont itd bedzie bardzo meczace. Mpytanie jest nastepujace, czy jest mozliwosc zmiany wartosci czcionki itp dla wszystkich elementow w aplikacji lub danego frame?

Z gory dzieki za kazda pomoc
Marcin

PS. uzywam Netbeansa jezeli to istotne :P

0

Stwórz sobie klasy które będą dziedziczyły po elementach których chcesz używać (np. MyJFrame extends JFrame). Następnie w konstruktorach dodaj metodę która będzie robiła to co chcesz, na przykład:

public class MyJFrame extends JFrame{

public MyJFrame(){
   super();
   //a tu metoda która pozmienia to co chcesz

   }

}

Następnie w aplikacji używaj swoich klas (np. MyJFrame zamiast JFrame)

0

Sposób 1. Wszystkie komponenty, którym chcesz zmieniać własności umieszczasz w jakiejś kolekcji, np
ArrayList<JComponent> i potem robisz iteracje po kolekcji. Może być kłopotliwe jeśli GUI jest wyklikane.
Sposób 2. Korzystasz z metody getComponents(), która dla danego kontenera (np.JFrame) zwraca tablicę komponentów zawartych w kontenerze.

0
bogdans_niezalogowany napisał(a)

Sposób 1. Wszystkie komponenty, którym chcesz zmieniać własności umieszczasz w jakiejś kolekcji, np
ArrayList<JComponent> i potem robisz iteracje po kolekcji. Może być kłopotliwe jeśli GUI jest wyklikane.
Sposób 2. Korzystasz z metody getComponents(), która dla danego kontenera (np.JFrame) zwraca tablicę komponentów zawartych w kontenerze.

Wydaje mi się, że mój sposób jest o wiele lepszy, ponieważ:
ad.1 przy każdym utworzeniu obiektu GUI trzeba go będzie dodać do listy obiektów
ad.2 gdyby chciał ustawić labele na zielono a panele na czerwono musiałby wykrywać typ obiektu i wykonywać akcje -szkoda czasu biorąc pod uwagę, że typów może być wieeeele

A tak ma klasę np MyJLabel, która w sobie definiuje style/akcje dla labeli i używa ich w kodzie

0

Ja chyba źle zrozumiałem pytanie, rozumiałem je tak: okno programu ma jakiś wygląd, i teraz na trzy cztery zmieniamy wygląd na inny.

0

sprecyzuje dokladniej, mozliwe ze zle to wyjasnilem :P Mamy:

jTextField1
jTextField2
jTextField3
jTextField4
jTextField5
jTextField6
jLabel1
jLabel2
jLabel3
jLabel4
jLabel5
jLabel6

mamy takie komponenty np. i teraz zeby zmienic czcionke na np arial musialbym zrobic o tak:

jTextField1.setFont(myfont = new Font("Arial", FONT.PLAIN, 12));
jTextField2.setFont(myfont = new Font("Arial", FONT.PLAIN, 12));
jTextField3.setFont(myfont = new Font("Arial", FONT.PLAIN, 12));
jTextField4.setFont(myfont = new Font("Arial", FONT.PLAIN, 12));
jTextField5.setFont(myfont = new Font("Arial", FONT.PLAIN, 12));
jTextField6.setFont(myfont = new Font("Arial", FONT.PLAIN, 12));
jLabel1.setFont(myfont = new Font("Arial", FONT.PLAIN, 12));
jLabel2.setFont(myfont = new Font("Arial", FONT.PLAIN, 12));
jLabel3.setFont(myfont = new Font("Arial", FONT.PLAIN, 12));
jLabel4.setFont(myfont = new Font("Arial", FONT.PLAIN, 12));
jLabel5.setFont(myfont = new Font("Arial", FONT.PLAIN, 12));
jLabel6.setFont(myfont = new Font("Arial", FONT.PLAIN, 12));

pytanie jest czy jest jakis sposob na zrobienie czegos w stylu WSZYSTKIEjTextFields.setFont i tak samo z labelami, lub tez wszystkie komponenty razem ...
i jeszcze dodatkowa przeszkoda jest to ze labelsy i textfieldy nie sa ponazywane 1 2 3 4 5 itd. tylko mam specyficzne variable nazwy... w sensie jTextFieldNickname itd.</php>

0

To albo sposób @szwabo, albo mój, np. tak (wewnątrz konstruktora głównego okna)

Font myfont = new Font("Arial", FONT.PLAIN, 12);
Component[] komponenty=getComponents();
for(int i=0;i<komponenty.length;i++)
{
    Component c=komponenty[i];
    if(c instanceof JLabel || c instanceof JTextField)
        c.setFont(myfont);
}
0

Można też tak: (poniższy kod musi być wykonany przed utworzeniem labeli, butonów, pól tekstowych)

        javax.swing.plaf.FontUIResource f = new javax.swing.plaf.FontUIResource("Arial", FONT.PLAIN, 12);
        java.util.Enumeration keys = UIManager.getDefaults().keys();
        while (keys.hasMoreElements())
        {
            Object key = keys.nextElement();
            Object value = UIManager.get (key);
            if (value instanceof javax.swing.plaf.FontUIResource)
                UIManager.put (key, f);
        }
0

ok dzieki bardzo bogdans za nakierowanie mnie na UIManager :)

Jezeli ktos bedzie mial podobny problem to rozwiazanie jest takie:

uzywamy lookandfeel:

UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(this.mainPanel);

sa gotowe layouty(lookandfeel'e), mozna tez zrobic swoj, ja planuje zrobic cos w stylu:

  1. zbieram dane od uzytkownika typu wielkosc czcionki, kolor czcionki, itp itd.)
  2. tworze lookandfeel z tych danych
  3. ustawiam nowy lookandfell

Pozdro !:)

0

bogdans moze jeszcze wiesz jak zrobic aby ten kod:

javax.swing.plaf.FontUIResource f = new javax.swing.plaf.FontUIResource("Arial", FONT.PLAIN, 12);
java.util.Enumeration keys = UIManager.getDefaults().keys();
while (keys.hasMoreElements())
{
Object key = keys.nextElement();
Object value = UIManager.get (key);
if (value instanceof javax.swing.plaf.FontUIResource)
UIManager.put (key, f);
}

dzialal gdy nacisne przycisk, przykladowo:

zbieram font informacje (arial bold 11 np.) od uzytkownika
zmieniam FontUI czyli leci kod podany wyzej (?!)
przeladowuje jframe/jpanel(?!)

czy jakos tak to powinno wygladac? jezeli tak to moglbys dac jakis hint jak mniej wiecej to wykonac?

0

A czy UIManager nie wystarczy? - http://www.rgagnon.com/javadetails/java-0335.html

0

tak tak dokladnie wystarczy aleeeee UIManager dziala tylko w def constructorze Framu, czyli jezeli chce zmienic wartosci i zeby ona zadzialala to musze zrestartowac frame a dajac mojaframe.dispose(), mojaframe.setVisible(true); to niby dziala aleeeee pojawia sie nowa ramka a stara nie znika co jest irytujace bo nie wiem dlaczego tak sie dzieje...

uzywam tego co wkleiles, bogdans juz wczesniej to dawal, moj problem polega na podpieciem tego pod button zeby zmienialo nam fonty itp.

0

Przecież napisałem

(poniższy kod musi być wykonany przed utworzeniem labeli, butonów, pól tekstowych)

Nie wiem co chcesz osiągnąć, ale może spróbuj tak: przed otwarciem "właściwego" programu otwórz okno wyboru parametrów wyświetlania(fonty), odpytaj użytkownika i dopiero wtedy weź się za tworzenie komponentów głównego programu.

0

ano tak tez zrobie bo to zadziala, oj glupi ja :D dzieki bogdans again!

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