当前位置: 首页 > 知识库问答 >
问题:

DrawImage在屏幕外消失

王声
2023-03-14

最近,我一直在构建一个应用程序,在JFrame上绘制图像,一切都很好,但是当窗口离开屏幕时,已经绘制的图像消失了,我一直在想是否有办法避免这种情况?谢谢

import javax.swing.*;

导入java。awt。;导入java。awt。事件

公共类Pokemoneur扩展了JFrame,实现了AdjustmentListener、ActionListener、MouseListener和Runnable{

private JButton a = new JButton("Reset");
private int nbi = 7;
private JPanel frame;
private int n;

private int x2, y2;
private static int temp2;
private Object src;
private Thread t;
private JButton[] v = new JButton[nbi];
private ImageIcon[] imagei = new ImageIcon[7];
private JPanel canevas = new JPanel();
private JTextField nombre = new JTextField(7);
private JScrollBar js = new JScrollBar(0, 0, 0, 0, 100);
private JPanel panboutton = new JPanel(new GridLayout(1, 8));
private JPanel panjs = new JPanel(new BorderLayout(5, 5));
private JPanel frame2 = new JPanel(new GridLayout(2, 1, 5, 5));
private Graphics g;

public Pokemoneur() {

    startGUI();
    list();
    this.setVisible(true);
}

public void startGUI() {
    int max = 1000;
    frame = (JPanel) this.getContentPane();
    for (int i = 0; i < imagei.length; i++) {

    }

    frame.add(canevas);

    frame.add(frame2, "North");
    frame2.add(panboutton);
    frame2.add(panjs);
    js.setValue(6);
    nombre.setText("" + js.getValue());
    for (int i = 0; i < nbi; i++) {
        imagei[i] = new ImageIcon(getClass()
                .getResource("pok" + i + ".png"));
        v[i] = new JButton(imagei[i]);

        panboutton.add(v[i]);
    }

    panjs.add(js);
    js.setMaximum(max);
    panjs.add(nombre, "East");

    frame.setPreferredSize(new Dimension(500, 500));

    frame.setBorder(BorderFactory.createTitledBorder("Marc André 2014"));
    panjs.setBorder(BorderFactory.createTitledBorder("Numbers of Pokemons"));
    canevas.setBorder(BorderFactory.createTitledBorder("Party"));

    frame.add(a, "South");

    g = canevas.getGraphics();
    this.pack();
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);

}

public void run() {

    for (int i = 0; i < v.length; i++) {
        if (src == v[i]) {

            for (int j = 0; j < js.getValue(); j++) {
                int x = (int) (Math.random() * canevas.getWidth());
                int y = (int) (Math.random() * canevas.getHeight());
                int n = 0;
                do {
                    n = (int) (Math.random() * nbi);
                } while (n == i);
                if (x > 80)
                    x -= 80;
                if (y > 80)
                    y -= 80;

                g.drawImage(imagei[n].getImage(), x, y, null);

            }
            x2 = (int) (Math.random() * canevas.getWidth());
            y2 = (int) (Math.random() * canevas.getHeight());
            if (x2 > 80)
                x2 -= 80;
            if (y2 > 80)
                y2 -= 80;

            g.drawImage(imagei[i].getImage(), x2, y2, null);

            temp2 = i;
            do {
                n = (int) (Math.random() * nbi);
            } while (n == temp2);

            g.drawImage(imagei[n].getImage(), x2 + 13, y2, null);
        }
    }
}

public void list() {
    js.addAdjustmentListener(this);
    for (int i = 0; i < nbi; i++) {
        v[i].addActionListener(this);
    }
    a.addActionListener(this);
    canevas.addMouseListener(this);
}

public void adjustmentValueChanged(AdjustmentEvent x) {
    nombre.setText("" + js.getValue());
}

