4

アプリケーション用のスプラッシュ画面を作成しています。これは、Graphics2Dによって描画された静的なBufferedImageであり、装飾のないJFrame内にあります。私の問題は、ウィンドウが正しく描画されないことがあるということです。つまり、ウィンドウに常に私の画像が含まれているとは限らず、灰色になっていることもあります。すでに2番目のスレッドでスプラッシュ画面を作成しようとしましたが、役に立ちませんでした。私はすべての行を呼び出すことができsplashScreen.repaint()ましたが、それはナンセンスです...これが私のコードです:

package SeriousSteve.MapEditor;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;

/**
 * Simple splash screen, contains only the image.
 * 
 * @author m4tx3
 */
public class SplashScreen extends JFrame {

    private BufferedImage image;

    /**
     * Constructor. Creates a window with splash screen, loads an image at the
     * URL specified in imageURL, and finally displays this image.
     * 
     * @param imageURL  URL to the image that you want to put on the splash
     *                  screen.
     */
    public SplashScreen() {
        super("Splash screen");
    }

    public void createSplashScreen(final URL imageURL) {
        try {
            image = ImageIO.read(imageURL);
        } catch (IOException ex) {
            Logger.getLogger(SplashScreen.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
        setUndecorated(true);
        setSize(image.getWidth(), image.getHeight());
        setLocationRelativeTo(null);
        setVisible(true);

        createGraphics();

        repaint();
    }

    /**
     * Creates a graphics context and draws a splash screen.
     */
    private void createGraphics() {
        Graphics2D g = (Graphics2D) getGraphics();
        g.drawImage(image, 0, 0, null);
    }

    /**
     * Closes the splash screen and frees the memory taken by the image.
     * 
     * Call this function when the loading is complete.
     */
    public void close() {
        setVisible(false);
        image = null;
        dispose();
    }
}

と:

    SplashScreen splashScreen = new SplashScreen();
    splashScreen.createSplashScreen(getClass().getResource(
            "Img/splash.png"));

ところで、-1つのjarファイルに2つのアプリ(ゲームとマップエディター)があるため、独自のスプラッシュスクリーンクラスを作成しています...マップエディターでのみスプラッシュスクリーンを表示したいので、マニフェストファイルを変更しません。

よろしく

4

3 に答える 3

5

JLabel代わりに使用してください。フレームに直接ペイントするのは悪い考えです。

これを参照してください、それは毎回動作します:

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

/**
 * Simple splash screen, contains only the image.
 * 
 * @author m4tx3
 */
public class SplashScreen extends JFrame {

    /**
     * Constructor. Creates a window with splash screen, loads an image at the URL specified in imageURL, and finally displays this image.
     * 
     * @param imageURL
     *            URL to the image that you want to put on the splash screen.
     */
    public SplashScreen() {
        super("Splash screen");
    }

    public void createSplashScreen(final URL imageURL) {

        JLabel splashLabel = new JLabel(new ImageIcon(imageURL));
        add(splashLabel);
            setSize(splashLabel.getPreferredSize());
        setUndecorated(true);
        setLocationRelativeTo(null);
        setVisible(true);

        repaint();
    }

    /**
     * Closes the splash screen and frees the memory taken by the image.
     * 
     * Call this function when the loading is complete.
     */
    public void close() {
        setVisible(false);
        dispose();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                try {
                    new SplashScreen().createSplashScreen(new URL(
                            "http://art.gnome.org/download/themes/splash_screens/1334/Splash-GnomeDarkSplashScreen.png"));
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }
}
于 2012-05-09T17:49:39.520 に答える
4

1)g.drawImage(image, 0, 0, null);

する必要があります

g2d.drawImage(img, 0, 0, img.getWidth(), img.getHeight(), SplashScreen.this);

からのコード

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JWindow;

public class SplashScreen extends JWindow {
  private JProgressBar bar;
  private JLabel label;

  public SplashScreen(final BufferedImage img) {
    JPanel panel = new JPanel() {
      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();

        g2d.drawImage(img, 0, 0, img.getWidth(), img.getHeight(),
            SplashScreen.this);
      }
    };
    panel.setPreferredSize(new Dimension(img.getWidth(), img.getHeight()));

    Container content = getContentPane();
    content.setLayout(new BorderLayout());
    content.add(panel, BorderLayout.NORTH);
    content.add(label = new JLabel(), BorderLayout.CENTER);
    content.add(bar = new JProgressBar(), BorderLayout.SOUTH);
    pack();
    setLocationRelativeTo(null);
  }

  public void setMessage(String msg) {
    label.setText(msg);
    pack();
  }

  public void setProgress(int prog) {
    bar.setValue(prog);
  }

  public void setIndeterminateProgress(boolean value){
    bar.setIndeterminate(value);
  }
}

2)JFrameではなく使用JWindowすることをお勧めします(チュートリアルから)undecorated JDialog

于 2012-05-09T17:52:25.643 に答える
0

paint独自のを作成する代わりに、メソッドをオーバーライドしますGraphics

@Override
public void paint(Graphics g) {
    g.drawImage(image, 0, 0, null);
}

を呼び出すたびrepaintに、このメソッドが呼び出されます。デフォルトでは、このメソッドはJFrame背景色(灰色)で塗りつぶします。

于 2012-05-09T17:44:39.980 に答える