2013-12-21 142 views
1

我需要弄清楚在这段代码中我需要调整它来移动“Splash Screen !!!”这一行。到屏幕中间,并可能使它变大。我不确定这是什么代码,并且它让我疯狂。在Java中的飞溅屏幕

import java.awt.*; 
import javax.swing.*; 

public class SplashScreen extends JWindow { 

private int duration; 

public SplashScreen(int d) { 
    duration = d; 
} 

// A simple little method to show a title screen in the center 
// of the screen for the amount of time given in the constructor 
public void showSplash() { 

    JPanel content = (JPanel)getContentPane(); 
    content.setBackground(Color.blue); 

    // Set the window's bounds, centering the window 
    int width = 700; 
    int height = 450; 
    Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 
    int x = (screen.width-width)/2; 
    int y = (screen.height-height)/2; 
    setBounds(x,y,width,height); 

    // Build the splash screen 
    JLabel label = new JLabel(new ImageIcon("java-tip.gif")); 
    JLabel copyrt = new JLabel 
     ("Splash Screen!!!", JLabel.CENTER); 
    copyrt.setFont(new Font("Sans-Serif", Font.BOLD, 12)); 
    content.add(label, BorderLayout.CENTER); 
    content.add(copyrt, BorderLayout.SOUTH); 
    Color oraRed = new Color(200, 50, 20, 255); 
    content.setBorder(BorderFactory.createLineBorder(oraRed, 10)); 

    // Display it 
    setVisible(true); 

    // Wait a little while, maybe while loading resources 
    try { Thread.sleep(duration); } catch (Exception e) {} 

    setVisible(false); 
} 
public void showSplashAndExit() { 
    showSplash(); 
    System.exit(0); 

} 

public static void main(String[] args) { 

    // Throw a nice little title page up on the screen first 
    SplashScreen splash = new SplashScreen(10000); 

    // Normally, we'd call splash.showSplash() and get on 
    // with the program. But, since this is only a test... 
    splash.showSplashAndExit(); 
} 
} 

我不知道为什么,但在这个论坛添加代码功能总是让它看起来很奇怪,而且没有正确缩进。

+0

小便!男人你必须有我的帖子出现与速度大声笑 – Opjeezzeey

+0

我不完全确定如何添加一个摇摆计时器。启动画面编译并运行得非常好。我期待的是完全美容。 – Opjeezzeey

+1

@Opjeezzeey它“出现”运行良好,但相信我们,它不.. – MadProgrammer

回答

3

这可能有几种方法,但让我们保持简单。

基本上,这样做是将label(背景)图像添加到内容窗格的中心位置。然后,它适用于一个BorderLayoutlabel,并增加了对copyrtlabel中心位置...

public void showSplash() { 

    JPanel content = (JPanel) getContentPane(); 
    content.setBackground(Color.blue); 

    // Set the window's bounds, centering the window 
    int width = 700; 
    int height = 450; 
    Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 
    int x = (screen.width - width)/2; 
    int y = (screen.height - height)/2; 
    setBounds(x, y, width, height); 

    // Build the splash screen 
    JLabel label = new JLabel(new ImageIcon("java-tip.gif")); 
    JLabel copyrt = new JLabel("Splash Screen!!!", JLabel.CENTER); 

    content.add(label, BorderLayout.CENTER); 

    // Fun starts here...  
//  copyrt.setFont(new Font("Sans-Serif", Font.BOLD, 12)); 
//  content.add(copyrt, BorderLayout.SOUTH); 

    label.setLayout(new BorderLayout()); 
    Font font = copyrt.getFont(); 
    copyrt.setFont(font.deriveFont(Font.BOLD, 24f)); 
    label.add(copyrt); 

    Color oraRed = new Color(200, 50, 20, 255); 
    content.setBorder(BorderFactory.createLineBorder(oraRed, 10)); 

    // Display it 
    setVisible(true); 

    // Don't do this, as it will cause the EDT to be stopped. Instead 
    // setup some kind of callback that can tell when the resources are 
    // loaded and start the rest of the application from there... 
    // Wait a little while, maybe while loading resources 
    //try { 
    // Thread.sleep(duration); 
    //} catch (Exception e) { 
    //} 

    //setVisible(false); 
} 

