首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在框架内的小程序顶部绘制

在框架内的小程序顶部绘制
EN

Stack Overflow用户
提问于 2017-01-09 17:16:52
回答 2查看 1.1K关注 0票数 12

我正在尝试创建一个Applet加载程序,我需要在显示的Applet之上绘制,但是我似乎找不到这样做的方法。

我最初的理解是这个Applet,通过扩展组件就像任何常规的java.awt.Component一样,它可以添加到容器中,只是具有越权的油漆方法,但它似乎不起作用。

在初始化代码中,我创建了一个java.awt.Frame,在此基础上添加了java.awt.Container的自定义实现,该实现覆盖了所有的绘制方法,以便它们在调用父方法后在x: 5、y:5填充rect,大小为w:10,h:10。

但是,当添加applet时,它总是这样,不管在所有东西上面都画了什么。

代码语言:javascript
运行
复制
public class AppletTest {

    public static void main(String[] args) {
        Frame frame = new Frame("Applet Test!");

        Container container = new Container() {

            @Override
            public void paint(Graphics g) {
                super.paint(g);
                g.fillRect(5, 5, 10, 10);
            }

            @Override
            public void paintAll(Graphics g) {
                super.paintAll(g);
                g.fillRect(5, 5, 10, 10);
            }

            @Override
            public void paintComponents(Graphics g) {
                super.paintComponents(g);
                g.fillRect(5, 5, 10, 10);
            }

            @Override
            public void print(Graphics g) {
                super.print(g);
                g.fillRect(5, 5, 10, 10);
            }

            @Override
            public void printComponents(Graphics g) {
                super.printComponents(g);
                g.fillRect(5, 5, 10, 10);
            }

            @Override
            public void update(Graphics g) {
                super.update(g);
                g.fillRect(5, 5, 10, 10);
            }

        };

        Dimension dimension = new Dimension(50, 50);
        container.setPreferredSize(dimension);

        Applet applet = new Applet() {
            @Override
            public void paint(Graphics g) {
                super.paint(g);
                g.fillRect(0, 0, 10, 10);
            }
        };

        container.add(applet);

        applet.setBounds(0, 0, 50, 50);


        frame.add(container);
        frame.pack();
        frame.setVisible(true);

        applet.init();
        applet.start();


    }

}

需要采取哪些步骤才能在Applet的基础上从父Container中提取

下面也是运行上述代码的结果的屏幕截图

但是,如果我将applet的类型更改为Component,如

代码语言:javascript
运行
复制
Component applet = new Component() {
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0, 0, 10, 10);
    }
};

结果是正确的

所需解决方案的局限性在于,我不能修改Applet本身,因为它是一个仅以二进制形式提供的遗留组件。我知道可以通过修改字节码来解决这个问题,但是由于Applet的多种风格,这是不可能的。

EN

回答 2

Stack Overflow用户

发布于 2017-01-13 06:33:56

集装箱广场不可见的原因

这是因为小程序的重叠,集装箱的拖网面积。如果设置applet的背景颜色并更改大小,您可以看到这一点:

代码语言:javascript
运行
复制
applet.setBackground(Color.RED);
applet.setBounds(0, 0, 12, 12);

因此,我们可以看到在小程序上绘制的黑色方格下的红色边框(applet的背景):

与您的applet大小和小程序的红色背景完全重叠容器可绘制区域:

如果您将Applet更改为Component,您可以从容器中看到黑方形,因为Component类没有背景。即更改applet变量的类型:

代码语言:javascript
运行
复制
Component applet = new Component() {
//...
};
applet.setBackground(Color.RED);

你可以在实验中看到图像:

在applet上绘图

需要采取哪些步骤才能从其父容器中提取Applet的顶部?

除了直接在applet上绘图外,在applet上绘图是不可能的。

使用GlassPane并不能解决小程序的这个问题。我试过文档中的示例

并替换代码:

代码语言:javascript
运行
复制
contentPane.add(new JButton("Button 1"));
contentPane.add(new JButton("Button 2"));

至:

代码语言:javascript
运行
复制
Applet applet = new Applet() {
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0, 0, 10, 10);
    }
};
applet.setPreferredSize(new Dimension(100, 25));
applet.setBackground(Color.GREEN);
contentPane.add(applet);

