java中不显示关闭时JFrame退出

java中不显示关闭时JFrame退出,java,swing,Java,Swing,以中的示例为例,您的示例中有一些示例 我的想法如下: 我已经实现了我的应用程序有一个透明的背景,但最小化和关闭应用程序按钮不会出现 这是我的代码: main import javax.swing.JFrame; import java.awt.*; import javax.swing.*; import static java.awt.GraphicsDevice.WindowTranslucency.*; public class Textmovie extends JFrame {

以中的示例为例,您的示例中有一些示例

我的想法如下:

我已经实现了我的应用程序有一个透明的背景,但最小化和关闭应用程序按钮不会出现

这是我的代码:

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);
    }
}
第二部分

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()  );
    }
}
在NetBeans IDE 8.0.2中运行时会显示这一点

他们可以向我解释如何使按钮出现(最小化并关闭应用程序)。

使标题栏不可见,其中包括最小化和关闭按钮,因此您应该删除该行(因为默认情况下该行为false)


使标题栏不可见,其中包括最小化和关闭按钮,因此您应该删除该行(因为默认情况下为false)

这是因为您正在调用
jf.setUndercorated(true)
。此方法删除标题栏中包含最小化和最大化按钮的标题

不幸的是,窗口必须经过修饰才能有一个系统标题栏,但是外观可以提供一个标题栏。要启用它,必须在使框架可见之前调用此选项:

JFrame.setDefaultLookAndFeelDecorated(true);

这是因为您正在调用
jf.setUndercorated(true)
。此方法删除标题栏中包含最小化和最大化按钮的标题

不幸的是,窗口必须经过修饰才能有一个系统标题栏,但是外观可以提供一个标题栏。要启用它,必须在使框架可见之前调用此选项:

JFrame.setDefaultLookAndFeelDecorated(true);

如果您确实根据异常深入研究代码:

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);
    }
}
这不是你在Swing中做动画的方式

这只会给您带来无穷无尽的问题,因为在
paintComponent
存在之前,不会向本机对等方提交任何内容(双缓冲就是这样工作的)

有关更多详细信息,请参阅

一个更合适的解决方案可能看起来像

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);
        }
    }
}

如果您确实根据异常深入研究代码,请参阅以了解更多详细信息:

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);
    }
}
这不是你在Swing中做动画的方式

这只会给您带来无穷无尽的问题,因为在
paintComponent
存在之前,不会向本机对等方提交任何内容(双缓冲就是这样工作的)

有关更多详细信息,请参阅

一个更合适的解决方案可能看起来像

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);
        }
    }
}


有关更多详细信息,请参见

如果我删除该行,应用程序将不再运行:(并且我将丢失透明的背景色尝试不删除jf.setUndercorated(true);并将其插入背景(我希望您这样做)jf.setUndercorated(false);如果这不起作用,请尝试使用以下命令创建透明背景:如果我删除该行,应用程序将不再运行:(并且我将丢失透明背景颜色尝试不删除jf.setUndercorated(true);并在背景之后插入此命令(我希望您这样做)jf.setUndercorated(false);如果这不起作用,请尝试使用以下方法处理透明背景:如果我删除该行,应用程序将不再运行:(并且我将丢失透明背景)color@Kary您不必删除它,只需添加我的最后一行即可。它不起作用,朋友也不显示按钮:(我发现了这一点,您可以向我解释我应该在代码中修改什么,如果您用我的最后一行替换SetUnderatted?如果我删除该行,应用程序将不再运行:(我会失去透明的背景color@Kary您不必删除它,您只需添加我的最后一行它不起作用朋友也不要出现按钮:(我发现了这个,您可以向我解释我应该在我的代码中修改什么,如果您用我的最后一行替换SetUnderatted?
试试{Thread.sleep(14);}
而不是绘制?真的“他们可以向我解释如何使按钮出现(最小化并关闭应用程序)。”-使用本机外观时,您不能t@MadProgrammer但在这里发现的例子,他们的工作和他们的资金是transparent@MadProgrammer我发现了这个,你可以向我解释我应该在我的代码中修改什么我从来没有能够让教程中的示例起作用-但是屏幕截图使用的是金属(我想)
try{Thread.sleep(14);}
而不是画画?真的“他们可以向我解释我必须做什么才能使按钮出现(最小化并关闭应用程序)。”-使用本机外观时,您不能t@MadProgrammer但在这里发现的例子,他们的工作和他们的资金是transparent@MadProgrammer我发现了这个,你可以向我解释我应该在我的代码中修改什么我从来没有能够让教程中的示例起作用-但是屏幕截图使用的是金属(我想)朋友在一份文件中,不再分为两部分?朋友在一份文件中,不再分为两部分?