这也是一个不错的主意做EDT范围内任何可能阻止其进一步处理事件,像使用sleep或长时间运行/无限循环。

所有UI交互都应该在EDT的上下文中执行,所有长时间运行或潜在阻塞的任务应该在单独的线程上运行。

看看Concurrency in Swing更多细节

更新

如果我尝试运行你的榜样,启动画面永远不会出现,因为Thread.sleep是防止被显示在屏幕上。事实上,你“可能”得到它的工作实际上是一种侥幸,因为你可能从“主”线程调用showSplash方法,而不是EDT。

相反,如果我用SwingWorker替换Thread.sleep,我不仅可以看到启动画面,还可以控制进度更新和处理启动画面的时间安排等额外好处...

例如...

import java.awt.BorderLayout; 
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.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Toolkit; 
import javax.swing.BorderFactory; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JWindow; 
import javax.swing.SwingWorker; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class SplashDemo extends JWindow { 

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

    public SplashDemo() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       showSplash(); 

      } 
     }); 
    } 

    public void showSplash() { 

     JPanel content = (JPanel) getContentPane(); 
     content.setBackground(Color.blue); 

     // Set the window's bounds, centering the window 
     int width = 700; 
     int height = 450; 
     Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 
     int x = (screen.width - width)/2; 
     int y = (screen.height - height)/2; 
     setBounds(x, y, width, height); 

     // Build the splash screen 
     JLabel label = new JLabel(new ImageIcon(getClass().getResource("/java_animated.gif"))); 
     JLabel copyrt = new JLabel("Splash Screen!!!", JLabel.CENTER); 

     content.add(label, BorderLayout.CENTER); 

     label.setLayout(new GridBagLayout()); 
     Font font = copyrt.getFont(); 
     copyrt.setFont(font.deriveFont(Font.BOLD, 24f)); 

     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 
     label.add(copyrt, gbc); 

     ImageIcon wait = new ImageIcon(getClass().getResource("/wait.gif")); 
     label.add(new JLabel(wait), gbc); 

     Color oraRed = new Color(200, 50, 20, 255); 
     content.setBorder(BorderFactory.createLineBorder(oraRed, 10)); 

     // Display it 
     setVisible(true); 
     toFront(); 

     new ResourceLoader().execute(); 
    } 

    public class ResourceLoader extends SwingWorker<Object, Object> { 

     @Override 
     protected Object doInBackground() throws Exception { 

      // Wait a little while, maybe while loading resources 
      try { 
       Thread.sleep(5000); 
      } catch (Exception e) { 
      } 

      return null; 

     } 

     @Override 
     protected void done() { 
      setVisible(false); 
     } 


    } 

} 

如果你愿意,我用下面的图片...

enter image description hereenter image description here

+0

我真的只需要启动画面。因此,从最后开始应用程序并不是一个担心。 但是,我只是删除评论栏,让你的补充工作? – Opjeezzeey

+0

如果您使用'Thread.sleep',则您的应用程序将在挂起EDT时“挂起”。更好的方法是启动应用程序并使用像SwingWorker这样的资源来加载资源。一旦调用完成(在'SwingWorker'上),您可以关闭启动画面并打开主应用程序窗口。 – MadProgrammer

+0

好的。非常感谢 :) – Opjeezzeey

1

您正在使用BorderLayout,这意味着您的容器分为EAST,WEST NORTH,SOUTH和CENTER。您正在向南添加“闪屏”。这就是为什么它不居中:

content.add(copyrt, BorderLayout.SOUTH); 

您需要将布局管理器更改为其中一个网格布局。或者,创建多个面板并将您的内容添加到它们,然后添加到父容器。