How to put an image on a JButton? - java

I am writing a program that requires I have a button with an image over top of it, however, so far, I have not been able to get it to work. I have checked several other posts on this site, including How do I add an image to a JButton.
My Code:
public class Tester extends JFrame
{
public Tester()
{
JPanel panel = new JPanel();
getContentPane().add(panel);
panel.setLayout(null);
setTitle("Image Test");
setSize(300,300);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
JButton button = new JButton();
try
{
Image img = ImageIO.read(getClass().getResource("Images\\BBishopB.gif"));
button.setIcon(new ImageIcon(img));
}
catch (IOException ex) {}
button.setBounds(100,100,100,100);
panel.add(button);
}
public static void main(String[] args)
{
Tester test = new Tester();
test.setVisible(true);
}
}
When this code runs, an error results: Exception in thread "main" java.lang.IllegalArgumentException: input == null! This error occurs at the line:
Image img = ImageIO.read(getClass().getResource("Images\\BBishopB.gif"));
I don't think that this error is due to the file not being found by java code, as my Images folder is in the src folder (I am using Eclipse) as recommended by the above link.
Does anyone have any ideas to what the problem may be?
Thanks.

While using Eclipse, you don't keep your images into src folder instead you create a Source Folder for this purpose. Please refer to this link regarding how to add images to resource folder in Eclipse.

Use this to create the button.
JButton button = new JButton(new ImageIcon(getClass().getClassLoader()
.getResource("Images/BBishopB.gif")));
And what you are doing is setting the Image as the icon. This doesn't work because the setIcon() method requires objects which implement the Icon interface. Hope this helps.

Try putting a foward slash before the package name in getResource() like so:
Image img = ImageIO.read(getClass().getResource("/Images/BBishopB.gif"));

You can just find the image directly:
JButton jb = new JButton(new ImageIcon("pic.png")); //pic is in project root folder
//Tip: After placing the image in project folder, refresh the project in Eclipse.
OR if the image will be in a JAR, I usually create a function to do the retrieval for me so that I can re-use it.
public static ImageIcon retrieveIcon(String path){
java.net.URL imgUrl = 'classpackage'.'classname'.class.getResource(path);
ImageIcon icon = new ImageIcon(imgUrl);
return icon;
}
Then I'll do,
JButton jb = new JButton(retrieveIcon("/pic.png"));

Image img = ImageIO.read(getClass().getResource("Images\\BBishopB.gif"));
This line tries to do too much all at one time which makes it difficult to track down an error when you get one. I suggest splitting it up:
URL imgURL = getClass().getResource("Images\\BBishopB.gif");
Image img = ImageIO.read(imgURL);
Now you can use the Eclipse debugger to check the return value of imgURL, which is the most likely candidate for the NPE. Even though this doesn't tell you why you get an error message, it narrows down the problem considerably.

Related

Displaying icon on menu bar in Java Swing

