JFrame不使用后台更改进行更新

时间:2013-12-12 06:00:20

标签: 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 个答案:

答案 0 :(得分:2)

  1. 不要覆盖顶级容器的paint。他们负责维护一个复杂的油漆链(你现在已经破坏了)并且它们不是双重缓冲的,这可能会在涂漆时导致闪烁。
  2. 请致电super.paintXxx
  3. 使用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);
                }
            });
        }
    
    }