Java 如何设置JFrame';s图标使用到本地存储的原始路径
我需要一些帮助,将JFrame的标题栏图标设置为计算机中的图像 我意识到计算器不完整。我仍然需要添加操作,但是我只想先这样做 如果你能把注意力集中在实际问题上,那将是令人震惊的。请不要建议设置特定的类路径。我想在不使用相对位置和排序的情况下从电脑中抓取图片。我以前尝试过使用相对位置,但是失败得很惨 这个程序是在BlueJ上完成的,只是出于个人喜好 图像尝试的代码在计算器方法下 文件路径为“C:/Users/Charlie/Downloads/smiley.png” 在继续之前,我想说的是,Java 如何设置JFrame';s图标使用到本地存储的原始路径,java,image,swing,jframe,calculator,Java,Image,Swing,Jframe,Calculator,我需要一些帮助,将JFrame的标题栏图标设置为计算机中的图像 我意识到计算器不完整。我仍然需要添加操作,但是我只想先这样做 如果你能把注意力集中在实际问题上,那将是令人震惊的。请不要建议设置特定的类路径。我想在不使用相对位置和排序的情况下从电脑中抓取图片。我以前尝试过使用相对位置,但是失败得很惨 这个程序是在BlueJ上完成的,只是出于个人喜好 图像尝试的代码在计算器方法下 文件路径为“C:/Users/Charlie/Downloads/smiley.png” 在继续之前,我想说的是,Ima
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\total中
在同一个文件夹中,我创建了另一个名为“res”的文件夹,然后在其中创建了另一个名为“textures”的文件夹,然后添加了一个名为“smiley.png”的.png图像
当您传入图像的字符串“path”时,它将在您的类所在的文件夹中开始搜索。在我的例子中,我必须传入“/res/textures/smiley.png”确保使用正斜杠“/”,否则可能会出现编译时错误“非法转义字符”,或某些运行时错误
因此,到达我的图像的全部代码外目录是:C:\Users\Charlie\Documents\total\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);
}
};
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.border.*;
导入javax.swing.BorderFactory.*;
导入javax.swing.JApplet;
导入java.util.ArrayList;
公共类计算器{
私有静态jf帧;
专用字体;
私有布尔值x=false,y=false;
专用双num、num1、num2、num3、ans;
私有int c=0;
私有字符串word=“”,save=“”,keep=“”;
私有JTextField=newjtextfield(“0”);
专用静态JPanel p0、p1、p2、p3、p4、p5、p6、p7、p8、p9、p10、p11、p12、p13、p14;
//私有静态ImageMake img=newImageMake(“/res/textures/smiley.png”);
公共计算器(){
f=新的JFrame(“计算器”);
试一试{
javax.swing.UIManager.setLookAndFeel(新的
com.sun.java.swing.plaf.windows.WindowsLookAndFeel();
}捕获(例外e){}
ArrayList titles=新的ArrayList();
ArrayList按钮=新建ArrayList();
对于(int i=0;i<10;i++){
标题。添加(“+i”);
}
标题。添加(“C”);
标题。添加(“.”);
标题。添加(“/”);
标题。添加(“*”);
标题。添加(“+”);
标题。添加(“—”;
标题。添加(“尝试以下操作:
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);
}
}
我非常感谢各位成员。这个社区似乎非常努力地确保只涉及问题的重要方面。但是,我不欣赏否决票关于这个问题。我觉得它遵循了明确问题是什么的指导原则,不应该有任何混淆。我在网上无休止地搜索答案,但人们只提供了其他方法,以满足OP的需要。毫无理由地否决这一点只会让o更难接受很难找到。不幸的是,我之前曾经尝试过类似的事情。当时我没有使用完整的类来做这样的事情。我只是在calculator类中实例化了一个ImageIcon
对象,并做了与您类似的事情。不幸的是,当您执行frame.setIconImage(图标)时
它给出了一个错误,表示它期望的是图像
,而不是图像图标
。即使我尝试将其转换为图像
,它也给出了一个错误,表示不允许我进行转换(由于抽象
).在制作了图像图标后,您是否知道通过制作一个图标使其工作的方法?
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);
}
};
}
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);
}
}