public void actionPerformed(ActionEvent ae) {
    src = ae.getSource();
    if (src == a) {
        try {
            g.setColor(canevas.getBackground());
            g.fillRect(0, 0, canevas.getWidth(), canevas.getHeight());
            t.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } else {
        g = canevas.getGraphics();
        g.setColor(canevas.getBackground());
        g.fillRect(0, 0, canevas.getWidth(), canevas.getHeight());
        t = new Thread(this);
        t.start();
    }
}

@Override
public void mouseClicked(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {
    int x = e.getX();
    int y = e.getY();
    System.out.println(x2 + "," + y2 + "\n" + x + " " + y);
    // if((x>=x2 && x<=x2+80)&&(x>=x2 && y<=y2+80)){
    if ((x >= x2 && x <= x2 + 80) && (y >= y2 && y <= y2 + 80)) {
        System.out.println("True");
        g.setColor(canevas.getBackground());
        g.fillRect(0, 0, canevas.getWidth(), canevas.getHeight());
        System.out.println("in");
        g.drawImage(imagei[temp2].getImage(), x2, y2, null);

        System.out.println(temp2);
        System.out.println("end");
    } else {
        System.out.println("false");
    }

}

@Override
public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

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

}问题是,当用户在屏幕上画出图像后移动Jframe时,图像不会停留。。。

之前:http://i.stack.imgur.com/KHIvm.png之后:http://i.stack.imgur.com/koZSI.png

共有1个答案

臧友樵
2023-03-14

你问:

但当窗口离开屏幕时,已经绘制的图像消失了,我一直在想是否有办法避免这种情况?

这意味着你在代码中的某个地方有一个错误,在你实际上没有向我们展示的代码中。

也许您正在使用通过调用组件上的getGraphics()获得的图形对象进行绘制,但此时我所能做的就是进行一个疯狂的猜测。如果要这样做,请不要这样做。在组件上调用getGraphics(),将得到一个在重复绘制中不会持久的图形对象,并将生成同样不会持久的图像。而是使用JFrame中显示的JPanel的paintComponent(Graphics g)方法进行绘制,如使用Swing执行自定义绘制教程中所述。但最重要的是,请在提问时稍微努力一点,这样我们就不必猜测代码没有被看到。

 类似资料:
  • 有没有办法绕过的正常行为及其屏幕外页限制?我的包含四个,每个片断包含一个图像。我遇到的问题是,在实例化时,会创建两个,这导致从catch同时下载/提取大约20个图像(每个片断大约10个)。是否可以禁用屏幕外页限制? 我的目标是只在选择时下载图像,或者只在用户悬停图像时下载图像。实现这一点的一种方法是使用侦听器并设置一个标志,该标志告诉是否允许下载图像。 我能想到的第二种方法是在上设置一个,并且只在

  • 我有旧式菜单应用程序。在改变主题到全息和切换目标SDK版本到14后,软菜单按钮消失了(这是好的),但使用菜单按钮在操作栏显示文本菜单大部分离屏幕,你可以看到在附上的图像。你有什么办法解决这个问题吗? 我已经解决了。清单参数中有问题: 在改变了任何否认为真之后,这个问题就消失了。

  • 我想知道是否有一个用于HighChart的Java API(不是导出API),它可以根据提供的参数生成svg,然后可以使用Batik转换为png,而无需靠近HTTP请求。 目前,我能想到的唯一方法是发布到一个带有图表点的虚拟页面,然后导出到SVG并提交到带有Javascript的导出服务,Javascript将其转换为带有蜡染的PNG,然后以图像流的形式返回。 然而,我所需要的只是从数据库中获取由

  • 问题内容: 我已经有了典型的下拉导航,并且试图确保下拉菜单链接始终可访问和可见: CSS确实没有什么特别的(删除了颜色和背景): 顶级链接数量未知(由用户创建)。我遇到的问题是,如果顶层链接距离右侧太远,有时下拉菜单(位于右侧)将不在屏幕上。我添加了以下CSS来补偿: 现在,最后一个位于屏幕左侧,而不是离开屏幕,这很不错,但是存在一些问题: 对于上一个链接,我并不总是需要这些样式,因为它并不总是在

  • screen 模块用于检索有关屏幕大小,显示,光标位置等的信息 进程: 主进程 渲染进程​ screen 是一个 EventEmitter. 注意: app模块必须用在 ready事件后. 注意: 在渲染进程或开发者工具栏中, window.screen 是一个预设值的 DOM属性, 所以 var screen = require('electron').screen 这样写的话是无效的. 创建一