2015-01-09 2 views
0

Мое приложение дает серый экран после запуска таймера. Как уже было сказано, у меня теперь есть MainPage, который расширяет JFrame и MenuPage, который расширяет JPanel. Я хочу загрузить MenuPage после запуска MainPage. repaint() и revalidate() не работает для меня. Пожалуйста, укажите мне в правильном направлении.Серый экран на repaint() и revalidate()

import java.awt.*; 
import java.awt.event.*; 
import java.io.File; 

import javax.swing.*; 
import javax.swing.border.Border; 
import javax.swing.border.EmptyBorder; 

public class MainPage extends JFrame { 

    private static JPanel contentPane; 

    //timer 
    private final static int interval = 40; 
    private int i; 
    private Timer t; 
    private JProgressBar pbar; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        MainPage frame = new MainPage();      
        frame.setVisible(true);    
       } 
       catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     });  
    } 

    public MainPage() {    
     dim = Toolkit.getDefaultToolkit().getScreenSize();  
     System.out.println(dim); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(null); 
     contentPane.setBounds(0,0,dim.width,dim.height); 
     setContentPane(contentPane); 

     this.setExtendedState(JFrame.MAXIMIZED_BOTH); 

     pbar = new JProgressBar (0,20); 
     pbar.setBounds(600, 500, 200, 45); 
     pbar.setValue(0); 
     pbar.setStringPainted(true); 
     pbar.setForeground(Color.RED); 
     Border border = BorderFactory.createTitledBorder("Loading..."); 
     pbar.setBorder(border);   

     t = new Timer (interval, new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 
       if (i == 20){ 
        t.stop(); 
        //start.setEnabled(true); 



        //refresh + load next page    
        contentPane.removeAll(); 
        MenuPage menuPage = new MenuPage(); 
        //setContentPane(menuPage); 

        contentPane.add(menuPage); 
        contentPane.revalidate();     
        contentPane.repaint(); 
        contentPane.setVisible(true);      

       } 
       else{ 
        i++; 
        pbar.setValue(i); 
       }    
      }   
     }); 
     t.start(); 

     contentPane.add(pbar, BorderLayout.NORTH);   
     contentPane.add(lblTitle); 
     contentPane.add(imgLogo); 
     contentPane.add(imgBackground);  
    } 
} 



import java.awt.BorderLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class MenuPage extends JPanel { 

    private JPanel contentPane; 



public MenuPage() { 
      //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      setBounds(100, 100, 450, 300); 
      contentPane = new JPanel(); 
      contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
      contentPane.setSize(500, 500); 
      contentPane.setLayout(null);     

      add (contentPane); 

     JButton btnSadfsafsa = new JButton("sadfsafsa"); 
     btnSadfsafsa.setBounds(10, 52, 89, 23); 
     btnSadfsafsa.setEnabled(true); 
     btnSadfsafsa.setVisible(true); 
     contentPane.add(btnSadfsafsa); 
    } 
} 
+0

Не используйте setBounds() и setSize(). Вместо этого определите правильный LayoutManager. – StanislavL

+0

@stanslavl: спасибо. Я обеспокоен показом страниц на данный момент, после этого дойдет до макета. Я все еще не вижу проблемы, почему она не может загрузить новую страницу. –

ответ

0

Проблема с конструктором MenuPage.

Вы создаете новую панель JPanel - contentPane, но никогда не добавляете ее и никогда не устанавливаете размер. Поэтому на самом деле вы просто создаете пустую панель.

+0

См. Edit, он по-прежнему дает серый экран. Расстроенный. –

+0

Упростите пример. Вы не нуждаетесь в дополнительной панели (contentPane) в MenuPage. Определите макеты, чтобы избежать ненужных 0 компонентов или подкомпонентов. – StanislavL

+0

Пожалуйста, исправьте меня, но предположительно я поместил все компоненты, такие как кнопки, в JPanel, а затем загрузите эту панель, вызвав ее из MainPage, не так ли это, как я обновляю страницы? в этом смысле у меня будет много jpanels, которые определяют разные страницы позже, где MainPage контролирует их. Я не хочу использовать макет карты. мой предыдущий пост - http://stackoverflow.com/questions/27831067/switch-between-jpanels-of-different-classes –

0

Я надеюсь, что это поможет другим в будущем. Да, нулевой макет не рекомендуется. Применил setContentPane() вместо contentPane.add() в моем случае.

//refresh + load next page    
contentPane.removeAll(); 
contentPane.revalidate();     
contentPane.repaint(); 
setContentPane(new MenuPage());