I have an application with a Swing GUI and I would like to add a search-field with a search-button (lupe icon) to the menu bar. However, the lupe icon won't display. Here is my code:
public class Ui_Frame {
public static void main(String[] args) {
SwingUtilities.invokeLater(Ui_Frame::createAndShowGUI);
}
private static void createAndShowGUI() {
f = new JFrame("Myframe");
...
JMenuBar menubar = new JMenuBar();
Icon lupeIcon = new ImageIcon("Resources/lupe_icon.png");
JButton j_searchButton = new JButton(lupeIcon);
menubar.add(j_searchButton);
...
f.setJMenuBar(menubar);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
My project structure is like
Project
Src
Ui_Frame.java
Resources
lupe_icon.png
The resulting button shows no icon at all :
I do not get any error message, it compiles without problems. Even when I try to catch any exception from the new ImageIcon(...) I'm not getting any hint at what the error is.
Any ideas as to what Im doing wrong here?
EDIT:
Here is a minimal example:
import javax.swing.*;
public class test {
private static JFrame f;
public static void main(String[] args) {
SwingUtilities.invokeLater(test::createAndShowGUI);
}
private static void createAndShowGUI() {
f = new JFrame("Test");
JMenuBar menubar = new JMenuBar();
Icon lupeIcon = new ImageIcon(test.class.getResource("/Resources/lupe_icon.png"));
JButton j_searchButton = new JButton(lupeIcon);
menubar.add(j_searchButton);
f.setJMenuBar(menubar);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setSize(500,500);
f.setVisible(true);
}
}
As you can see I am now loading the image with class.getResource(...) as was suggested by #AndrewThompson and #SergiyMedvynskyy, but that does not solve the problem. Also I was told that my classes should not be static, but since my Main needs to be static for me to be able to run the program and I have been told that I should start the UI with SwingUtilities.invokeLater(test::createAndShowGUI);
which also forces createAndShowGUI() to be static, I do not know how to make it not static.
For me it's working without mention folder "Resources" in the path,
like that:
Icon lupeIcon = new ImageIcon(test.class.getResource("/lupe_icon.png"));
But, i'm not sure your project structure is correct.
If still doesn't work, try rename folder with small 'r', and maybe also change project structure, this is my structure:
\src\main\java... (all java files)
\src\main\resources (resources folder, it displayed for me like a package)
Note - i think best is to check why u can't get the image in debug
After switching to Icon lupeIcon = new ImageIcon(test.class.getResource("Resources/lupe_icon.png")); to load the icon instead of new ImageIcon("Resources/lupe_icon.png"); I noticed that I was getting nullpointer-exceptions, despite the image clearly being there. After some googling I found out that the resource folder apparently is not just any folder but has to be marked as the resource root folder, as suggested here.
After marking the folder everything works fine :)

Adding ImageIcon to a JLabel?

Is this the correct way to add an ImageIcon to a JLabel? It doesn't seem to be working when I call the second method.
What type should addCarIcon() be?
//return JLabel that is null
JLabel findEmptySpace()
{
return parkingSpace[emptySpaceNo()];
}
//set icon JLabel
void addCarIcon()
{
ImageIcon carIcon = new ImageIcon("car.png");
findEmptySpace().setIcon(carIcon);
}
//return JLabel that is null
JLabel findEmptySpace()
{
return parkingSpace[emptySpaceNo()];
}
//set icon JLabel
void addCarIcon()
{
// ImageIcon carIcon = new ImageIcon("car.png");
ImageIcon carIcon = new ImageIcon(getClass().getResource("car.png"), null);
findEmptySpace().setIcon(carIcon);
}
I do not reccomend to use ImageIcon(String filename) construction in case of problem, depending on file pakaging. It could work when you run it from IDE, and not work whe you run it from runnable jar.
P.S. Some time ago, I've created IconManager utils to use ico files instead of set of png files. You can test it, maybe it could be useful for you. (This is a link to GitHub: https://github.com/oleg-cherednik/IconManager)

Background Image of a window in Java using JFrame

So, I've recently started learning Java, and I am really enjoying it despite the several issues and things that I have not yet understood, it makes me keep going on with it. So, considering that it is my first ever programming language, bear with me on any "noob" mistakes I make.
So, I created a fullscreen window using JFrame:
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Main extends JFrame {
public static void main(String[] args) {
//Window
JFrame mainWindow = new JFrame("Day One");
mainWindow.setExtendedState(JFrame.MAXIMIZED_BOTH);
mainWindow.setUndecorated(true);
mainWindow.setVisible(true);
//End Window
}
}
And then I tried to add a background image to the window by adding this:
mainWindow.setLayout(new BorderLayout());
mainWindow.setContentPane(new JLabel(new ImageIcon("C:\\Users\\Recordings\\Desktop\\Day One\\Images\\Main-Background-Image.png")));
mainWindow.setLayout(new FlowLayout());
I found this code here but it isn't working at all. In this website there are two different ways of making it but I have tried both of them and none works.
I have also searched here, in stackoverflow, for similar questions, but all of them were either unanswered or answered with the same example as mine.
I really hope I have been clear enough, thank you very much for your time
EDIT:
As suggested, I have separated the long single statement:
mainWindow.setContentPane(new JLabel(new ImageIcon("C:\\Users\\Recordings\\Desktop\\Day One\\Images\\Main-Background-Image.png")));
Into three more easier debugged statements:
ImageIcon image = new ImageIcon("C:\\Users\\Recordings\\Desktop\\Day One\\Images\\Main-Background-Image.png");
JLabel label = new JLabel(image);
mainWindow.setContentPane(label);
Just a few tips
Its usually best to put a panfel within a frame and then add components to that. Makes for good containment when swing classes get a bit bigger.
Its better to create a resource folder for your projects. Create one in the source of your project e.g. where the src and bin folders are located for your project and name it "resources".
When creating and image icon its good practice to surround with a try catch so you can give appropriate errors and locate easily, or even handle the error at runtime.
With all that being said, here is your code with a little extra. It creates a panel to hold the jlabel(image) and it adds that panel to the frame. It creates an image icon with a quick method, all you have to do is pass in the file name. This method assumes you have created the folder in your project directory called resources and placed your image in there.
public static void main(String[] args) {
//Window
JFrame mainWindow = new JFrame("Day One");
mainWindow.setExtendedState(JFrame.MAXIMIZED_BOTH);
mainWindow.setUndecorated(true);
//Create image
JLabel imageHolder = new JLabel();
imageHolder.setIcon(makeImageIcon("example.png"));
//Add image to panel, add panel to frame
JPanel panel = new JPanel();
panel.add(imageHolder);
mainWindow.add(panel);
mainWindow.setVisible(true);
}
//Creates imageicont from filename
public static ImageIcon makeImageIcon(String filename) {
BufferedImage myPicture = null;
try {
myPicture = ImageIO.read(new File("resources/" + filename));
} catch (IOException e) {
e.printStackTrace();
}
return new ImageIcon(myPicture);
}
Hope this helps

How to paint an Image that from a JFileChooser?

I want the user to be able to click a button and choose and image which'll be displayed on the screen.
This is the code I wrote. It doesn't seem to work:
uploadBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int retVal = fc.showOpenDialog(EditImage.this);
if(retVal == JFileChooser.APPROVE_OPTION){
File file = fc.getSelectedFile();
try{
Image img = ImageIO.read(file);
if(img==null){
//TODO: THE FILE IS NOT AN IMAGE. ERROR
}
ImageIcon ic = new ImageIcon(img);
JLabel imageLabel = new JLabel(ic);
imagePreview.add(imageLabel);
}
catch(IOException ex){
//TODO: THE FILE COULD NOT BE OPENED.
}
}
}
});
imagePreview is a JPanel that I've got somewhere on the screen.
What am I doing wrong?
agree with other answers here is required to call container.revalidate() and (there is an Image, then to required) container.repaint()
but this logics is wrong, you couldn't, why to add/remove JComponent for showing another Image, there no reason for, you can to switch betweens ImageIcons in JLabel - JLabel.setIcon(file)
and there is another issue, Images can increasing used JVM memory, you have to call Icon/ImageIcon.flush() before is added to JLabel.setIcon(a few times mentioned here)
Is imagePreview already visible when you add the JLabel to it? If so, you can't just add components to a visible container; you have to revalidate it.
call imagePreview.revalidate(); imagePreview.repaint() after imagePreview.add(imageLabel);, that needed if you add components to visible container.

