【问题标题】:How to set the JFrame's icon using a raw path to local storage如何使用本地存储的原始路径设置 JFrame 的图标
【发布时间】:2014-07-17 16:58:44
【问题描述】:

我需要一些帮助,将 JFrame 的标题栏图标设置为在我的计算机中找到的图像。

我意识到计算器不完整。我仍然需要添加操作,但我只想先执行此操作。

如果您可以专注于实际问题,那将是令人震惊的。请不要建议设置特定的 CLASSPATH 之类的东西。我想使用相对位置和排序从我的计算机中获取图片。我之前尝试过使用相对位置,但是失败了。

这个程序是在 BlueJ 上完成的,只是出于个人喜好。

图片尝试的代码在Calculator方法下...

文件路径为“C:/Users/Charlie/Downloads/smiley.png

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.BorderFactory.*;
import java.lang.*;

public class Calculator{
    JFrame f = new JFrame("Calculator");
    private String word = "";
    JTextField tf = new JTextField("0");
    public static void main(){
        Calculator Run = new Calculator();
    }
    public Calculator(){
        //URL url = new URL("file:/C:/Users/Charlie/Downloads/smiley.png");
        try{
            javax.swing.UIManager.setLookAndFeel(new
                com.sun.java.swing.plaf.windows.WindowsLookAndFeel());
        }catch(Exception e){}
        ImageIcon img = new ImageIcon("file:/C:/Users/Charlie/Downloads/smiley.png");
        f.setIconImage(img.getImage());
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setResizable(false);

        JButton one, two, three, four, five, six, seven, eight, nine, zero, back, ce;
        one = new JButton("1");
        two = new JButton("2");
        three = new JButton("3");
        four = new JButton("4");
        five = new JButton("5");
        six = new JButton("6");
        seven = new JButton("7");
        eight = new JButton("8");
        nine = new JButton("9");
        zero = new JButton("0");
        back = new JButton("<-");
        ce = new JButton("CE");
        one.setPreferredSize(new Dimension(50, 40));
        two.setPreferredSize(new Dimension(50, 40));
        three.setPreferredSize(new Dimension(50, 40));
        four.setPreferredSize(new Dimension(50, 40));
        five.setPreferredSize(new Dimension(50, 40));
        six.setPreferredSize(new Dimension(50, 40));
        seven.setPreferredSize(new Dimension(50, 40));
        eight.setPreferredSize(new Dimension(50, 40));
        nine.setPreferredSize(new Dimension(50, 40));
        zero.setPreferredSize(new Dimension(50, 40));
        back.setPreferredSize(new Dimension(50, 40));
        ce.setPreferredSize(new Dimension(50, 40));
        one.setActionCommand("1");
        two.setActionCommand("2");
        three.setActionCommand("3");
        four.setActionCommand("4");
        five.setActionCommand("5");
        six.setActionCommand("6");
        seven.setActionCommand("7");
        eight.setActionCommand("8");
        nine.setActionCommand("9");
        zero.setActionCommand("0");
        back.setActionCommand("back");
        ce.setActionCommand("ce");
        one.addActionListener(al);
        two.addActionListener(al);
        three.addActionListener(al);
        four.addActionListener(al);
        five.addActionListener(al);
        six.addActionListener(al);
        seven.addActionListener(al);
        eight.addActionListener(al);
        nine.addActionListener(al);
        zero.addActionListener(al);
        back.addActionListener(al);
        ce.addActionListener(al);
        one.addKeyListener(kl);
        two.addKeyListener(kl);
        three.addKeyListener(kl);
        four.addKeyListener(kl);
        five.addKeyListener(kl);
        six.addKeyListener(kl);
        seven.addKeyListener(kl);
        eight.addKeyListener(kl);
        nine.addKeyListener(kl);
        zero.addKeyListener(kl);
        back.addKeyListener(kl);
        ce.addKeyListener(kl);
        f.addKeyListener(kl);

        tf.setPreferredSize(new Dimension(130, 25));
        tf.setEditable(false);
        tf.setHorizontalAlignment(JTextField.RIGHT);

        TitledBorder t0, t1, t2;
        t0 = BorderFactory.createTitledBorder(" Input ");
            t1 = BorderFactory.createTitledBorder(" Operations ");
        t2 = BorderFactory.createTitledBorder(" Output ");

        JPanel p0, p1, p2, p3, p4, p5, p6;
        p0 = new JPanel();
        p1 = new JPanel();
        p2 = new JPanel();
        p3 = new JPanel();
        p4 = new JPanel();
        p5 = new JPanel();
        p6 = new JPanel();
        p0.add(tf);
        p0.setBorder(t2);
        p1.add(one); p1.add(two); p1.add(three);
        p2.add(four); p2.add(five); p2.add(six);
        p3.add(seven); p3.add(eight); p3.add(nine);
        p4.add(ce);p4.add(zero); p4.add(back);
        p5.add(p1); p5.add(p2); p5.add(p3); p5.add(p4);
        p5.setLayout(new BoxLayout(p5, BoxLayout.PAGE_AXIS));
        p5.setBorder(t0);
        p6.add(p0); p6.add(p5);
        p6.setLayout(new BoxLayout(p6, BoxLayout.PAGE_AXIS));
        p6.addKeyListener(kl);

        f.add(p6);
        f.pack();
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        f.setLocation(dim.width/2 - f.getSize().width/2, dim.height/2 - f.getSize().height/2);
        f.setVisible(true);
    }
    KeyListener kl = new KeyAdapter(){
        public void keyPressed(KeyEvent e){
            if(word.length() == 1 && word.equals("0")){
                word = "";
            }
            if(e.getKeyCode() == KeyEvent.VK_1)
                word += "1";
            else if(e.getKeyCode() == KeyEvent.VK_2)
                word += "2";
            else if(e.getKeyCode() == KeyEvent.VK_3)
                word += "3";
            else if(e.getKeyCode() == KeyEvent.VK_4)
                word += "4";
            else if(e.getKeyCode() == KeyEvent.VK_5)
                word += "5";
            else if(e.getKeyCode() == KeyEvent.VK_6)
                word += "6";
            else if(e.getKeyCode() == KeyEvent.VK_7)
                word += "7";
            else if(e.getKeyCode() == KeyEvent.VK_8)
                word += "8";
            else if(e.getKeyCode() == KeyEvent.VK_9)
                word += "9";
            else if(e.getKeyCode() == KeyEvent.VK_0)
                word += "0";
            else if(word.length() > 1 && e.getKeyCode() == KeyEvent.VK_BACK_SPACE){
                word = word.substring(0, word.length()-1);
            }
            else if((word.length() == 1 && e.getKeyCode() == KeyEvent.VK_BACK_SPACE) || 
                     e.getKeyCode() == KeyEvent.VK_CONTROL ||
                    (word.length() == 0 && e.getKeyCode() == KeyEvent.VK_BACK_SPACE))
                word = "0";
            else
                word = word;

            tf.setText(word);
        }
    };
    ActionListener al = new ActionListener(){
        public void actionPerformed(ActionEvent e){
            String action = e.getActionCommand();
            if(word.length() == 1 && word.equals("0")){
                word = "";
            }
            if(action.equals("1"))
                word += "1";
            else if(action.equals("2"))
                word += "2";
            else if(action.equals("3"))
                word += "3";
            else if(action.equals("4"))
                word += "4";
            else if(action.equals("5"))
                word += "5";
            else if(action.equals("6"))
                word += "6";
            else if(action.equals("7"))
                word += "7";
            else if(action.equals("8"))
                word += "8";
            else if(action.equals("9"))
                word += "9";
            else if(action.equals("0"))
                word += "0";
            else if(word.length() > 1 && action.equals("back")){
                word = word.substring(0, word.length()-1);
            }
            else if((word.length() == 1 && action.equals("back")) || action.equals("ce") ||
                     (word.length() == 0 && action.equals("back")))
                word = "0";
            tf.setText(word);
        }
    };
}


