java - JFrame 不随背景更改而更新

标签 java swing jframe handler jcomponent

我创建了一个显示 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//

}

}

最佳答案

  1. 不要覆盖顶级容器的paint。它们负责维护复杂的绘制链(您现在已经破坏了该链),并且它们不是双缓冲的,这可能会导致绘制时闪烁。
  2. 请调用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);
            }
        });
    }

}

关于java - JFrame 不随背景更改而更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20536126/

相关文章:

java - GridLayout 中 JPanel 之间的差距

java - Java Swing-如何在可见帧B时如何使用帧A?

java - 安卓按钮及其工作原理

Java 8 编译器与重载方法混淆

java - Monad 和装饰器模式

java - 将背景图片添加到 JFrame

java - JFrame 在第一次实例化后不工作?

java - Jmeter 中的 XML 路径断言

Java贪吃蛇游戏: Apple showing while snake is invisible

java - joptionpane 确认对话框无法识别 no 选项