2013-10-27 40 views
1

我最近開始Java編程,正在嘗試創建登錄屏幕。但是,我無法弄清楚如何創建一個新行來放置我的按鈕和文本。另外,我想將它們移到JPanel的右下角。我爲我可憐的措辭表示歉意,希望你能從我的代碼中看到我的意思。請提前幫助並感謝您。將按鈕和文本放在新行上並將它們移動到java屏幕的底部

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

public class CardLayoutDemo implements ItemListener { 
JPanel cards; 
final static String BUTTONPANEL = "Card with JButtons"; 

public void addComponentToPane(Container pane) { 

    JPanel card1 = new JPanel(); 
    card1.add(new JLabel("Username:")); 
    card1.add(new JTextField("Username", 10)); 
    card1.add(new JButton("Login")); //end line here 
    //New line 
    card1.add(new JLabel("Password:")); 
    card1.add(new JTextField("Password", 10)); 
    card1.add(new JButton("Register")); //end line here 
    //New line 
    card1.add(new JCheckBox()); 
    card1.add(new JLabel("Remember credentials")); 


    cards = new JPanel(new CardLayout()); 
    cards.add(card1, BUTTONPANEL); 

    pane.add(cards, BorderLayout.BOTTOM_RIGHT);// Add cards to bottom right hand corner. 
} 

public void itemStateChanged(ItemEvent evt) { 
    CardLayout cl = (CardLayout)(cards.getLayout()); 
    cl.show(cards, (String)evt.getItem()); 
} 

private static void createAndShowGUI() { 
    JFrame frame = new JFrame("Login"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    CardLayoutDemo demo = new CardLayoutDemo(); 
    demo.addComponentToPane(frame.getContentPane()); 

    frame.pack(); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 

    try { 

     UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
    } catch (UnsupportedLookAndFeelException ex) { 
     ex.printStackTrace(); 
    } catch (IllegalAccessException ex) { 
     ex.printStackTrace(); 
    } catch (InstantiationException ex) { 
     ex.printStackTrace(); 
    } catch (ClassNotFoundException ex) { 
     ex.printStackTrace(); 
    } 

    UIManager.put("swing.boldMetal", Boolean.FALSE); 

    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 
} 
+1

這不會在我的Java 6系統上編譯; BorderLayout.BOTTOM_RIGHT無法識別。如果我將BOTTOM_RIGHT更改爲PAGE_END,我會將您的控件置於屏幕的底部,以框架爲中心。不幸的是,我不能確定你想要什麼,而你的代碼只有你所做的,而不是你想做的。你想在不同的行上輸入用戶名和密碼嗎? – arcy

+0

我知道BOTTOM_RIGHT不是一個正確的命令,我只是用它作爲例子。是的,你擊中了頭部,這正是我想要的。 – DIOS

+0

+1更新和[sscce](http://sscce.org/),模仿@rcook評論。 – trashgod

回答

5

如圖所示here,你可以定位你的top-level container在屏幕的下側,右側部分。用您自己的組件代替getPreferredSize()中提到的佔位符。另外,考慮一個JToolBar,它可以在許多實現上浮動。

附錄:我想要的按鈕移動到JPanel的右下角,不動JPanel到屏幕的底部。

指定FlowLayout.RIGHT爲您的card1產生顯示的結果。在內容窗格的BorderLayout.CENTER中替換您的具有CardLayout的面板。

image

public void addComponentToPane(Container pane) { 

    JPanel card1 = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 
    … 
    pane.add(new JPanel() { 
     @Override // placeholder for actual content 
     public Dimension getPreferredSize() { 
      return new Dimension(800, 200); 
     } 
    }, BorderLayout.CENTER); 
    pane.add(cards, BorderLayout.PAGE_END); 
} 

附錄:這裏是更新了自己的例子。

public void addComponentToPane(Container pane) { 
    … 
    pane.add(cards, BorderLayout.PAGE_END); 
} 
… 
private static void createAndShowGUI() { 
    JFrame frame = new JFrame("Login"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    // Move frame to lower right corner of screen 
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice defaultScreen = ge.getDefaultScreenDevice(); 
    Rectangle rect = defaultScreen.getDefaultConfiguration().getBounds(); 
    int x = (int) rect.getMaxX() - frame.getWidth(); 
    int y = (int) rect.getMaxY() - frame.getHeight(); 
    frame.setLocation(x, y); 

    CardLayoutDemo demo = new CardLayoutDemo(); 
    demo.addComponentToPane(frame.getContentPane()); 

    frame.pack(); 
    frame.setVisible(true); 
} 
+0

對不起,我知道我沒有說清楚。我想將按鈕移動到JPanel的右下角,而不是將JPanel移動到屏幕的底部。 – DIOS

+0

@DIOS:我已經更新了我的答案;更新你的問題。 – trashgod

+0

謝謝,這工作完美,對不起,我沒有迴應。 – DIOS

3

建議:

  1. 有沒有這樣的約束​​3210與BorderLayout

    • BorderLayout.SOUTH:發生在容器底部的部件
    • BorderLayout.EAST:放置在容器
    • BorderLayout.NORTH的右側的成分:發生在容器
    • BorderLayout.WEST的頂部的部件:代替組件在容器右側
    • BorderLayout.CENTER:將組件放置在容器的中間

    如果你想爲你希望你的組件,其中 組件將出現在順序,定位在相對定位到每個 等,以響應主要集裝箱的重新大小,你需要 learn about Layout Manager第一。

  2. 瞭解事件監聽器。不是將ItemListener實現爲沒有這種監聽器的JPanel /頂級類,而是將它實現爲一個新類,其命名規範爲MyItemListener implements ItemListener,並創建一個新實例以添加addItemListener(listener)函數或使用匿名方式將它們內聯添加類。

    checkBox.addItemListener(new ItemListener() { 
    
        @Override 
        public void itemStateChanged(ItemEvent e) { 
         // put your code 
        } 
    }); 
    

    ItemListener是與itemCheckBoxComboBox等工作的組件還有其他類型的聽衆,即使存在也如ActionListenerMouseListener

教程資源:

  1. Writing Event Listeners
  2. Using Layout Managers
+0

你的第二點沒有意義。人們可以根據自己的意願編寫事件監聽器。它可以是匿名的或任何實現監聽器的類。它也可以擴展JPanel! – UDPLover

+0

當我們使用組件時,通常我們使用反映該組件使用情況的偵聽器。實施itemlistner沒有意義,因爲面板沒有這樣的監聽器。如果我們願意,我們可以定義一個帶有屬性'Leg'和函數'walk()'的動物'Fish'的類,但是定義這樣的是無稽之談 – Sage

+0

好吧,OP沒有在JPanel中實現ItemListener,OP在CardLayoutDemo中實現ItemListener。 – UDPLover

1

我已經採取了你的代碼,並將其修改爲以下幾點:

package sandbox; 

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.GridLayout; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class LoginLayoutDemo 
{ 
    JPanel cards; 

    public void addComponentToPane(Container pane) 
    { 
     // Panel for text and fields 
     JPanel textAndFieldsPanel = new JPanel(); 
     textAndFieldsPanel.setLayout(new GridLayout(2,2)); 
     textAndFieldsPanel.add(new JLabel("Username ", JLabel.RIGHT)); 
     textAndFieldsPanel.add(new JTextField("Username", 10)); 
     textAndFieldsPanel.add(new JLabel("Password ", JLabel.RIGHT)); 
     textAndFieldsPanel.add(new JPasswordField("password", 10)); 

     JPanel controlsPanel = new JPanel(); 
     controlsPanel.setLayout(new BoxLayout(controlsPanel, BoxLayout.PAGE_AXIS)); 

     controlsPanel.add(textAndFieldsPanel); 
     controlsPanel.add(new JCheckBox("Remember credentials")); 

     JPanel bottomPanel = new JPanel(); 

     bottomPanel.add(controlsPanel); 
     bottomPanel.add(new JButton("Login")); // end line here 

     bottomPanel.add(new JButton("Register")); // end line here 

     cards = new JPanel(new BorderLayout()); 
//  cards.setLayout(new BorderLayout(cards, BoxLayout.LINE_AXIS)); 
     cards.add(bottomPanel, BorderLayout.LINE_END); 

     pane.add(cards, BorderLayout.PAGE_END); // BOTTOM_RIGHT);// Add cards to bottom right hand 
                           // corner. 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("Login"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

//  CardLayoutDemo demo = new CardLayoutDemo(); 
     new LoginLayoutDemo().addComponentToPane(frame.getContentPane()); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 

     try 
     { 

      UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
     } catch (UnsupportedLookAndFeelException ex) 
     { 
      ex.printStackTrace(); 
     } catch (IllegalAccessException ex) 
     { 
      ex.printStackTrace(); 
     } catch (InstantiationException ex) 
     { 
      ex.printStackTrace(); 
     } catch (ClassNotFoundException ex) 
     { 
      ex.printStackTrace(); 
     } 

     UIManager.put("swing.boldMetal", Boolean.FALSE); 

     javax.swing.SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

你真的需要了解佈局管理 - 在Oracle/Java的網站上有一個體面的一個,還有其他一應俱全。我認爲他們大多數人做得最少的事情是全面地解釋經理人的職責以及如何設計他們的事情 - 他們傾向於直接投入代碼。

LayoutManager應用於Container,並告訴它如何處理添加到它的組件。 FlowLayout和BoxLayout傾向於將事情排列在一條線上,可以選擇水平或垂直。 GridLayout將表格放在一個表格中,網格中的所有「單元格」大小相同。 BorderLayout有一箇中心部分和N,S,E和W各一個部分; N,S水平伸展,E,W垂直伸展;所有這四個元素都從其包含的元素中獲取其他維度,並且BorderLayout的中心在兩個方向上延伸以填充其容器中的可用空間。有GroupLayout和GridBagLayout等,它們都是爲了解決UI設計中的一些問題或一組問題而設計的,並且您需要了解他們爲了設計Swing UI而進行的工作。

一些教程做的事情,但沒有真正解釋:每個容器都有一個佈局管理器,但容器可以是另一個容器中的組件,而封閉容器可以有不同的佈局管理器。這就是我們在這裏所做的;整個框架的BorderLayout將我們構建的面板放在底部,面板中的右對齊面板將它們放在右邊;這就是他們如何到達右下方。

您可能已將其他人的控件指向其他行;我會離開做這個練習給你...祝你好運。

還有一件事:CardLayout的情況是,由於某種原因,兩個或更多面板排列在彼此的頂部,即一個模糊另一個。你可以告訴你在你的UI中沒有這樣的需要,所以我取消了CardLayout管理器。

相關問題