编辑 (0)

好吧,我找到了获取图像的替代解决方案。我仍然不确定如何在没有参考的情况下抓取图像。我最终制作了一个单独的类来抓取图像,加载它们并将它们拉入以供使用。这是图像类的代码:

import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ImageMake{
    private String path;
    private int[] pixels;
    public BufferedImage img;
    // You can make img static depending on how you use it.

    public ImageMake(String path){
        this.path = path;
        load();
    }
    public void load(){
        try{
            img = ImageIO.read(ImageMake.class.getResource(path));
            int w = img.getWidth();
            int h = img.getHeight();
            pixels = new int[w * h];
            img.getRGB(w, h, 0, 0, pixels, 0, w);
        }catch(IOException e){e.printStackTrace();}
    }
}

在我继续之前,我想说ImageMake.class 部分可以替换为getClass(),所以声明最终会是:

img = ImageIO.read(getClass().getResource(path));

所以现在,在另一个班级,你会按照以下方式做一些事情:

// Your code...
ImageMake image = new ImageMake("/res/textures/smiley.png");
genericJFrame.setIconImage(image.img); // This is just a random JFrame
// More of your code...

所以现在我将讨论一些以前从未在 java 中处理过图像的人(如我自己)应该知道的重要事情。

请记住,在我上面发布的 ImageMake 类中,有这样的代码:

