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

java connector for dhtmlx gantt
Logging everything that goes through an InputStream
Better way to find the most common string in an array using only .get() and .size() methods
Dagger 2, How to add interface in dependency
How do I make a for loop that will print an Array of strings in order in Java?
isConsecutiveStraightFlush consecutive array check [closed]
What's the equivalent of mysql RLIKE operator in Hibernate Query?
How to use list of string as bind parameters in groovy sql.rows?
Iterating through an ArrayList of Objects and printing each variable from each object
AssertEquals fails, because of multilines
No Enum constant found for type in java
After uploading a background image(jpg) through JLabel, how do I make the image scale to the panel that it's on?
How do I ignore specific character when it's inside a comments or quote using regex?
Minimum Spring Boot Code to log 404s
Making an actionListener for a single JButton that has parameters able to work properly
How to actively update a JList in Java

Categories

HOME
xamarin
path-finding
google-api-php-client
smarty
view
adb
microservices
installshield
adobe-analytics
handsontable
msp430
propel
cloudhub
sylius
google-search-api
extjs5
language-agnostic
php-openssl
qhull
bootstrap-duallistbox
ping
jspm
objectanimator
procdump
microsoft-chart-controls
google-sites-2016
noraui
kendo-ui-grid
framemaker
gammu
multilingual
swift3.0.2
abstract-class
sqlite2
leading-zero
android-tabhost
grid.mvc
core-plot
ibpy
qcombobox
btrace
angular-resource
appcompat
qsslsocket
dds
blogengine.net
return-value
dotnetzip
sqldf
cubes
jquery-filter
sts-springsourcetoolsuite
dstu2-fhir
mathematica-frontend
gstreamer-0.10
holder.js
essence
tform
pervasive-sql
rtbkit
marching-cubes
retina
purge
computer-algebra-systems
embedded-code
ami
unity5.2.3
directoryservices
codeigniter-routing
preferences
bitcoinj
openexr
jubula
rebol3
system.net.webexception
industrial
pyhdf
geos
ms-project-server-2010
web2py-modules
listings
dataservice
html4
isnullorempty
twrequest
whoosh
coercion
invite
winbugs14
sql-server-profiler
subviews
h.323
asp.net-mvc-areas
infrastructure
boost-smart-ptr
phonon
spec#
scripting-languages
geneva-server
ntvdm.exe

Resources

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
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App