A new JFrame opens in a disabled state when opened at the click of a button

I am stuck in a very unusual situation. I have a ScreenSizeSelector class that has a getSelectedScreenSize method. The method works by creating a user interface, the user drags the interface and the method back to the window size.

Now I call the class method in the following ways:

  • Simple class (not GUI)
  • Button Click on JFrame

In the first case, it works fine (for example, the size selection window opens, the user drags it, resizes it and returns the coordinates of the window), but in the second case the window opens, but in the disabled mode, the user cannot perform any operation in the window, even incapable close a window.

Here is the code I'm using

ScreenSizeSelector Class:

package screenrecorder;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.Border;


class ScreenSizeSelector {

    private JFrame sizeSelectorWindow;
    private JButton btnOk;
    private Border emptyBorder;
    private Rectangle screenArea = null;
    private static Object lock = new Object();



    public Rectangle getSelectedScreenSize(){

        screenSizeSelectorUI();

        Thread t = new Thread() {
            public void run() {
                synchronized(lock) {
                    while (sizeSelectorWindow.isVisible())
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                }
            }
        };

        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return screenArea;
    }


    public void screenSizeSelectorUI() {
        emptyBorder = BorderFactory.createEmptyBorder();

        sizeSelectorWindow = new JFrame("Select screen area");

        btnOk = new JButton("Start");
        sizeSelectorWindow.setUndecorated(true);
        sizeSelectorWindow.getRootPane().setWindowDecorationStyle(3);
        sizeSelectorWindow.setBackground( new Color(0, 0, 0, 0) );
        sizeSelectorWindow.setSize(400,400);

        sizeSelectorWindow.addWindowListener(new WindowEventHandler());
        sizeSelectorWindow.setAlwaysOnTop(true);
        sizeSelectorWindow.setLocationRelativeTo(null);


        btnOk.setToolTipText("Click this button after deciding the screen area");
        btnOk.addActionListener(new ButtonEventHandler());


        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        buttonPanel.setBackground(new Color(0,0,0,0));
        buttonPanel.add(btnOk);
        sizeSelectorWindow.add(buttonPanel,BorderLayout.SOUTH);

        sizeSelectorWindow.setVisible(true);
        sizeSelectorWindow.setEnabled(true);

    }

class ButtonEventHandler implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {

    int x = (int)(sizeSelectorWindow.getBounds().getX());
    int y = (int) (sizeSelectorWindow.getBounds().getY());
    int width = sizeSelectorWindow.getWidth();
    int height = sizeSelectorWindow.getHeight();

    screenArea = new Rectangle(x,y,width,height);
    sizeSelectorWindow.dispatchEvent(new WindowEvent(sizeSelectorWindow, WindowEvent.WINDOW_CLOSING));
}


}

class WindowEventHandler implements WindowListener{

    @Override
    public void windowOpened(WindowEvent e) {
    }

    @Override
    public void windowClosing(WindowEvent e) {

        synchronized (lock) {
            sizeSelectorWindow.setVisible(false);
            lock.notify();
        }
    }

    @Override
    public void windowClosed(WindowEvent e) {
    }

    @Override
    public void windowIconified(WindowEvent e) {
        sizeSelectorWindow.setState(JFrame.NORMAL);
        Toolkit.getDefaultToolkit().beep();
    }

    @Override
    public void windowDeiconified(WindowEvent e) {}

    @Override
    public void windowActivated(WindowEvent e) {}

    @Override
    public void windowDeactivated(WindowEvent e) {}


    }

}

Class Test1:

package screenrecorder;

import java.awt.Rectangle;

public class Test1{

    public static void main(String[] args){
        System.out.println(new ScreenSizeSelector().getSelectedScreenSize());
    }
}

Test2:

package screenrecorder;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Test2 extends JFrame{

    public Test2(){

        JButton btn = new JButton("Click ME");
        btn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(new ScreenSizeSelector().getSelectedScreenSize());

            }
        });

        getContentPane().add(btn);
        setSize(100,100);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public static void main(String[] args){
        new Test2();
    }

}

.

+4
1

, getSelectedScreenSize(). getSelectedScreenSize() , , screenSelectorUI(), . screenSelectorUI() , :

sizeSelectorWindow.setBackground( new Color(0, 0, 0, 0) );

javadocs:

public Color(int r,
                int g,
                int b,
                int a)

sRGB , , - (0 - 255).
:

  • r -
  • g -
  • b -
  • a - -

- 0, . (- - ) , , .

, test1. side note: 1 mac, , , , . , ​​ .

, swing , . : ", 400, 400?" , . Java ?, , . , -, screenSelectorUI() , - , - .

0

Source: https://habr.com/ru/post/1649359/


All Articles