Как я могу узнать, что на экране полностью нарисован неокрашенный JFrame? - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть такой простой код:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test {
    public static void main(String[] args) {
        Rectangle maximizeRectangle=GraphicsEnvironment.getLocalGraphicsEnvironment().
        getMaximumWindowBounds();
        JFrame frame1 = new JFrame();
        JFrame frame2 = new JFrame();

        //frame1
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame1.setUndecorated(true);
        frame1.setBounds(maximizeRectangle);
        JPanel cp1 = new JPanel();
        cp1.setBackground(new Color(200, 200, 200));
        JButton but1 = new JButton("I'm frame 1");
        cp1.add(but1);
        ActionListener ac1 = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame2.setVisible(true);
                //here is my question:
                //how can I know when frame2 has been fully painted? and then I can 
                //set visibility of frame1 to false to avoid flickering
                frame1.setVisible(false);
            }
        };
        but1.addActionListener(ac1);
        frame1.setContentPane(cp1);

        //frame2
        frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame2.setUndecorated(true);
        frame2.setBounds(maximizeRectangle);
        JPanel cp2 = new JPanel();
        cp2.setBackground(new Color(200, 200, 200));
        JButton but2 = new JButton("I'm frame 2");
        cp2.add(but2);
        ActionListener ac2 = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame1.setVisible(true);
                //here is my question:
                //how can I know when frame1 has been fully painted? and then I can 
                //set visibility of frame2 to false to avoid flickering
                frame2.setVisible(false);
            }
        };
        but2.addActionListener(ac2);
        frame2.setContentPane(cp2);

        frame1.setVisible(true);
    }
}

, когда я нажимаю кнопки, я вижу мерцание (фон рабочего стола). Как я могу узнать, что JFrame полностью закрашен на экране, прежде чем я установил видимость другого JFrame в false?

, когда я нажимаю кнопки, я вижу мерцания (фон рабочего стола). Как я могу узнать, что JFrame был полностью нарисован на экране, прежде чем я установил видимость другого JFrame в false?

Я не могу использовать таймер!

Большое спасибо

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Я переписал ваш пример без второго кадра и соответствующего мерцания. Как я уже упоминал в своем комментарии, вы должны использовать CardLayout вместо второго кадра.

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test {
    private static final String FRAME1 = "frame1";

    private static final String FRAME2 = "frame2";

    public static void main(String[] args) {
        SwingUtilities.invokeLater(Test::startUp);
    }

    private static void startUp() {
        Rectangle maximizeRectangle = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
        JFrame frame1 = new JFrame();
        CardLayout cl = new CardLayout();
        frame1.setLayout(cl);

        // frame1
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame1.setUndecorated(true);
        frame1.setBounds(maximizeRectangle);
        JPanel cp1 = new JPanel();
        cp1.setBackground(new Color(200, 200, 200));
        JButton but1 = new JButton("I'm frame 1");
        cp1.add(but1);
        ActionListener ac1 = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                cl.show(frame1.getContentPane(), FRAME2);
            }
        };
        but1.addActionListener(ac1);
        frame1.add(cp1, FRAME1);

        // frame2
        JPanel cp2 = new JPanel();
        cp2.setBackground(new Color(200, 200, 200));
        JButton but2 = new JButton("I'm frame 2");
        cp2.add(but2);
        ActionListener ac2 = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                cl.show(frame1.getContentPane(), FRAME1);
            }
        };
        but2.addActionListener(ac2);
        frame1.add(cp2, FRAME2);

        frame1.setVisible(true);
    }
}
0 голосов
/ 11 февраля 2020

@ Медвинский: большое спасибо за ваш ответ; но я думаю, что не могу сказать о своем настоящем намерении. на самом деле, я хочу максимизировать JFrame в соответствии с этим кодом:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;

public class Test {
    public static void main(String[] args) {
        Rectangle maximizeRectangle=GraphicsEnvironment.getLocalGraphicsEnvironment().
        getMaximumWindowBounds();
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(true);
        frame.getContentPane().setLayout(new FlowLayout());
        frame.setSize(500, 500);
        frame.setLocationRelativeTo(null);
        frame.getRootPane().setBorder(new LineBorder(Color.BLACK, 10));

        JButton but1 = new JButton("Maximize");
        ActionListener ac1 = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.setBounds(maximizeRectangle);
            }
        };
        but1.addActionListener(ac1);

        JButton but2 = new JButton("Minimize");
        ActionListener ac2 = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.setSize(500, 500);
                frame.setLocationRelativeTo(null);
            }
        };
        but2.addActionListener(ac2);

        frame.add(but1);
        frame.add(but2);
        frame.setVisible(true);
    }
}

, но когда я нажимаю кнопку «Развернуть», я вижу мерцание в верхнем левом углу. конечно, я знаю, почему это происходит: потому что сначала JFrame размером (500, 500) преобразуется в местоположение (0, 0), а затем расширяется до полного экрана. как я могу видеть только полноэкранный JFrame, когда нажимаю Развернуть? Мой предыдущий вопрос был идеей для этой проблемы.

...