2012-06-15 166 views
1

我必須設置基本的JAVA應用程序,包括基於swing的GUI。 我的想法是創建一個JFrame和不同的JPanels,並基於用戶輸入來更改顯示的JPanel。 運行我的應用程序後,將顯示JFrame,但不顯示JPanel的內容。 我認爲在這裏它應該是海峽前進......但它看起來不是。希望你能給我一個提示:)將JPanel添加到JFrame後未顯示

這裏是我的主:

public class Client { 
    public static void main(String[] args) { 
     MainWindow window = new MainWindow(); 
     window.setVisible(true); 

     LoginView pane = new LoginView(); 
     window.getContentPane().add(pane); 

     window.invalidate(); 
     window.repaint(); 
    } 
} 

我的主窗口:

package client; 

public class MainWindow extends javax.swing.JFrame { 
    public MainWindow() { 
     initComponents(); 
    } 
    /** This method is called from within the constructor to 
    * initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is 
    * always regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    private void initComponents() { 
     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 
      .add(0, 352, Short.MAX_VALUE) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 
      .add(0, 250, Short.MAX_VALUE) 
     ); 
     pack(); 
    } 
} 

我LoginView:

package client.views; 

public class LoginView extends javax.swing.JPanel { 
    public LoginView() { 
     initComponents(); 
    } 
    /** This method is called from within the constructor to 
    * initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is 
    * always regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    private void initComponents() { 
     jLabel1 = new javax.swing.JLabel(); 
     jLabel1.setText("Login"); 
     org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this); 
     this.setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 
      .add(layout.createSequentialGroup() 
       .addContainerGap() 
       .add(jLabel1) 
       .addContainerGap(345, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 
      .add(layout.createSequentialGroup() 
       .addContainerGap() 
       .add(jLabel1) 
       .addContainerGap(264, Short.MAX_VALUE)) 
     ); 
    } 
    private javax.swing.JLabel jLabel1; 
} 
+0

將面板添加到幀後再次調用'pack()'。 – Boro

+0

在添加面板之後和setVisibile之前添加'pack()',但它不會幫助 – soupdiver

+0

嘗試調用.revalidate();在頂層容器上,在顯示了gui並添加了所有組件 – Michael

回答

3

你知道其他的事情,比打電話revalidate()repaint(),我會做的是,而不是調用add()到當前內容窗格只需設置一個新的窗格。

我認爲你的問題涉及到向當前內容窗格添加組件的不正確方法。我認爲這是這種情況,因此,使用setContentPane()方法。

+0

真棒......它的作品!但是在所有的教程中,我已經看到他們通過'getContentPane()。add()'方法使用了這種方式,爲什麼我必須以不同的方式來使用它! – soupdiver

+1

你可以這樣做,但重要的是你已經忘記了在getContentPane()調用'add()'方法之前安裝合適的佈局管理器,例如'JPanel'的默認值,即' FlowLayout',或者在你的情況下可取的,因爲你想交換整個當前視圖來使用'BorderLayout'。 – Boro

+1

啊好的!我試圖在添加之前將BorderLayout設置爲LayoutManger,這也是可行的。謝謝男人:) – soupdiver

2

作爲替代方案,請使用CardLayout更改面板。

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Client { 

    public static void main(String[] args) { 
     JFrame window = new JFrame(); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final CardLayout cl = new CardLayout(); 
     final JPanel cards = new JPanel(cl); 
     cards.add(new LoginView(), "Login"); 
     cards.add(new MainView(), "Main"); 
     window.add(cards); 
     JPanel control = new JPanel(); 
     control.add(new JButton(new AbstractAction("Login") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       cl.show(cards, "Main"); 
      } 
     })); 
     window.add(control, BorderLayout.SOUTH); 
     window.pack(); 
     window.setLocationRelativeTo(null); 
     window.setVisible(true); 
    } 
} 

class MainView extends javax.swing.JPanel { 

    public MainView() { 
     initComponents(); 
    } 
    ... 
} 

class LoginView extends javax.swing.JPanel { 

    public LoginView() { 
     initComponents(); 
    } 
    ... 
}