I created a class were bosex are displayed, and it reads where you click, and the handler changes the background color based on the location of you click, Everything works except for the updating of the JFrame. I tried 3 different lines of code, as shown in the handler. Code:
public class Dynamic_Bg_Color extends JFrame{
private static final long serialVersionUID = 1L;
JFrame frame;
Handler handler = new Handler();
static Dimension size = new Dimension(500,400);
public Dynamic_Bg_Color(){
frame = new JFrame("BG Color Changer");
frame = this;
setBackground(Color.cyan);
frame.addMouseListener(handler);
}
public void paint(Graphics g1){
System.out.println("Click");
Graphics g = (Graphics)g1;
g.setColor(Color.blue);
g.fillRect(20,20,frame.getWidth()-40,100);
g.setColor(Color.green);
g.fillRect(20,140,frame.getWidth()-40,100);
g.setColor(Color.orange);
g.fillRect(20,260,frame.getWidth()-40,100);
}
public static void main(String[] args){
Dynamic_Bg_Color d = new Dynamic_Bg_Color();
d.frame.setPreferredSize(new Dimension(size));
d.frame.setMinimumSize(new Dimension(size));
d.frame.setMaximumSize(new Dimension(size));
d.frame.setLocationRelativeTo(null);
d.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
d.frame.setLayout(new FlowLayout());
d.frame.setVisible(true);
}
public class Handler implements MouseListener{
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
if(x>= 20 && x<=frame.getWidth()-40 && y>=20 && y<= 120){
setBackground(Color.blue);
}
if(x>= 20 && x<=frame.getWidth()-40 && y>=140 && y<= 240){
getContentPane().setBackground(Color.green);
}
if(x>= 20 && x<=frame.getWidth()-40 && y>=260 && y<= 360){
frame.getContentPane().setBackground(Color.orange);
}
repaint();
}
//Implemented Methods, cut to shorten, no code in them//
}
}
paint
of top level containers. They are responsible for maintaining a complex paint chain (which you have now broken) and they aren't double buffered which can result in flickering when painted.super.paintXxx
.Instead of extending JFrame
, use JPanel
. Instead of overriding paint
, override paintComponent
. Call super.paintComponent
before you do any other custom painting. It is responsible for painting the background
Finally, add this panel to a instance of JFrame
...
Take a look at Performing Custom Painting for more details
Updated with runnable example
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Dynamic_Bg_Color extends JPanel {
private static final long serialVersionUID = 1L;
public Dynamic_Bg_Color() {
setBackground(Color.cyan);
addMouseListener(new Handler());
}
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("Click");
g.setColor(Color.blue);
g.fillRect(20, 20, getWidth() - 40, 100);
g.setColor(Color.green);
g.fillRect(20, 140, getWidth() - 40, 100);
g.setColor(Color.orange);
g.fillRect(20, 260, getWidth() - 40, 100);
}
public class Handler extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
System.out.println(x + "x" + y);
if (x >= 20 && x <= getWidth() - 40 && y >= 20 && y <= 120) {
setBackground(Color.blue);
}
if (x >= 20 && x <= getWidth() - 40 && y >= 140 && y <= 240) {
setBackground(Color.green);
}
if (x >= 20 && x <= getWidth() - 40 && y >= 260 && y <= 360) {
setBackground(Color.orange);
}
repaint();
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
Dynamic_Bg_Color d = new Dynamic_Bg_Color();
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(d);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}