Displaying image on clicking JButton
11,631
Solution 1
You should override the JFrame.paint(Graphics g)
method.
Whenever you want to refresh the content of the JFrame instance call the JFrame.repaint()
method.
Solution 2
..display an image upon clicking a JButton but upon execution the image is not displayed when button is clicked.
Use a JToggleButton
as shown here.
Solution 3
The buttons should set the boolean variables, but your paint2 is never called after the action preformed method. Secondly, it doesn't really even paint anything, it never gets graphics and will cause NPEs.
Solution 4
/**
*
*/
package com.samples;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
/**
* @author
*
*/
public class MyFrame extends JFrame implements ActionListener {
private static String SHOW_ACTION = "show";
private static String HIDE_ACTION = "hide";
private Image image = null;
private boolean showImage = false;
public MyFrame(String filename) {
setTitle("MyWindow");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(800, 600);
this.image = new ImageIcon(filename).getImage();
Container container = getContentPane();
container.setLayout(new BorderLayout());
container.add(createControls(), BorderLayout.SOUTH);
}
private JPanel createControls() {
JButton showButton = new JButton("Show");
showButton.addActionListener(this);
showButton.setActionCommand(SHOW_ACTION);
JButton hideButton = new JButton("Hide");
hideButton.addActionListener(this);
hideButton.setActionCommand(HIDE_ACTION);
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout(FlowLayout.CENTER));
panel.add(showButton);
panel.add(hideButton);
return panel;
}
@Override
public void paint(Graphics g) {
super.paint(g);
if (showImage) {
g.drawImage(image, 0, 0, image.getWidth(null), image.getHeight(null), null);
}
}
@Override
public void actionPerformed(ActionEvent event) {
String actionCommand = event.getActionCommand();
if (SHOW_ACTION.equals(actionCommand)) {
showImage = true;
} else if (HIDE_ACTION.equals(actionCommand)) {
showImage = false;
}
repaint();
}
/**
* @param args
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MyFrame frame = new MyFrame("resources/image.jpg");
frame.setVisible(true);
}
});
}
}
Author by
Abhyudaya
Updated on July 10, 2022Comments
-
Abhyudaya almost 2 years
Im trying to display an image upon clicking a JButton but upon execution the image is not displayed when button is clicked.
import javax.swing.JButton; import javax.swing.JFrame; import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JApplet; import java.awt.*; public class new2 extends JFrame implements ActionListener { private boolean b1,b2; Container contentPane= getContentPane(); JButton awar=new JButton("@war"); JButton arrow=new JButton("arrow"); private Image image1,image2; public new2() { setSize(400, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); contentPane.setLayout(new FlowLayout()); awar.addActionListener(this); contentPane.add(awar).setVisible(true); arrow.addActionListener(this); contentPane.add(arrow).setVisible(true); } public void init() { image1=Toolkit.getDefaultToolkit().getImage("@war.jpeg"); image2=Toolkit.getDefaultToolkit().getImage("arrow.gif"); } public void paint(Graphics g) { if(b1==true) { g.drawImage(image1,0,0,this); } else if(b2==true) { g.drawImage(image2,0,0,this); } } public void actionPerformed(ActionEvent event) { String actionCommand = event.getActionCommand(); if(actionCommand.equals("@war")) { b1=true; } else if(actionCommand.equals("arrow")) { b2=true; } } public static void main(String args[]) { new2 m=new new2(); m.setVisible(true); }
}
-
Abhyudaya over 12 yearsim trying to display an image when a jbutton is clicked by using the above program. but on execution, the buttons are displayed but they do not work as expected on being clicked. pls help. :(
-
Heisenbug over 12 yearsplease post the whole code or better an SSCCE. In particular we should see your actionPerformed method implementation.
-
Abhyudaya over 12 yearsoh m sorry...guess the whole code wasn't copied....
-
David Kroukamp over 11 yearsnever paint in a JFrame
paint(...)
rather add aJPanel
to theJFrame
and override itspaintComponent()
-
-
Abhyudaya over 12 yearsso how can i make it work?? i mean i first used paint() instead of paint2() as in an applet but it dint seem to work so i modified it to paint2(). are there any changes possinle in above code to make it work??
-
jzd over 12 yearsYou need to force a repaint in your actionPerformed method. Second your need to actually override a paint() method that gives you the Graphics you need to paint on. I would highly suggest reading about painting in Swing.
-
Abhyudaya over 12 yearsi have studied paint() but unfortunately i haven't covered repaint() as yet...is it possible for you to pls provide me a code that would actually execute my purpose and would be simple to understand?
-
jzd over 12 yearsFollow the Swing tutorials that have pages and pages of working example for each item.
-
Abhyudaya over 12 yearsi have found and studied examples for displaying images in an applet and in an application,also i have used jbuttons for simple purposes like displaying message box or modifying text field however i couldn't find a single working example of an image being displayed by click of a button and hence finally posted it as a question....:(
-
Abhyudaya over 12 yearsis the edited code correct for overriding? this is my actual code....the one with paint2() was modified one..
-
Abhyudaya over 12 yearscant the image be displayed in a new frame? i mean, the one with buttons remaining intact so that 2 buttons open two images...that's what im actually trying to do...
-
Ammar over 12 yearsyou should write something like: @Override public void paint(Graphics g) { // paint operations go here }
-
Abhyudaya over 12 years@Override public void paint(Graphics g) { if(b1==true) { g.drawImage(image1,0,0,this); } else if(b2==true) { g.drawImage(image2,0,0,this); } }
-
Abhyudaya over 12 yearsyet the same result....but overriding or repainting will cause the image to be displayed in the same frame but i want it in a new one...
-
jzd over 12 years@Abhyd get painting of the image working first then try to control it with the button click.
-
Abhyudaya over 12 years@jzd the image and button are working fine as two seperate programs but i can't combine them that is the basic problem...can u pls provid me a code that would do so??
-
Abhyudaya over 12 yearsthe program is compiled but does not execute...exception in thread "main" java.lang.NoClassDefFounderror
-
Ammar over 12 yearsI have compiled it and executed it successfully. If you are using Eclipse make "Clean Project" then run it as a "Java Application". You can test it using the console. > javac MyFrame.java > java MyFrame
-
Abhyudaya over 12 yearshow do i replace the url with a file path...i wanna use a file in my computer instead
-
Abhyudaya over 12 yearsi used it in console only...i do not use eclipse
-
Abhyudaya over 12 yearshow do i replace the url with a file path...i wanna use a file in my computer instead
-
Abhyudaya over 12 yearssorry but this isnt what i exactly want...i want a set of buttons each of which when clicked displays an image in a new frame
-
Ammar over 12 yearsyou have to create the package com.samples.
-
Ammar over 12 yearsor you can simply delete the package declaration "com.samples" it must work this time.