为啥 JPanel 上啥都没有显示?
Posted
技术标签:
【中文标题】为啥 JPanel 上啥都没有显示?【英文标题】:Why is nothing is displayed on JPanel?为什么 JPanel 上什么都没有显示? 【发布时间】:2015-07-28 16:16:27 【问题描述】:我正在尝试从数据库中获取数据并将结果发布到JPanel
。
这是简化的代码:
public class LedgerView extends JPanel
public LedgerView()
super();
this.setLayout(new FlowLayout());
this.add(new JLabel("ITEMS:"));
String JDBC_DRIVER = "com.mysql.jdbc.Driver";
String DB_URL = "jdbc:mysql://localhost/gnufinance";
String USERNAME = "gnufinance";
String PASSWORD = "gnuisnotunix";
Connection conn = null;
try
Class.forName(JDBC_DRIVER);
conn = DriverManager.getConnection(DB_URL, USERNAME, PASSWORD);
catch (Exception e)
e.printStackTrace();
String query = "SELECT * FROM transactions";
try
PreparedStatement ps = conn.prepareStatement(query);
ResultSet rs = ps.executeQuery();
while (rs.next())
String desc = rs.getString(3);
System.out.println(desc);
this.add(new JLabel(desc));
catch (SQLException e)
e.printStackTrace();
public static void main(String[] args)
JFrame view = new JFrame();
view.setVisible(true);
view.setSize(300, 300);
view.add(new LedgerView(), BorderLayout.CENTER);
除了空白的灰色框外什么都没有显示,但是当我删除 JDBC 代码时,会显示第一个 JLabel(ITEMS)
。屏幕上什么都没有,但 while 循环中的 System.out.println
会在控制台上正确打印所有数据。没有例外。
【问题讨论】:
【参考方案1】:您必须在 Event Dispatch Thread 或 EDT 上创建面板。
Swing 不是线程安全的;您对摇摆控件所做的任何更改(例如创建新的JLabel
s)都必须在 EDT 上发生(这不是您的 main
方法开始的线程。您使用 EventQueue.invokeLater()
告诉 Java 将工作转移到 Swing 绘图线程上。
请注意,大多数时候您不希望您的工作(例如访问数据库)在 EDT 上进行,因为这会使您的用户界面无响应。换句话说,您的程序将在可能的情况下执行访问数据库的工作,而不是绘制您的屏幕。
此代码将解决您当前的问题,但您应该考虑在其他地方访问数据库(也许,现在,在您的 main
方法中),将结果存储在 List
中,然后将List
传递给您的LedgerView
,这将产生一个响应更快的用户界面。
public static void main(String[] args)
final JFrame view = new JFrame();
EventQueue.invokeLater(new Runnable()
@Override
public void run()
view.setSize(300, 300);
view.add(new LedgerView(), BorderLayout.CENTER);
view.setVisible(true);
【讨论】:
以上是关于为啥 JPanel 上啥都没有显示?的主要内容,如果未能解决你的问题,请参考以下文章
我的ubuntu系统桌面上啥都没有(包过菜单),就是只有一个壁纸。怎么办啊
如何修复“警告:useLayoutEffect 在服务器上啥都不做”?