Как я могу успешно расширить графику в Java - PullRequest
4 голосов
/ 03 февраля 2009

Я пытаюсь создать универсальный инструмент экспорта графики, который работает за счет реализации графического интерфейса, перехватывает и интерпретирует вызовы его различных методов. Однако, хотя я могу сделать это успешно для одного компонента, мой класс Graphics заменяется, когда я использую его для компонента, который содержит другие компоненты. Странно, но это происходит только в Windows и Linux. На OSX работает нормально.

Кто-нибудь может подсказать, как я могу убедиться, что это мой оригинальный класс Graphics, который передается всем подкомпонентам?

У меня есть короткий сценарий, который демонстрирует фундаментальную проблему. Когда я явно вызываю рисование с использованием экземпляра MyGraphics, я не вижу MyGraphics в JPanel - просто sun.java2d.SunGraphics2D.

import java.awt.*;
import java.awt.image.*;
import java.text.AttributedCharacterIterator;
import javax.swing.*;

public class GraphicsTest {

public static void main(String[] args) {
    new GraphicsTest();
}

public GraphicsTest () {
    JFrame frame = new JFrame();
    frame.getContentPane().add(new MyPanel());
    frame.setSize(500,500);
    frame.setVisible(true);
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {}
    System.out.println("Using my graphics - expect to see 'MyGraphics' next");
    frame.paint(new MyGraphics());

}

class MyPanel extends JPanel {
    public void paint (Graphics g) {
        super.paint(g);
        System.out.println("Graphics is "+g);

        g.fillRect(10, 10, 20, 20);
    }
}

class MyGraphics extends Graphics {

    public String toString () {
        return "MyGraphics";
    }

    public Graphics create() {
        return this;
    }

    // I've left out the huge list of abstract methods from the original script
    // since they're unchanged from the defaults and don't really matter here.
}

В моей системе Windows вывод:

Graphics is sun.java2d.SunGraphics2D[font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=plain,size=12],color=sun.swing.PrintColorUIResource[r=51,g=51,b=51]]
Using my graphics - expect to see 'MyGraphics' next
Graphics is sun.java2d.SunGraphics2D[font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=plain,size=12],color=sun.swing.PrintColorUIResource[r=51,g=51,b=51]]

тогда как под OSX я получаю то, что ожидал, а именно:

Graphics is sun.java2d.SunGraphics2D[font=apple.laf.CUIAquaFonts$DerivedUIResourceFont[family=LucidaGrande,name=LucidaGrande,style=plain,size=13],color=javax.swing.plaf.ColorUIResource[r=0,g=0,b=0]]
Using my graphics - expect to see 'MyGraphics' next 
Graphics is MyGraphics

Что я могу сделать, чтобы во всех случаях я передавал «MyGraphics» соответствующим подкомпонентам?

Ответы [ 2 ]

1 голос
/ 03 февраля 2009

Вот и все! Если я отключу двойную буферизацию на компоненте перед вызовом paint и включу его потом, тогда все будет работать так, как мне нужно.

RepaintManager.currentManager(frame).setDoubleBufferingEnabled(false);
frame.paint(new MyGraphics());
RepaintManager.currentManager(frame).setDoubleBufferingEnabled(true);

Спасибо.

1 голос
/ 03 февраля 2009

Не знаю наверняка, но я подозреваю, что, поскольку Swing имеет двойную буферизацию в Java в Windows (а не в диспетчере окон в OS X), вы будете рисовать не графику, а Graphics2D обеспечивается за пределами экрана буфера, а затем blt для вашей графики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...