img = ImageIO.read(ImageMake.class.getResource(path));

那么 ImageMake.class 部分引用了你的类在你使用的任何存储设备上的文件夹。

就我而言,ImageMake 类位于目录中:C:\Users\Charlie\Documents\Overall

在同一个文件夹中,我创建了另一个名为“res”的文件夹,然后在该文件夹中创建了另一个名为“textures”的文件夹,然后添加了一个名为“smiley.png”的 .png 图像

当您传入图像的字符串“路径”时,它会在您的班级所在的文件夹中开始搜索。在我的情况下,我必须传入“/res/textures/smiley.png”确保您使用的是正斜杠“/”,否则您可能会收到编译时错误“非法转义字符”或一些运行时错误。

因此,访问我的图像的整体代码外目录最终是:C:\Users\Charlie\Documents\Overall\res\textures\smiley.png

这是主类的半成品代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.BorderFactory.*;
import javax.swing.JApplet;
import java.util.ArrayList;

public class Calculator{
    private static JFrame f;
    private Font font;
    private boolean x = false, y = false;
    private double num, num1, num2, num3, ans;
    private int c = 0;
    private String word = "", save = "", keep = "";
    private JTextField tf = new JTextField("0");
    private static JPanel p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14;
    //private static ImageMake img = new ImageMake("/res/textures/smiley.png");
    public Calculator(){
        f = new JFrame("Calculator");
        try{
            javax.swing.UIManager.setLookAndFeel(new
                com.sun.java.swing.plaf.windows.WindowsLookAndFeel());
        }catch(Exception e){}
        ArrayList<String> titles = new ArrayList<String>();
        ArrayList<JButton> buttons = new ArrayList<JButton>();
        for(int i = 0; i < 10; i++){
            titles.add("" + i);
        }
        titles.add("C");
        titles.add(".");
        titles.add("/");
        titles.add("*");
        titles.add("+");
        titles.add("-");
        titles.add("<");
        titles.add("=");

        for(int i = 0; i < titles.size(); i++){
            buttons.add(new JButton(titles.get(i)));
            buttons.get(i).addKeyListener(kl);
            buttons.get(i).addActionListener(al);
            buttons.get(i).setFocusable(false);
            if(i > 11 && i < 16)
            buttons.get(i).setPreferredSize(new Dimension(40, 40));
        else if(i > 15)
            buttons.get(i).setPreferredSize(new Dimension(85, 40));
        else
            buttons.get(i).setPreferredSize(new Dimension(50, 40));
        }

        font = new Font(Font.MONOSPACED, Font.PLAIN, 24);
        tf.setPreferredSize(new Dimension(290, 60));
        tf.setEditable(false);
        tf.setHorizontalAlignment(JTextField.RIGHT);
        tf.setFont(font);

        TitledBorder t0, t1, t2, t3;
        t0 = BorderFactory.createTitledBorder(" INPUT ");
        t1 = BorderFactory.createTitledBorder(" OPERATIONS ");

        p0 = new JPanel();
        p1 = new JPanel();
        p2 = new JPanel();
        p3 = new JPanel();
        p4 = new JPanel();
        p5 = new JPanel();
        p6 = new JPanel();
        p7 = new JPanel();
        p8 = new JPanel();
        p9 = new JPanel();
        p10 = new JPanel();
        p11 = new JPanel();
        p12 = new JPanel();
        p13 = new JPanel();
        p14 = new JPanel();

        p0.add(tf);
        p14.add(p0);
        p1.add(buttons.get(1)); p1.add(buttons.get(2)); p1.add(buttons.get(3));
        p2.add(buttons.get(4)); p2.add(buttons.get(5)); p2.add(buttons.get(6));
        p3.add(buttons.get(7)); p3.add(buttons.get(8)); p3.add(buttons.get(9));
        p4.add(buttons.get(10)); p4.add(buttons.get(0)); p4.add(buttons.get(11));
        p5.add(p1); p5.add(p2); p5.add(p3); p5.add(p4);
        p5.setLayout(new BoxLayout(p5, BoxLayout.PAGE_AXIS));
        p5.setBorder(t0);
        p6.add(buttons.get(16));
        p7.add(buttons.get(12)); p7.add(buttons.get(13));
        p8.add(buttons.get(14)); p8.add(buttons.get(15));
        p9.add(buttons.get(17));
        p10.add(p6); p10.add(p7); p10.add(p8); p10.add(p9);
        p10.setLayout(new BoxLayout(p10, BoxLayout.PAGE_AXIS));
        p10.setBorder(t1);
        p11.add(p5); p11.add(p10);
        p12.add(p14); p12.add(p11);
        p12.setLayout(new BoxLayout(p12, BoxLayout.PAGE_AXIS));

        f.addKeyListener(kl);
        f.add(p12);
    }
    public static void main(){
        new Calculator();
        f.setResizable(false);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //f.setIconImage(img.img);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setFocusable(true);
        f.setVisible(true);
    }
    public void operationType(String operation){
        if(operation.equals("=")){
            num2 = num3;
            operation = keep;
        }
        switch(operation){
            case "/": num = (num1 / num2); word = "" + num; break;
            case "*": num = (num1 * num2); word = "" + num; break;
            case "+": num = (num1 + num2); word = "" + num; break;
            case "-": num = (num1 - num2); word = "" + num; break;
        }
        num1 = num;
    }
    KeyListener kl = new KeyAdapter(){
        public void keyPressed(KeyEvent e){
            int press = e.getKeyCode();
            if(!word.equals("") && !word.equals("/") && !word.equals("*") && !word.equals("+") && !word.equals("-") && !word.equals(".")) ans = Double.parseDouble(word);
            if((word.equals("0") && press != KeyEvent.VK_ENTER && press != KeyEvent.VK_EQUALS) || 
                word.equals("/") ||
                word.equals("*") ||
                word.equals("+") ||
                word.equals("-") || x){
                word = "";
                x = false;
            }
            if(e.getKeyChar() == '+'){
                num1 = Double.parseDouble(word); word = save = keep = "+";
            }
            switch(press){
                case KeyEvent.VK_1: word += "1"; break;
                case KeyEvent.VK_2: word += "2"; break;
                case KeyEvent.VK_3: word += "3"; break;
                case KeyEvent.VK_4: word += "4"; break;
                case KeyEvent.VK_5: word += "5"; break;
                case KeyEvent.VK_6: word += "6"; break;
                case KeyEvent.VK_7: word += "7"; break;
                case KeyEvent.VK_8: word += "8"; break;
                case KeyEvent.VK_9: word += "9"; break;
                case KeyEvent.VK_0: word += "0"; break;
                case KeyEvent.VK_PERIOD: word += "."; break;
                case KeyEvent.VK_SLASH: num1 = ans; word = save = keep = "/"; break;
                case KeyEvent.VK_X: num1 = ans; word = save = keep = "*"; break;
                case KeyEvent.VK_MINUS: num1 = ans; word = save = keep = "-"; break;
                case KeyEvent.VK_ENTER:
                if(save.equals("=")){
                    num2 = ans; x = true; operationType(save);}
                else{
                    num2 = ans; num3 = num2; save = "="; x = true; operationType(save);} break;
                case KeyEvent.VK_BACK_SPACE:
                if(word.length() > 1)
                    word = word.substring(0, word.length() - 1);
                else if(word.length() == 1 || word.length() == 0)
                    word = "0"; break;
                case KeyEvent.VK_ESCAPE: word = "0"; break;
                case KeyEvent.VK_CONTROL: word = "0";
            }
            tf.setText(word);
        }
    };
    ActionListener al = new ActionListener(){
        public void actionPerformed(ActionEvent e){
            String action = e.getActionCommand();
            if(!word.equals("") && !word.equals("/") && !word.equals("*") && !word.equals("+") && !word.equals("-") && !word.equals(".")) ans = Double.parseDouble(word);
            if((word.equals("0") && !action.equals("=")) ||
                word.equals("/") || 
                word.equals("*") || 
                word.equals("+") || 
                word.equals("-") || x){
                word = "" ;
                x = false;
            }
            switch(action){
                case "1": word += "1"; break;
                case "2": word += "2"; break;
                case "3": word += "3"; break;
                case "4": word += "4"; break;
                case "5": word += "5"; break;
                case "6": word += "6"; break;
                case "7": word += "7"; break;
                case "8": word += "8"; break;
                case "9": word += "9"; break;
                case "0": word += "0"; break;
                case ".": word += "."; break;
                case "/": num1 = ans; word = save = keep = "/"; break;
                case "*": num1 = ans; word = save = keep = "*"; break;
                case "+": num1 = ans; word = save = keep = "+"; break;
                case "-": num1 = ans; word = save = keep = "-"; break;
                case "=":
                if(save.equals("=")){
                    num2 = ans; x = true; operationType(save);}
                else{
                    num2 = ans; num3 = num2; save = "="; x = true; operationType(save);} break;
                case "<":
                if(word.length() > 1)
                    word = word.substring(0, word.length() - 1);
                else if(word.length() == 1 || word.length() == 0)
                    word = "0"; break;
                case "C": word = "0"; break;
            }
            tf.setText(word);
        }
    };
}

