2016-11-04 210 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组件中的组件