سؤال

والتعزيز الأداء تنفيذها إذا: - الحصول على صورة متوافقة من GraphicsConfiguration الاعتماد على - تمكين خط أنابيب بينغل في 1.5: غير ممكن بسبب القطع الأثرية شديدة

وحتى الآن أنا بخير، عنق الزجاجة لمحة الرئيسي من هذا البرنامج هو رسم صورة مع عدة آلاف من البلاط. ومما يؤسف له أنها ليست منتظمة، آخر أنا ببساطة يمكن وضع بكسل وتوسيع نطاقها. I accerelated الصورة مع VolatileImages والروتين تقديم الخاصة (تجاهل إعادة رسم واستدراجه نفسه مع جهاز توقيت). وكانت النتيجة مرضية وأنه يكفي، ولكن: اختيار JMenu التي تحوم عادة على جزء من الصورة هو بالانزعاج الشديد لأن JMenu غير المكشوف. تعذر تغيير Inacceptable والتخطيط.

وحاولت GLJPanel من JOGL، ولكن لا يوجد تحسن أداء مرئية. حتى لا يكون هناك possibitlity استخدام VolatileImages (أو غيرها من المكونات lightweighted accerelated مثل GLCanvas) ولا يزال الحصول على عرض JMenu طبيعي وإذا كانت الإجابة بنعم، كيف؟

هل كانت مفيدة؟

المحلول

هل يمكن أن محاولة تعيين بالنوافذ لغير leightweight. أنا لست متأكدا تماما ما اذا كان يعمل ولكن ما في وسعها، لأن المنبثقة عنصرا الأصلي ثم ولن يكون مكشوفا. وضع بالنوافذ إلى الوزن الثقيل: JPopupMenu.setDefaultLightWeightPopupEnabled (كاذبة)

ومزيد من المعلومات: خلط المكونات الثقيلة والخفيفة

نصائح أخرى

وهنا بعض رمز المثال:

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.VolatileImage;
import java.io.File;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

public final class FastDraw extends JFrame {

    private static final transient double NANO = 1.0e-9;
    private BufferStrategy bs;
    private BufferedImage frontImg;
    private BufferedImage backImg;
    private int PIC_WIDTH,
    PIC_HEIGHT;
    private Timer timer;

    public FastDraw() {
        timer = new Timer(true);
        JMenu menu = new JMenu("Dummy");
        menu.add(new JMenuItem("Display me !"));
        menu.add(new JMenuItem("Display me, too !"));
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(menu);
        setJMenuBar(menuBar);
        setIgnoreRepaint(true);
        setVisible(true);

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                super.windowClosing(evt);
                timer.cancel();
                dispose();
                System.exit(0);
            }
        });

        try {
            backImg = javax.imageio.ImageIO.read(new File(<insert a jpg picture here>));
            frontImg = javax.imageio.ImageIO.read(<here, too>));
        }
        catch (IOException e) {
            System.out.println(e.getMessage());
        }

        PIC_WIDTH = backImg.getWidth();
        PIC_HEIGHT = backImg.getHeight();
        setSize(PIC_WIDTH, PIC_HEIGHT);

        createBufferStrategy(1); // Double buffering
        bs = getBufferStrategy();
        timer.schedule(new Drawer(),0,20);

    }

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

    private class Drawer extends TimerTask {
        private VolatileImage img;

        public void run() {
            long begin = System.nanoTime();
            Graphics2D  g  = (Graphics2D) bs.getDrawGraphics();
            GraphicsConfiguration gc = g.getDeviceConfiguration();

            if (img == null)
                img = gc.createCompatibleVolatileImage(PIC_WIDTH, PIC_HEIGHT);

            Graphics2D g2 = img.createGraphics();

            do {
                int valStatus = img.validate(gc);

                if (valStatus == VolatileImage.IMAGE_OK)
                    g2.drawImage(backImg,0,0,null);
                else {
                    g.drawImage(frontImg, 0, 0, null);
                }
                // volatile image is ready
                g.drawImage(img,0,50,null);
                bs.show();
            } while (img.contentsLost());
        }
    }
}

وتغيير حجم نافذة لجعل JMenuBar مرئية. محاولة لتحديد نقطة القائمة. ترى؟

حسنا، أنا لست متأكدا إذا كنت أفهم تماما مشكلتك ولكن يبدو أن المشكلة الرئيسية هي مع إعادة طلاء اللوحة حيث يتم عرض الصورة. يجب أن يرجى تقديم الرسم روتينك الذي يستمد الصورة على لوحة؟

scroll top