它仍然有几个潜在的错误需要修复。

【问题讨论】:

  • 我非常感谢 stackoverflow 成员的编辑。这个社区似乎非常努力地确保只涉及问题的重要方面。但是,我不欣赏对该问题的反对票。我觉得它在明确问题是什么方面遵循了指导方针,并且不应该有任何令人困惑的地方。我在网上无休止地研究了答案,但是人们只提供了围绕 OP 想要的替代方法。无缘无故地对此投反对票只会让其他人更难找到。

标签: java image swing jframe calculator


【解决方案1】:

试试这个:

public static ImageIcon createIcon(String spec) {
    URL url = ClassLoader.getSystemResource(spec);
    if (url != null) {
        return new ImageIcon(url); 
    }
    try {
        return new ImageIcon(new URL(spec));
    } catch (MalformedURLException ex) {
        return new ImageIcon(spec);
    }
}

【讨论】:

  • 不幸的是,我之前曾尝试过类似的事情。当时我还没有使用完整的class 来做这样的事情。我只是在计算器类中实例化了一个ImageIcon 对象,并做了与你所做的类似的事情。不幸的是,当您执行frame.setIconImage(icon) 时,它会给出一个错误,说它期待的是Image 而不是ImageIcon。即使我尝试将其转换为Image,它也会给出一个错误,提示我不允许进行该转换(因为是abstract)。您是否知道在制作ImageIcon 后制作一个使其工作的方法?
猜你喜欢
  • 2013-09-08
  • 1970-01-01
  • 2017-09-12
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 2016-09-20
相关资源
最近更新 更多