Adding image to JButton

I want to add an image to a JButton. Background of the button is set to black. I tried to add the image on top of it, but nothing was shown. Background color was black but the image was missing.
Code
public class Test extends JFrame {
JButton b;
JPanel p;
Test() {
p = new JPanel(new BorderLayout());
b = new JButton();
b.setBackground(Color.black);
ImageIcon img = new ImageIcon("C:\\Users\\Aksi\\Documents\\NetBeansProjects\\test'\\src\\test\\Black_B.ico");
b.setIcon(img);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 400);
p.add(b);
add(p);
validate();
}
public static void main(String args[]) throws IOException {
Test ob = new Test();
ob.setVisible(true);
}
}
Two things
The path looks wrong
Java doesn't, natively, support the ico format
Take a look at the path, there is quote mark in the path
C:\\Users\\Aksi\\Documents\\NetBeansProjects\\test'\\src\\test\\Black_B.ico
Just be sure it's suppose to be there or not
Please note that you should use some Java supported image format like .gif, .png for instance.
It is well documented on Oracle.
http://docs.oracle.com/javase/tutorial/uiswing/components/button.html
HOW TO USE ICONS
Good luck!
Try this way:
Create package in your java project like com.icon and add icons in it.
You will set icon's on button this way:
button.setIcon(new ImageIcon(MyFrame.class.getResource("com/icon/Ok.png")));
Just an advice: Use .png instead of .ico.
This is the way I used to add picture with text:
Icon a=new ImageIcon(getClass().getResource("a.png"));
buttonname=new JButton("ButtonTittle",a);

Categories

Resources