2016-11-04 208 views
1

我是一個試圖在swing中使用我的第一個佈局管理器的newb,無法顯示我的JPanel並將窗口最小化。我已經諮詢了JavaDoc,但是我無法弄清楚我做錯了什麼。我只是想要一個指向正確的方向。我也連接到我的MySQL數據庫,但這是另一次。任何意見,將不勝感激:)爲什麼我的JPanel不顯示?

這裏是我的代碼

package learn; 

import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.JOptionPane; 
import javax.swing.JFrame; 
import java.sql.*; 
import javax.swing.JPanel; 
import java.awt.BorderLayout; 


public class TestGUI3 extends JFrame implements ActionListener 
{ 
    JRadioButton rb1, rb2, rb3; 
    JFrame f; 
    JButton b; 
    JPanel myFirstPanel; 
    public TestGUI3() 
    { 
     f = new JFrame("Welcome to Ballon d'or , created by Darren Estcourt"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     myFirstPanel = new JPanel(); 
     f.add(myFirstPanel); 
     rb1 = new JRadioButton("Start New Game"); 
     rb2 = new JRadioButton("Load Game"); 
     rb3 = new JRadioButton("Quit"); 

     myFirstPanel.add(rb1); 
     myFirstPanel.add(rb2); 
     myFirstPanel.add(rb3); 

     ButtonGroup bg=new ButtonGroup(); 
     bg.add(rb1); 
     bg.add(rb2); 
     bg.add(rb3); 

     b = new JButton("OK"); 
     myFirstPanel.add(b); 

     b.addActionListener(this); 





     f.setLayout(new BorderLayout()); 
     f.pack(); 
     f.setVisible(true); 
    } 
      @Override public void actionPerformed(ActionEvent e) 
      { 
       if(rb1.isSelected()) 
       { 
        f.dispose(); 


        ManagerName test = new ManagerName(); 
        test.getFrame().setVisible(true); 

       } 
       if(rb2.isSelected()) 
       { 
        JOptionPane.showMessageDialog(f,"Load Game"); 
       } 
       if(rb3.isSelected()) 
       { 
        System.exit(0); 
       } 

      } 

      public static void main(String[] args) 
      { 
       try 
       { 
        String myDriver = "org.gjt.mm.mysql.Driver"; 
        String myUrl = "jdbc:mysql://localhost:3306/ballondor?autoReconnect=true&useSSL=false"; 
        Class.forName(myDriver); 
        Connection conn = DriverManager.getConnection(myUrl, "root", "Lucia290907"); 

        String query = "SELECT * FROM clubInfo"; 

        Statement st = conn.createStatement(); 

        ResultSet rs = st.executeQuery(query); 

        while (rs.next()) 
         { 
          int TeamID = rs.getInt("TeamID"); 
          String TeamName = rs.getString("TeamName"); 
          // print the results 
          System.out.format("%s, \n", TeamName); 
         } // end while loop 

            st.close(); 
       } // end try 
    catch (Exception e) 
    { 
     System.err.println("Got an exception! "); 
     System.err.println(e.getMessage()); 
    } 

       SwingUtilities.invokeLater(new Runnable() 
       { 
        public void run() 
        { 
        TestGUI3 test = new TestGUI3(); 
        test.setVisible(true); 

        } 
       }); 
      } 



} 
+3

是否有一個原因,您的類擴展JFrame以及初始化一個在它的身體? – paul

+0

您的主要方法實例化JFrame在哪裏?然後:您希望我們花時間來幫助您,所以您請花幾分鐘時間來正確**縮進/格式化您的源代碼 - 謝謝! – GhostCat

+0

最初我只是有一個JFrame的實例,並在我的構造函數中初始化它。然而,我讀到了有關使用EDT的原因,並且出於某種原因,我不能通過EDT簡單地調用我的構造函數,因爲我有一個SetVisible()方法的「找不到符號」。所以,爲了彌補這一點,我擴展了JFrame類,希望.....該程序在EDT上運行。 –

回答

2

的順序問題,我現在不能測試,但BorderLayout是對組件的默認佈局管理器,所以,沒有必要這條線:

f.setLayout(new BorderLayout()); 

我敢打賭,當你刪除上面的線就會使一個JButton出現,只是因爲一切你添加到您的JPanel獲取由新元素「重寫」添加(由於BorderLayout) , 一世如果你希望它是垂直對齊的,那麼你可能想試試BoxLayoutGridLayout有1列和0行(不是拼寫錯誤,0行意味着N行)我現在不能發佈鏈接,但從我讀的代碼在我的手機上,這是我的賭注。

你也正在擴展您的代碼JFrame和創建它的一個實例,使用一個或另一個,這是更好,因爲如果你擴展JFrame這意味着你類是一個JFrame,如果你需要使用實例以擴展一些更好的擴展JPanel

但爲了更好地幫助更快發佈適當的MCVE,即僅發佈GUI代碼,我們不需要數據庫連接或執行的操作,只需要在代碼中放置代碼您的JPanel組件中的組件