因此,我们可以看到applet,它是一个暗圈:

如果将applet变量类型更改为JLanel,则完全绘制圆。

票数 7
EN

Stack Overflow用户

发布于 2017-01-13 16:59:50

正如谢尔盖所说,您的Applet与您的Container重叠,并且由于它有一个背景,所以您无法在Container上看到绘制的矩形。然而,据我所知,不可能将这一背景设置为透明的颜色。您可以看到这些文章,这里这里,它们讨论了主题和可能的解决方案。

当您可以更改applet的代码但不能更改applet类型的情况下,最好的方法

代码语言:javascript
运行
复制
import java.applet.Applet;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;

@SuppressWarnings("serial")
public class AppletTest {
    public static void main(String[] args) {
        Frame frame = new Frame("Applet Test");
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                frame.dispose();
             }
         });

        int apHeight = 50;
        int apWidth = 50;

        Container container = new Container() {
            @Override
            public void paint(Graphics g) {
                super.paint(g);
                Graphics2D graphs = (Graphics2D) g;
                graphs.setBackground(Color.WHITE);
                graphs.clearRect(0, 0, apWidth, apHeight);
                g.setColor(Color.RED);
                g.fillRect(5, 5, 10, 10);
            }
        };

        Dimension dimension = new Dimension(50, 50);
        container.setPreferredSize(dimension);

        frame.add(container);
        frame.pack();
        frame.setVisible(true);

        BufferedImage bufImage = new BufferedImage(dimension.width, dimension.height, BufferedImage.TYPE_INT_RGB);
        container.paint(bufImage.createGraphics());

        Applet applet = new Applet() {
            @Override
            public void paint(Graphics g) {
                super.paint(g);
                g.drawImage(bufImage, 0, 0, this); 
                g.fillRect(0, 0, 10, 10);
            }
        };

        container.add(applet);
        applet.setBounds(0, 0, apWidth, apHeight);
        applet.init();
    }
}

其输出如下所示。

澄清问题的编辑

如果您正在读取文件,最好的方法是声明applet,创建一个图像,然后将图像绘制到applet上。我创建了一个示例,生成二进制文件,然后从它读取对象。然后它会在上面涂上背景。

代码语言:javascript
运行
复制
import java.applet.Applet;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

@SuppressWarnings("serial")
public class AppletTest {
    private static void createBinaryApplet() throws IOException {
        Applet applet = new Applet() {
            @Override
            public void paint(Graphics g) {
                super.paint(g);
                g.fillRect(0, 0, 10, 10);
            }
        };

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("applet.dat"));
        oos.writeObject(applet);
        oos.close();
    }

    public static void main(String[] args) {
        Frame frame = new Frame("Applet Test");
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                frame.dispose();
             }
         });

        final int prefHeight = 50;
        final int prefWidth = 50;

        Container container = new Container() {
            @Override
            public void paint(Graphics g) {
                super.paint(g);
                Graphics2D graphs = (Graphics2D) g;
                graphs.setBackground(Color.WHITE);
                graphs.clearRect(0, 0, prefWidth, prefHeight);
                g.setColor(Color.RED);
                g.fillRect(5, 5, 10, 10);
            }
        };

        container.setPreferredSize(new Dimension(prefWidth, prefHeight));

        frame.add(container);
        frame.pack();
        frame.setVisible(true);

        BufferedImage bufImage = new BufferedImage(prefWidth, prefHeight, BufferedImage.TYPE_INT_RGB);
        container.paint(bufImage.createGraphics());

        try {
            createBinaryApplet();

            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("applet.dat"));
            Applet applet = (Applet) ois.readObject();
            ois.close();

            container.add(applet);
            applet.setBounds(0, 0, prefWidth, prefHeight);
            applet.init();

            Graphics g = applet.getGraphics();
            g.drawImage(bufImage, 0, 0, applet);
            applet.paint(g);
        } catch(ClassNotFoundException | IOException e) {
            System.out.println("Whoops");
        }
    }
}

这将产生与以前相同的输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41553382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档