Как создать прозрачное окно с красной рамкой? - PullRequest
1 голос
/ 16 июня 2020

Пытаюсь сделать софт, который записывает экран при нажатии клавиши. Чтобы указать, что программа сейчас записывается, я хочу обвести красную рамку за пределами экрана. У меня проблемы с тем, чтобы заставить его работать, вот моя попытка:

public Main() {
    JFrame frame = new JFrame("");
    frame.setUndecorated(true);
    frame.setAlwaysOnTop(true);
    frame.setBackground(new Color(0, 0, 0, 0));
    frame.setSize((int)ss.getWidth(), (int)ss.getHeight());
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.createBufferStrategy(3);

    BufferStrategy bs = frame.getBufferStrategy();

    Graphics2D g = (Graphics2D) bs.getDrawGraphics();
    g.setColor(Color.RED);
    g.drawRect(0, 0, frame.getWidth()-1, frame.getHeight()-1);
    g.dispose();
    bs.show();
}

Кажется, что установка прозрачного фона делает графический объект неспособным рисовать на jframe и устанавливает фон когда графический объект становится прозрачным, остается только белый фон с красной рамкой, а не прозрачный. На данный момент я полностью застрял на этом, поэтому любая помощь будет принята с благодарностью!

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

На самом деле вы не можете нарисовать компонент таким образом, вам нужно будет переопределить paintComponent(g), чтобы сделать это.

Вы можете просто добавить объект границы:

        ((JComponent) frame.getContentPane()).setBorder(new LineBorder(Color.RED, 10));
1 голос
/ 16 июня 2020

Я считаю, что следующий код достигает того, что вы хотите. Примечания после кода.

import static java.awt.Frame.MAXIMIZED_BOTH;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;

import java.awt.EventQueue;
import java.awt.Color;
import java.awt.Container;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class Recorder implements Runnable {
    private JFrame  frame;

    @Override // java.lang.Runnable
    public void run() {
        showGui();
    }

    private void showGui() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container contentPane = frame.getContentPane();
        if (contentPane instanceof JComponent) {
            JComponent jCmpt = (JComponent) contentPane;
            jCmpt.setBorder(BorderFactory.createLineBorder(Color.RED, 5, true));
        }
        frame.setExtendedState(MAXIMIZED_BOTH);
        frame.setUndecorated(true);
        frame.setBackground(new Color(0, 0, 0, 0));
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    /**
     * Start here
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Recorder());
    }
}
  • setExtendedState() увеличивает JFrame так, чтобы он занимал весь экран.
  • setUndecorated() удаляет строку заголовка и рамку из JFrame.
  • setBackground() делает JFrame прозрачным.
  • setLocationRelativeTo() не является обязательным, поскольку JFrame максимизирован.
  • Наконец, я установил толстая красная закругленная рамка вокруг области содержимого JFrame.

Обратите внимание, что вы можете закрыть JFrame, нажав клавиши Alt + F4 на клавиатуре компьютера.

По желанию вы также можете добавить следующее:

frame.setAlwaysOnTop(true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...