2012-11-20 50 views
2

我需要爲一個帶有面板登錄的程序創建一個圖形用戶界面,在設置登錄後顯示真實軟件。用於軟件的Java Swing GUI,最好的方法

所以,問題是:

我應該創建兩幀並顯示第一的登錄名和第二的計劃?或者,最好在程序啓動時添加兩個不同的面板並隱藏登錄名?

+3

看到這個問題(http://stackoverflow.com/questions/9554636/the-use -of-多jframes好,壞的做法)+1到@MadProgrammers建議 –

回答

5

這有點主觀。對我來說,這將歸結爲應用程序的複雜程度,以及您是否需要支持多個會話,以及這些會話是否共享單個框架。

如果你的應用程序相對簡單(例如有一個或兩個視圖),我認爲它可以接受使用類似於CardLayout,並簡單地在主應用程序框架內顯示登錄窗格,當用戶成功通過身份驗證時,切換到主視圖。

如果應用程序更復雜,我會考慮使用單獨的對話框。

即使您允許用戶進行多個會話,也會降低實際應用程序的複雜程度(恕我直言)是否會使用單獨的對話框。

我還會考慮用戶在登錄之前是否可以做任何事情,例如他們是否可以更新設置?如果是這樣,使用面板將是適合的,因爲登錄對話框最有可能是模態。

-4

你做一個登錄頁面,並使用會話啓用檢查用戶權限。如果用戶被識別,那麼你可以重定向到另一個頁面。

+1

的OP在談論一個桌面應用程序。那裏沒有頁面。 – madth3

4

就我個人而言,我會先爲實際程序創建一個jFrame,然後(立即)打開一個jDialog窗口並在jFrame前打開它。 jDialog類有一個方便的屬性,當它打開時,你不能在你的其他框架上執行動作。所以它必須先關閉(在一些行爲之後,比如填寫密碼)。

2

使用框架的GlassPane是(假設你不需要使用下拉菜單)的選項。有些人可能會說,它的面板系統的濫用,但如果登錄屏幕是很簡單的,我認爲這是合法的。

的好處是,它已經存在供你使用(它不需要將應用程序顯著的變化),而且它吃任何事件(所以它們不會傳遞到實際的應用程序)。這也很容易顯示/隱藏。

垮臺是幾個Swing組件不會在玻璃板工作(JComboBox中就是一個例子)。

下面是使用玻璃面板的例子:?多JFrames,好/壞的做法的用途]

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

public class QuickTest { 

    public QuickTest(){ 
     //Setup Frame 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
     frame.pack(); 
     frame.setSize(400, 300); 
     frame.setLocationRelativeTo(null); 

     //Setup Main Content 
     JPanel main = new JPanel(); 
     main.add(new JLabel("Here's the application!")); 
     frame.setContentPane(main); 

     //Setup login Screen 
     Box login = new Box(BoxLayout.Y_AXIS){ 
      // Makes the main screen faded 
      public void paintComponent(Graphics g){ 
       g.setColor(new Color(255,255,255,200)); 
       g.fillRect(0,0, getWidth(), getHeight()); 
       super.paintComponent(g); 
      } 
     }; 
     login.add(new JLabel("Username here:")); 
     login.add(new JLabel("Password here:")); 
     JButton loginButton = new JButton("login"); 
     loginButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       frame.getGlassPane().setVisible(false); 
      } 
     }); 
     login.add(loginButton); 
     login.add(Box.createVerticalGlue()); 
     frame.setGlassPane(login); 
     frame.getGlassPane().setVisible(true); 

     //Show Frame 
     frame.setVisible(true); 


    } 

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