【问题标题】:DrawImage gone when off screenDrawImage 离开屏幕时消失了
【发布时间】:2014-02-23 08:16:32
【问题描述】:

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

import javax.swing.*;

导入 java.awt.; 导入 java.awt.event.;

公共类 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

【问题讨论】:

  • 请贴出问题代码和截图。我们无法调试我们看不到的东西。
  • 您的问题已被搁置。但这不是永久性的。我建议您改进您的问题,包括添加相关代码和细节。'
  • 我在代码中添加了更多信息以及我的图像问题...
  • @user3342795:我的猜测是正确的——您正在使用通过在组件上调用 getGraphics() 获得的 Graphics 对象进行绘制。请阅读我的答案和链接教程,了解使用 Swing 绘制的正确方法。

标签: java swing


【解决方案1】:

你问:

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

这意味着您的代码中某处存在错误,在您实际上并未向我们展示的代码中。

也许您正在使用通过在组件上调用 getGraphics() 获得的 Graphics 对象进行绘图,但此时我所能做的就是做出疯狂的 A$$ed 猜测。如果您正在这样做,请不要这样做。在组件上调用 getGraphics() 将获得一个不会在重复绘制时持续存在的 Graphics 对象,并且会导致同样不会持续存在的图像。而是在 JFrame 中显示的 JPanel 的 paintComponent(Graphics g) 方法中进行绘制,如 Performing Custom Painting with Swing tutorials 中所述。但最重要的是,请花一点力气提出您的问题,这样我们就不必猜测未见过的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 2011-09-14
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    相关资源
    最近更新 更多