java


How to Draw some shape on JPanel using ActionListener?


I'm practising to draw a shape on a JPanel by clicking on a Jbutton, but I cannot. It's been five hours that I'm surfing the web, but I cannot find the way to do it.
This is what I want to do: if I click on "Rectangle" button a rectangle appears under the buttons and if I click on "Circle" button a circle appears.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class Shape extends JFrame {
JButton rec, circle;
static String botSelected;
Shape (){
frameSet ();
}
void frameSet(){
JFrame frame = new JFrame();
frame.setVisible(true);
frame.setSize(600,300);
rec = new JButton ("Rectangle");
circle = new JButton("Circle");
JPanel panel = new JPanel();
frame.add(panel);
panel.add(rec);
panel.add(circle);
Click clk = new Click();
rec.addActionListener(clk);
circle.addActionListener(clk);
}
public void paint (Graphics g){
super.paint(g);
if (botSelected.equals("Rectangle"))
g.fillRect(50,50,50,50);
else if (botSelected.equals("Circle"))
g.fillOval(50,50,50,50);
}
public static void main (String [] arg){
Shape s = new Shape();
}
}
class Click implements ActionListener{
public void actionPerformed (ActionEvent e){
Shape.botSelected = e.getActionCommand();
}
}

The first thing I would do is have a read through Painting in Swing and Performing custom painting to better understand how the painting process works.
Next you need to understand that JFrame is a bad choice for painting to. Why? Because it's multilayered.
A JFrame contains a JRootPane, which contains a JLayeredPane the contentPane, glassPane and the JMenuBar and in your example, it also contains a JPanel.
With the (default) exception of the glassPane, all these components are opaque.
While it's possible to have something drawn in the paint method show it, if any of the other components paint themselves, it will be wiped clean - this is because Swing components can actually be painted independently of each other, with having to have the parent paint itself first.
A better solution is to start by extending from JPanel and override its paintComponent method.
For simplicity, I'd also encourage you to implement the ActionListener against this class as well, it will allow the actionPerformed method to access the properties of the component and, in your case, call repaint to trigger a paint cycle when you want to update the UI.

Here is a derived example from your code.
As #MadProgrammer said, don't extend JFrame.
In the following example, here are the major changes :
give a non-null value to botSelected, or the first calls to paintComponent will give you a NullPointerException
the class now extends JPanel, and overrides paintComponent for custom painting
the ActionListener is an anonymous class, because you don't need a separate class, and it has direct access to the fields from Shape
botSelected is no longer static (see above point)
.
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
class Shape extends JPanel {
JButton rec, circle;
String botSelected = "";// don't let it be null, it would make paintComponent crash on startup
Shape() {
frameSet();
}
void frameSet() {
JFrame frame = new JFrame();
frame.setVisible(true);
frame.setSize(600, 300);
rec = new JButton("Rectangle");
circle = new JButton("Circle");
frame.add(this);
this.add(rec);
this.add(circle);
// anonymous class, has access to fields from the outer class Shape
ActionListener clk = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
botSelected = e.getActionCommand();
repaint();
}
};
rec.addActionListener(clk);
circle.addActionListener(clk);
}
//custom painting of the JPanel
#Override
public void paintComponent(final Graphics g) {
super.paintComponent(g);
if (botSelected.equals("Rectangle")) {
g.fillRect(50, 50, 50, 50);
} else if (botSelected.equals("Circle")) {
g.fillOval(50, 50, 50, 50);
}
}
public static void main(final String[] arg) {
Shape s = new Shape();
}
}


Related Links

String errors at array Splitting Parts
set background to my canvas not work
Collect all objects from a Set of Sets with Java Stream
NoClassDefFoundError for ClasspathRootSelector using JUnit 5
compile 'com.android.support:appcompat-v7:23.2.0' makes some resources error
Authentication client-server in Eclipse Milo
How to test ManagedBean using Arquillian?
How to obtain the bounds of the axis box in a JFrame?
JSON + picasso Images taking too much time to load
How do I prevent creating duplicate methods for member variables?
How to get easy rules .jar file?
Using different versions of the same JAR at runtime
spring-boot log runtime exceptions from new thread
Count no of lines between two lines
How to instantiate an object out of a template of a class (String)
Populating string property of Servlet using Spring

Categories

HOME
java
urbancode
nullpointerexception
appx
hp-exstream
dot
cplex
spagobi
swagger-ui
bs4
adfs
u-sql
google-apps-marketplace
graphlab
apache-metamodel
shared-hosting
autoconf
jquery-ajaxq
hammerspoon
autosys
h2db
smb
replaceall
dbclient
newline
instant-messaging
socialengine
react-chartjs
jspresso
amazon-kinesis-kpl
git-merge
disassembling
automake
space-complexity
objectlistview
sqlite2
awt
gzipstream
grid.mvc
google-datalayer
user-accounts
theming
dropbox-php
epson
blacklist
nested-sets
abcpdf9
android-textview
slicknav
url-masking
multi-level
gridview-sorting
moveit
ready-api
apachebench
vhd
teamcity-8.0
google-places
mutation-observers
retina
tmuxinator
content-length
muse
map-projections
interrupted-exception
sysinternals
createprocessasuser
fluid-dynamics
npapi
formatjs
block-device
tt-news
code-access-security
typeof
java.nio.file
pyhdf
sharp-repository
limejs
type-equivalence
kyotocabinet
browser-detection
quickdialog
bluepill
errai
online-compilation
gnu-prolog
hamachi
django-tagging
actionview
gamequery
jquery-ui-droppable
dbal
sef
privilege
aquaticprime
grid-system





Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm