【问题标题】:Why won't my JPanel display?为什么我的 JPanel 不显示?
【发布时间】:2016-11-04 11:54:28
【问题描述】:

我是一个新手,试图在 swing 中使用我的第一个布局管理器,但无法显示我的 JPanel 并且窗口已最小化。我已经查阅了 JavaDoc,但我无法弄清楚我做错了什么.我只想要一个正确方向的指针。我也连接到我的 mysql 数据库,但那是另一次了。任何建议将不胜感激:)

这是我的代码

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); 

                  }
              });
            }



}

【问题讨论】:

  • 你的类扩展一个 JFrame 并在其主体中初始化一个 JFrame 是否有原因?
  • 实例化该 JFrame 的主要方法在哪里?然后:您希望我们花时间帮助您,所以请您花几分钟时间正确缩进/格式化您的源代码 - 谢谢!
  • 最初我只有一个 JFrame 实例并在我的构造函数中对其进行了初始化。但是,我阅读了有关使用 EDT 的信息,无论出于何种原因,我都不能简单地通过 EDT 调用我的构造函数,因为 SetVisible() 方法有一个“找不到符号”。所以,为了解决这个问题,我扩展了 JFrame 类并希望.....程序在 EDT 上运行。
  • 作为提示,写@paul 或任何您想通知您已回复的人(@ 很重要)。这并没有使程序在 EDT 中运行,SwingUtilities 在 EDT 上运行,但首先发布 minimal reproducible example,我们可以看到与您上面所说的 "cannot find symbol" 相同的错误
  • 您提供的代码写得不好(并且格式不正确)。我相信这是您的问题的一部分,不幸的是我们无法为您重写代码。给出的代码存在不止一个问题,但是下面有两个答案可以帮助您解决您所询问的问题。

标签: java mysql swing


【解决方案1】:

顺序很重要,我现在无法测试,但BorderLayout 是组件上的默认布局管理器,所以,不需要这一行:

    f.setLayout(new BorderLayout());

我敢打赌,当您删除上面的行时,它会出现一个 JButton 并且只是因为您添加到 JPanel 的所有内容都会被添加的新元素“覆盖”(因为 BorderLayout),如果您如果希望它垂直对齐,那么您可能想尝试 BoxLayoutGridLayout 1 列和 0 行(不是错字,0 行表示 N 行)我现在无法发布链接,但来自代码我在手机上读到这是我的赌注。

此外,您在代码上扩展 JFrame 并创建它的实例,使用其中一个,最好使用实例,因为如果您扩展 JFrame,这意味着您的类 IS 一个JFrame,如果你需要扩展一些东西最好扩展JPanel

但为了获得更好的帮助,请尽快发布适当的 MCVE,即仅发布 GUI 代码,我们不需要 DB 连接或执行的操作,只需要您在 JPanel 中放置组件的代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2021-04-04
    • 2019-03-06
    相关资源
    最近更新 更多