Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Font в потомке JPanel


Автор: Mirkes 23.1.2012, 07:21
Возникла забавная проблема. Нужно сменить шрифт в потомке JPanel. 
Код потомка ниже
Код

package mymathDraw;

import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.font.LineMetrics;

import javax.swing.JPanel;


public class MainPanel extends JPanel {
    private String data;

    public MainPanel() {
        super(null);
        setFont(new Font("Lucida Sans Unicode", 0, 14));
    }

    public void setData(String data) {
        this.data = data;
        System.out.println("setDta  " + getGraphics().getFont().getFamily());
        repaint();
    }


    public void paint(Graphics g) {
        System.out.println("" + g.getFont().getFamily());
        g.setFont(new Font("Lucida Sans Unicode", 0, 14));
        g.clearRect(0, 0, this.getWidth(), this.getHeight());
            // font test
            Font f = g.getFont();
            System.out.println("" + f.getFamily());
    }
}


При запуске в консоль выводится
Lucida Sans Unicode

При каждом вызове метода setData выводится
setDta  Lucida Sans Unicode
Dialog
Lucida Sans Unicode

Помогите понять, какого лешего возникает фонт Dialog, кто и когда его указывает?

Запускал как из под JDeveloper так и из консоли.

Автор: jk1 23.1.2012, 08:07

M
jk1

Mirkes, 

Выбирайте пожалуйста раздел правильно, все-таки не первый день на форуме.



Код

Помогите понять, какого лешего возникает фонт Dialog, кто и когда его указывает?


Рискну предположить, что он задан в Graphics на основании текущего LAF. А поскольку super.paint(g) Вы вызвать забыли, то значения свойства font компонента не устанавливается в Graphics.

Автор: Mirkes 23.1.2012, 08:45
Цитата(jk1 @  23.1.2012,  08:07 Найти цитируемый пост)
Mjk1Mirkes, Выбирайте пожалуйста раздел правильно, все-таки не первый день на форуме

Честно говоря сомневася в какой раздел отнести. Прошу прощения.


Цитата(jk1 @  23.1.2012,  08:07 Найти цитируемый пост)
Рискну предположить, что он задан в Graphics на основании текущего LAF. А поскольку super.paint(g) Вы вызвать забыли, то значения свойства font компонента не устанавливается в Graphics. 

Я, честно говоря полагал, что достаточно установить font в инициации панели (конструкторе). В Paint я стал устанавливать фонт после того, как не помогла установка в инициаторе. smile 

Кроме того, вызов super.paint(g) я не забыл. Он у меня закоментирован, поскольку при его вызове все написанное в paint стирается. Причина стирания для меня загадка smile 

Если поможете разобраться с этими чудесами буду очень признателен.

Автор: jk1 23.1.2012, 10:46
У меня Ваш пример после добавления super.paint(); все рисует как надо

Код

public class MainPanel extends JPanel {

    private static MainPanel panel = new MainPanel();

    private String data = "default";

    public MainPanel() {
        setFont(new Font("Lucida Sans Unicode", 0, 14));
    }
    public void setData(String data) {
        this.data = data;
        repaint();
    }
    public void paint(Graphics g) {
        super.paint(g);
        g.clearRect(0, 0, this.getWidth(), this.getHeight());
        System.out.println(g.getFont());
        g.drawString(data, 5,50);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setContentPane(panel);
        frame.setBounds(100,100, 300, 100);
        frame.setVisible(true);
        panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                panel.setData("custom");
            }
        });
    }
}


Может Вы super.paint(); в конец метода писали?

Автор: Mirkes 23.1.2012, 12:13
Цитата(jk1 @  23.1.2012,  10:46 Найти цитируемый пост)
Может Вы super.paint(); в конец метода писали? 

Точно, в конце.
Поставил в начало все заработало. Большое спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)