2010-06-17 58 views
1

這讓我非常生氣,我已經爲此工作了2天,打開了2本書並瀏覽了它們,並且仍然無法讓該程序按照我希望的方式運行。我已經到了一個地步,如果這沒有幫助,我就放棄了。JFrame不能正常工作

我想要一個簡單的框架應用程序。 它有一個頂部居中的JComboBox。 旁邊是一個足以顯示數字位數的文本字段,例如「$ 49.99」 下方是顯示服務條款的文本區域的地方 下面是同意服務條款的複選框 下面是2按鈕「接受」和「拒絕」

我對這個工作2天,這裏是編碼:

public class Bar extends JFrame implements ActionListener 
{ 
    public Bar(final JFrame frame) 
    { 
     String[] tests = { "A+ Certification", "Network+ Certification", "Security+ Certification", "CIT Full Test Package" }; 
     JButton button = new JButton("Click Meh"); 
     add(new JLabel("Welcome to the CIT Test Program ")); 
     add(new JLabel("Please select which Test Package from the list below.")); 
     frame.setVisible(true); 
     frame.setSize(250,250); 
     JPanel pane1 = new JPanel(new FlowLayout()); 
     JPanel pane2 = new JPanel(new FlowLayout()); 

     JMenuBar menuBar = new JMenuBar(); 
     JMenu fileMenu = new JMenu("File"); 
     JMenu editMenu = new JMenu("Edit"); 
     JMenu helpMenu = new JMenu("Help"); 
     menuBar.add(fileMenu); 
     menuBar.add(editMenu); 
     menuBar.add(helpMenu); 
     JMenuItem newMenu = new JMenuItem("New (Ctrl+N)"); 
     JMenuItem openMenu = new JMenuItem("Open (Ctrl+O)"); 
     JMenuItem saveMenu = new JMenuItem("Save (Ctrl+S)"); 
     saveMenu.addActionListener(this); 
     JMenuItem exitMenu = new JMenuItem("Exit (Ctrl+W)"); 
     JMenuItem cutMenu = new JMenuItem("Cut (Ctrl+X)"); 
     JMenuItem copyMenu = new JMenuItem("Copy (Ctrl+C)"); 
     JMenuItem pasteMenu = new JMenuItem("Paste (Ctrl+V)"); 
     JMenuItem infoMenu = new JMenuItem("Help (Ctrl+H)"); 
     fileMenu.add(newMenu); 
     fileMenu.add(openMenu); 
     fileMenu.add(saveMenu); 
     fileMenu.add(exitMenu); 
     editMenu.add(cutMenu); 
     editMenu.add(copyMenu); 
     editMenu.add(pasteMenu); 
     helpMenu.add(infoMenu); 
     frame.setJMenuBar(menuBar); 
     JComboBox packageChoice = new JComboBox(tests); 
     frame.add(packageChoice); 


    } 

    public void actionPerformed(ActionEvent e) 
    { 
    Object source = e.getSource(); 
    { 
    } 

} 

編輯: 忘了添加第二個程序

public class JFrameWithPanel 
{ 
    public static void main(String[] args) 
    { 
     JPanel panel = new Bar(new JFrame("CIT Test Program")); 
    } 
} 

我該如何獲得這件東西,讓我擁有所需的一切,並顯示出來?我很困惑,因爲這一點,現在幾乎沒有幀如何工作。

+0

一般,「不正常」意味着你沒有正確使用:) – Bozho 2010-06-17 13:59:35

+5

謝謝。如果我知道如何正確使用,我不會問這個問題。 – 2010-06-17 14:02:13

+0

我沒有說你的問題是多餘的,我的意思是它可能會被改寫。 – Bozho 2010-06-17 14:04:05

回答

1

Swing中的組件必須按特定順序排列。

您從一個JFrame開始。放置在JFrame中的唯一組件是JMenuBar和JPanel。您不要在JFrame中添加任何其他組件。您可以在JPanel中添加組件。

這裏是尼克的代碼,重新組織,以正確的順序定義組件。我使用GridLayout是因爲它更快。正如尼瓦斯所說,你應該使用GridBagLayout。

public class Bar { 

    private static final long serialVersionUID = 1L; 

    public Bar(final JFrame frame) { 
     JMenuBar menuBar = buildMenuBar(); 
     frame.setJMenuBar(menuBar); 

     JPanel masterPanel = new JPanel(new GridLayout(2, 1)); 

     JPanel pane1 = new JPanel(new GridLayout(3, 1)); 
     pane1.add(new JLabel("Welcome to the CIT Test Program ")); 
     pane1.add(new JLabel("Please select which Test Package from the list below.")); 
     JButton button = new JButton("Click Me"); 
     pane1.add(button); 

     JPanel pane2 = new JPanel(new GridLayout(1, 1)); 
     String[] tests = { "A+ Certification", "Network+ Certification", 
       "Security+ Certification", "CIT Full Test Package" }; 
     JComboBox packageChoice = new JComboBox(tests); 
     pane2.add(packageChoice); 

     masterPanel.add(pane1); 
     masterPanel.add(pane2); 

     frame.add(masterPanel); 
     frame.pack(); 

     frame.setVisible(true); 
//  frame.setSize(250, 250); 

    } 

