2013-12-21 2 views
1

Мне нужно выяснить, где в этом коде мне нужно настроить его, чтобы переместить строку «Splash Screen !!!» до середины экрана и, возможно, сделать его больше. Я не уверен, где это в коде, и это заставляет меня сходить с ума.Splashscreen в 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

Pee! Человек, у вас должны быть мои сообщения, показывающие быстроту lol – Opjeezzeey

+0

Я не совсем уверен, как добавить таймер качания. Экран заставки компилируется и работает отлично. То, что я хочу сделать, полностью косметическое. – Opjeezzeey

+1

@Opjeezzeey «Кажется», чтобы нормально работать, но поверьте нам, это не так. – MadProgrammer

ответ

3

Существует несколько способов сделать это, но пусть это будет проще.

В основном, это означает, что изображение label (фоновое изображение) находится в центре панели содержимого. Затем он применяет BorderLayout к label и добавляет copyrt в центральное положение label ...

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 или длинные/бесконечные петли.

Все взаимодействия с пользовательским интерфейсом должны выполняться в контексте EDT, и все длительные или потенциально блокирующие задачи должны выполняться в отдельном потоке.

Взгляните на Concurrency in Swing для более подробной информации

Обновлено

Если я пытаюсь запустить пример, никогда не появится заставка, потому что Thread.sleep является препятствование от того, показать на экране. Тот факт, что вы «можете» заставить его работать, на самом деле является случайностью, поскольку вы, вероятно, называете метод showSplash «основным» потоком, а не EDT.

Вместо этого, если я заменяю Thread.sleep на SwingWorker, я не только получаю всплывающий экран, но и получаю дополнительное преимущество в том, что вы можете контролировать такие вещи, как обновления хода выполнения и планирование для удаления заставки ...

Например ...

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 для загрузки ресурсов. Когда вызывается 'done' (на' SwingWorker') вы можете закрыть заставку и открыть главное окно приложения. – MadProgrammer

+0

Хорошо. Большое спасибо :) – Opjeezzeey

1

Вы используете BorderLayout, что означает, что ваш контейнер разделен на EAST, WEST NORTH, SOUTH AND CENTER. Вы добавляете «Splash Screen» на юг. Вот почему это не центрирование:

content.add(copyrt, BorderLayout.SOUTH); 

Необходимо изменить менеджеров компоновки на один из макетов сетки. Кроме того, создайте несколько панелей и добавьте в них свой контент, а затем добавьте в родительский контейнер.