我创建了一个类,显示了bosex,它显示了你点击的位置,处理程序根据你点击的位置改变了背景颜色,除了更新JFrame外,一切正常。我尝试了3行不同的代码,如处理程序所示。 代码:
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//
}
}
答案 0 :(得分:2)
paint
。他们负责维护一个复杂的油漆链(你现在已经破坏了)并且它们不是双重缓冲的,这可能会在涂漆时导致闪烁。super.paintXxx
。使用JFrame
,而不是扩展JPanel
。而不是覆盖paint
,而是覆盖paintComponent
。在进行任何其他自定义绘画之前,请致电super.paintComponent
。它负责绘制背景
最后,将此面板添加到JFrame
...
请查看Performing Custom Painting了解详情
已更新为可运行示例
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);
}
});
}
}