Выход JFrame при закрытии не появляется в Java - PullRequest
0 голосов
/ 26 февраля 2019

Возьмите пример из Oracle , в вашей документации .

есть несколько примеров * Моя идея заключается в следующем:

enter image description here

Я добился того, что у моего приложения прозрачный фон, но кнопки приложения сворачивания и закрытия не отображаются

Это мой код:

main

import javax.swing.JFrame;
import java.awt.*;
import javax.swing.*;
import static java.awt.GraphicsDevice.WindowTranslucency.*;

public class Textmovie extends JFrame {

    /*
    public Textmovie() {
        //setLayout(new GridBagLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    */

    public static void main(String[] args) {
       JFrame jf = new JFrame("");
       jf.setUndecorated(true);
       jf.setBackground(new Color(0,0,0,10));
       //jf.setOpacity(0.55f);
       jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       jf.add(new texscroll());
       jf.setSize(720,480);
       jf.setVisible(true);
    }
}

Часть 2

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;


/**
 *
 * @author inide
 */
public class texscroll extends JPanel {
    int  x =510 , y = 25;

    public texscroll() {
        setOpaque(false);
    }


    @Override

    public void paint(Graphics g){
        super.paint(g);
        Graphics2D g2 = (Graphics2D)g;

        Font font = new Font("Arial",Font.BOLD + Font.PLAIN,15);
        g2.setFont(font);
        g2.setColor(Color.BLACK);

        String string = "stackoverflow stackoverflow stackoverflow stackoverflow";

        g2.drawString(string ,x,y);
        try{Thread.sleep(14);}
        catch(Exception ex)
        {
        };
        x-=1;

            if(x==-10*string.length()){
              x= 510;  
            }
        repaint();

       // System.out.println(string.length()  );
    }
}

И это показано при работе в IDE NetBeans 8.0.2

enter image description here

Они могут объяснить мне, что мне нужно сделать, чтобы кнопки появились (свернуть и закрыть приложение).

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Это потому, что вы звоните jf.setUndecorated(true).Этот метод удаляет строку заголовка, которая содержит кнопки минимизации и максимизации.

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

JFrame.setDefaultLookAndFeelDecorated(true);
0 голосов
/ 26 февраля 2019

Если вы действительно углубитесь в код, основанный на исключении:

Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The frame is decorated
    at java.desktop/java.awt.Frame.setBackground(Frame.java:989)

Вы обнаружите, что невозможно сделать прозрачную рамку И быть украшенной ...

@Override
public void setBackground(Color bgColor) {
    synchronized (getTreeLock()) {
        if ((bgColor != null) && (bgColor.getAlpha() < 255) && !isUndecorated()) {
            throw new IllegalComponentStateException("The frame is decorated");
        }
        super.setBackground(bgColor);
    }
}

Тот факт, что учебники показывают его работу, не имеет значения и является ошибкой со стороны учебников.

"Возможно", это было возможно в более ранних "неизданных" версиях API (с использованием AWTUtilities), но это просто больше невозможно

Теперь мы получили этоКстати, это внутри paint ...

try {
    Thread.sleep(14);
} catch (Exception ex) {
};
x -= 1;

if (x == -10 * string.length()) {
    x = 510;
}
repaint();

- это не то, как вы делаете анимацию в Swing

Это просто не вызовет никаких проблем, так как ничего не совершенодо нативного узла, пока ПОСЛЕ paintComponent не существует (так работает двойная буферизация)

См. Параллельность в Swing для получения более подробной информации.

Возможно, более подходящее решениевыглядеть примерно так ...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Textmovie extends JFrame {

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

    public Textmovie() throws HeadlessException {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame jf = new JFrame("");
                jf.setUndecorated(true);
                jf.setBackground(new Color(0, 0, 0, 10));
                //jf.setOpacity(0.55f);
                jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                jf.add(new texscroll());
                jf.pack();
                jf.setLocationRelativeTo(null);
                jf.setVisible(true);
            }
        });
    }

    public static class texscroll extends JPanel {

        private int x = 510, y = 25;

        private String string = "stackoverflow stackoverflow stackoverflow stackoverflow";

        public texscroll() {
            Font font = new Font("Arial", Font.BOLD + Font.PLAIN, 15);
            setFont(font); 
            setForeground(Color.BLACK);

            setOpaque(false);
            Timer timer = new Timer(14, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    x -= 1;

                    if (x == -10 * string.length()) {
                        x = 510;
                    }
                    repaint();
                }
            });
            timer.start();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(720, 480);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
            Graphics2D g2 = (Graphics2D) g;

            g2.drawString(string, x, y);
        }
    }
}

См. Как использовать Swing Timers для более подробной информации

0 голосов
/ 26 февраля 2019
jf.setUndecorated(true);

делает строку заголовка невидимой, включая кнопки свертывания и закрытия, поэтому вы должны удалить эту строку (поскольку по умолчанию она имеет значение false)

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