0

JFrame にアイコン イメージを追加する方法を見つけようとしてインターネットを検索してきましたが、エラーが発生し続けます。これがスタック オーバーフローで尋ねられたことは理解していますが、解決策がうまくいきません。これが私のコードです:

    ImageIcon imageIcon = new ImageIcon("src/slime.png");
    ImageIcon image = new ImageIcon("src/slime.gif");

    JLabel label = new JLabel(image, JLabel.CENTER);
    label.setAlignmentX(0);
    label.setAlignmentY(0);
    label.setIcon(image);

    JFrame window = new JFrame("Slime");
    window.setVisible(true);
    window.setSize(250, 200);
    window.setResizable(false);
    window.setIconImage(newImageIcon(getClass().getResource("src/slime.png")).getImage());
    window.add(label);

ここに私が得るエラーがあります: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at javax.swing.ImageIcon.<init>(ImageIcon.java:205) at MainJFrame.<init>(MainJFrame.java:39) at MainJFrame$1.run(MainJFrame.java:18) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727) at java.awt.EventQueue.access$200(EventQueue.java:103) at java.awt.EventQueue$3.run(EventQueue.java:688) at java.awt.EventQueue$3.run(EventQueue.java:686) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:697) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

助けていただければ幸いです。注: window.setIconImage(imageIcon.getImage()); を試しました。しかし、それは機能せず、画面に印刷した他の画像が消えます。

4

4 に答える 4

0

まず、安全上の理由から、メイン メソッドで JFrame を作成しようとしないでください。そのため、一部のソリューションから静的エラーが発生しています。私の意見では、静的は大きな問題です。1 つを静的にするとすぐに、それらすべてが静的になるからです。メイン メソッドではなく、コンストラクターで JFrame を初期化してみてください。main メソッドで新しい MainJFrame オブジェクトを作成するだけです。

public static void main(String[] args){
    MainJFrame frame = new MainJFrame();
}

そして、すべてのコードをコンストラクターに入れます。これが何であるかがわからない場合は、知っておく必要があります。これは次のようになります。

public MainJFrame(){
    //This is a constructor
    //All frame init code in here
}

次に、同じコードをそこに入れますが、引数のnewとの間にスペースを入れます。したがって、コンストラクター全体は次のようになります。ImageIconsetIconImage()

public MainJFrame(){
    ImageIcon imageIcon = new ImageIcon("src/slime.png");
    ImageIcon image = new ImageIcon("src/slime.gif");

    JLabel label = new JLabel(image, JLabel.CENTER);
    label.setAlignmentX(0);
    label.setAlignmentY(0);
    label.setIcon(image);

    JFrame window = new JFrame("Slime");
    window.setVisible(true);
    window.setSize(250, 200);
    window.setResizable(false);
    window.setIconImage(new ImageIcon(getClass().getResource("src/slime.png")).getImage());
    window.add(label); }

それでもうまくいかない場合は、ImageIO を使用してイメージをロードしてみてください。ただし、セキュリティ エラーが発生するため、これはアプレットでは機能しません。

window.setIconImage(ImageIO.read(new File("folder/to/file.png")));

また、この行を throw/catch ブロックで囲む必要があります。Eclipse で作業している場合は、ファイルがメイン パッケージの外のフォルダーにあることを確認してください。それ以外はいいはずです。

于 2013-08-25T16:51:41.630 に答える
0

これを試してみてください、うまくいくはずです

frame.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/src/slime.gif")));

あなたが書いた、

newImageIcon()

これは、コンパイルされているため、メソッドである可能性があります。これは問題かもしれませんnew ImageIcon()。はjavax.swing.ImageIcon作成されていません。

簡単に言えば、なぜあなたは使わないのですか

setIconImage(imageIcon.getImage());

これが完全なコードです。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class IconImageDemo1 extends JFrame
{

    public IconImageDemo1()
    {
        createAndShowGUI();
    }

    private void createAndShowGUI()
    {
        setTitle("IconImage Demo");
        setLayout(new FlowLayout());
        setSize(400,400);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("icons/camera.png")));

        setLocationRelativeTo(null);
    }

    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable(){
            public void run()
            {
                new IconImageDemo1();
            }
        });
    }
}
于 2013-07-17T11:46:11.153 に答える
0

getClassイメージを取得するために使用します。

window.setIconImage(new ImageIcon(
                getClass().getResource("src/slime.png")).getImage());

ただし、ラベルに画像を追加してからフレームにラベルを追加する場合は、代わりにこれを使用します。

Image img = (new ImageIcon(getClass().getResource("src/slime.png"))).getImage();
JLabel lblIcon = new JLabel(new ImageIcon(newimg));
window.add(lblIcon);

画像のサイズをウィンドウのサイズに変更する場合は、次のようにします (ウィンドウに追加する前にコードを配置します)。

Image newimg = img.getScaledInstance(window.getWidth() , window.getHeight(), java.awt.Image.SCALE_SMOOTH);// resizing image to the window size

編集:

getClass()もちろん、メソッドで使用することはできません。たとえば、 public static void main()コードをクラスコンストラクターのような場所に配置する必要があります。non-static

public class MainForm extends javax.swing.JFrame {

/**
 * Creates new form MainForm
 */
public MainForm() {
    //put your code here...
    window.setIconImage(new ImageIcon(
            getClass().getResource("src/slime.png")).getImage());
}
public static void main(String args[]) {
    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
                new MainForm().setVisible(true);
            }
        });
    }

try-catch画像が正しく取得されているかどうかを確認するために、常にブロックすることをお勧めします。この状況では、パッケージ内からコードを取得する必要はありませんが、プロジェクトの外部からリソースを取得する場合は、開始プロセスを確認してください。

于 2013-07-17T10:52:59.107 に答える