    public JMenuBar buildMenuBar() { 
     JMenuBar menuBar = new JMenuBar(); 
     JMenu fileMenu = new JMenu("File"); 
     JMenu editMenu = new JMenu("Edit"); 
     JMenu helpMenu = new JMenu("Help"); 
     menuBar.add(fileMenu); 
     menuBar.add(editMenu); 
     menuBar.add(helpMenu); 
     JMenuItem newMenu = new JMenuItem("New (Ctrl+N)"); 
     JMenuItem openMenu = new JMenuItem("Open (Ctrl+O)"); 
     JMenuItem saveMenu = new JMenuItem("Save (Ctrl+S)"); 
     saveMenu.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       // TODO Auto-generated method stub 

      } 
     }); 
     JMenuItem exitMenu = new JMenuItem("Exit (Ctrl+W)"); 
     JMenuItem cutMenu = new JMenuItem("Cut (Ctrl+X)"); 
     JMenuItem copyMenu = new JMenuItem("Copy (Ctrl+C)"); 
     JMenuItem pasteMenu = new JMenuItem("Paste (Ctrl+V)"); 
     JMenuItem infoMenu = new JMenuItem("Help (Ctrl+H)"); 
     fileMenu.add(newMenu); 
     fileMenu.add(openMenu); 
     fileMenu.add(saveMenu); 
     fileMenu.add(exitMenu); 
     editMenu.add(cutMenu); 
     editMenu.add(copyMenu); 
     editMenu.add(pasteMenu); 
     helpMenu.add(infoMenu); 
     return menuBar; 
    } 
} 

我將JMenuBar代碼移入自己的方法中,所以希望其餘的代碼更容易理解。

我有一個主JPanel,所有其他組件都添加到。

我用另一個JPanel來保存兩個JLabel和JButton。

我用第三個JPanel來保存JComboBox。

的基本模式是如下:

  • 定義的JPanel。
  • 定義組件。
  • 將組件添加到JPanel。
  • 將JPanel添加到主JPanel
  • 將主JPanel添加到JFrame。
0

1。你的第二個程序不會編譯。您正嘗試將JFrame分配給JPanel。

應該已經

JFrame frame = new Bar(new JFrame("CIT Test Program")); 

2。有用。你想要的是在那裏。但不是你想要的,因爲你沒有告訴Java你想如何顯示它。嘗試使用LayoutManager,如GridBagLayout

如果您急於創建GUI,請嘗試像NetBeans這樣的IDE,通過拖放操作讓您的工作更輕鬆。

編輯:

爲例:

public class TestN extends JFrame 
{ 
    private JLabel label ; 
    private JComboBox combo; 
    private JButton button; 
    public TestN() 
    { 
     label = new JLabel("Label:"); 
     combo = new JComboBox(); 
     combo.addItem("Item 1"); 
     combo.addItem("Item 2"); 
     combo.addItem("Item 3"); 

     setLayout(new GridBagLayout()); 

     GridBagConstraints c1 = new GridBagConstraints(); 
     c1.gridx = 0; 
     c1.gridy = 0; 
     c1.weightx = 1; 
     c1.weighty = 1; 
     add(label, c1); 

     GridBagConstraints c2 = new GridBagConstraints(); 
     c2.gridx = 1; 
     c2.gridy = 0; 
     c2.weightx = 1; 
     c2.weighty = 1; 
     add(combo, c2); 

     button = new JButton("Ok"); 
     GridBagConstraints c3 = new GridBagConstraints(); 
     c3.gridx = 2; 
     c3.gridy = 0; 
     c3.weightx = 1; 
     c3.weighty = 1; 
     add(button, c3); 

     setTitle("Test"); 
     setSize(200,100); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

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

聲明:這是一個基本的例子只是爲了給出一個例子。不打算成爲生產代碼;-)

+0

組件仍未顯示,直到我單擊邊框,然後JComboBox佔據了整個框架。 – 2010-06-17 14:07:58

+0

我不知道你做了什麼改變。我假設你還沒有添加布局管理器。 使用gridbaglayout添加了一個示例。希望這可以幫助。 接下來,嘗試給出一個截圖,繪圖或描述你想要的東西。 另外,如果您匆忙,請嘗試使用IDE。 – Nivas 2010-06-17 14:17:09

+0

是的,我剛剛發現了NetBeans,我想我會嘗試使用它。它的工作更好。 – 2010-06-17 14:27:13

1

尼克。我認爲你必須清除的第一件事是確切地知道你想要什麼。

我幫你在這個問題https://stackoverflow.com/questions/3055777/how-to-...

從你描述你已經擁有你所需要的東西。有什麼不對的:

alt text http://img194.imageshack.us/img194/7038/capturadepantalla201006x.png

所以,我真的覺得你應該清楚地描述你想要什麼,才能得到它。

我們會幫助你,但你必須清楚地定義你的問題。

0

您有:

public class Bar extends JFrame implements ActionListener 
{ 
    public Bar(final JFrame frame) 
    { 
     String[] tests = { "A+ Certification", "Network+ Certification", "Security+ Certification", "CIT Full Test Package" }; 
     JButton button = new JButton("Click Meh"); 
     add(new JLabel("Welcome to the CIT Test Program ")); 
     add(new JLabel("Please select which Test Package from the list below.")); 
     frame.setVisible(true); 
     frame.setSize(250,250); 

每個Bar對象從JFrame繼承(即Bar對象一種類型的JFrame),但你在不同的JFrame對象傳遞(在frame參數)在構造函數。然後,您可以調用Bar對象上的某些方法 - 例如添加兩個對象JLabel,以及一些對象通過JFrame - 例如setVisiblesetSize方法。

因此,您有兩個不同的JFrame對象,並且您對每個對象都做了一些工作,並且只有其中一個被設置爲可見。

它看起來像是你傳遞JFrame給構造函數的唯一理由是設置窗口的標題。如果您在String與冠軍擦肩而過的Bar構造函數,然後調用super(title);Bar構造函數的第一行,那麼你就不需要傳入的JFrame所有