1 Востаннє редагувалося fed_lviv (14.09.2013 20:00:01)

Тема: Container

Підкажіть, будь-ласка, в чому помилка, що роблю не вірно? Створюю контейнер і в нього скидаю компоненти. Викликаю метод Container.setForeground(). Але колір шрифта компонентів даного контейнера не змінюється, чому?

package first;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class ContFrame extends JFrame {
    private static final long serialVersionUID = 1L;
    static JLabel lSearchSurname = new JLabel(" Впишіть прізвище:");
    static JTextField fSearchSurname = new JTextField(8);
    static JLabel lSurname = new JLabel(" Прізвище:");
    static JTextField fSurname = new JTextField(8);
    static JLabel lName = new JLabel(" Ім'я:");
    static JTextField fName = new JTextField(8);
    static JButton buttonSearch = new JButton("Пошук");
    static Container contTitle = new Container();
    static Container contMain = new Container();
    static Container contButton = new Container();

    public ContFrame() {
        cont();
        setLayout(new GridLayout(3, 2));
        add(contTitle);
        add(contMain);
        add(contButton);
        pack();
        setVisible(true);
    }

    public void cont() {
        contTitle.add(lSearchSurname);
        contTitle.add(fSearchSurname);
        contTitle.setLayout(new FlowLayout());
        contMain.add(lSurname);
        contMain.add(fSurname);
        contMain.add(lName);
        contMain.add(fName);
        contMain.setLayout(new GridLayout(2, 2));
        contButton.add(buttonSearch);
        contButton.setLayout(new FlowLayout());
        fName.setFont(new Font("Comic Sans MS", Font.ITALIC, 14));
        fName.setForeground(Color.GREEN);
        contMain.setForeground(Color.GREEN);
    }

    public static void main(String[] arg) {
        new ContFrame();
    }
}

2

Re: Container

А ви впевнені що не змінюється, в мене наприклад  змінюється.

Подякували: koala1

3

Re: Container

truesupport написав:

А ви впевнені що не змінюється, в мене наприклад  змінюється.

Впевнений, бо декілька разів прописував, видаляв, прописував,....
Ось це діє:

fName.setForeground(Color.GREEN);

Ось це ні:

 contMain.setForeground(Color.GREEN);

Тому і не розумію, що ж роблю не так?!

4

Re: Container

я не програмую  на джаві тому не можу тобі сказати з 100% чому так можливо знаючі люди розкажуть. Сюдячи по тому що я побачив це просто не правильна побудована бібліотека свінга чи авт я в тому не розбираюсь. Дивись що я найшов. contMain це Container. Container це Java.awt.Component. А в класі Component  є метод

public void setForeground(Color c) {
        Color oldColor = foreground;
        ComponentPeer peer = this.peer;
        foreground = c;
        if (peer != null) {
            c = getForeground();
            if (c != null) {
                peer.setForeground(c);
            }
        }
        // This is a bound property, so report the change to
        // any registered listeners.  (Cheap if there are none.)
        firePropertyChange("foreground", oldColor, c);
    }

Там видно що є перевірка peer на null. Що таке peer я не знаю але я попробував викликати метод

contMain.getPeer()

і він повертає null. Тобто скорше за все коли ти викликаєш метод setForeground нічого не відбувається (майже нічого). Якщо ти хочеш зразу все поміняти то я б писав якось так.

Component[] components = contMain.getComponents();
        for (Component component : components)
        {
             component.setForeground(Color.green);
        }

5

Re: Container

Не варто змішувати awt компоненти та JSwing. Замість класу Container раджу використовувати JPanel.

метод setForeground доволі часто ігнорується, скоріш за все він спрацьовує лише коли на певний контейнер виводити напряму текст. Ви ж використовуєте мітки, тож якщо хочете змінити колір написів в мітках:

lName.setForeground(Color.RED);

6

Re: Container

volodimirg написав:

Не варто змішувати awt компоненти та JSwing. Замість класу Container раджу використовувати JPanel.

метод setForeground доволі часто ігнорується, скоріш за все він спрацьовує лише коли на певний контейнер виводити напряму текст. Ви ж використовуєте мітки, тож якщо хочете змінити колір написів в мітках:

lName.setForeground(Color.RED);

Просто, якщо багато текстових полів та міток, було б значно легше ними керувати, якщо об'єднувати. Звісно, якщо не знайду правильного варіанту, то буду "фарбувати по одинці".