java jtabbedpane,Java - 加载JTabbedPane一个选项卡

本文介绍了一个Java应用中使用JTabbedPane时遇到的数据库锁定问题,通过实例展示如何逐个异步加载数据库内容到不同tab,以提高用户体验并解决并发时的锁竞争。通过SwingWorker和适当的数据访问策略,作者提供了解决方案。
摘要由CSDN通过智能技术生成

I have a JTabbedPane with 4 tabs. I would like to load 1 tab 1 after another as the tabs uses, refers and retrieves from the same database. And this is causing an issue of "Database is locked" in my application.

Thanks in advance for the help and suggestions :)

This is how I create the JTabbedPane

JTabbedPane tabbedPane = new JTabbedPane();

tabbedPane.setBounds(0, 0, 450, 300);

tabbedPane.addTab("tab1", new class1UseDb());

tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);

tabbedPane.addTab("tab2", new class2UseDb());

tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);

tabbedPane.addTab("tab3", new class3UseDb());

tabbedPane.setMnemonicAt(2, KeyEvent.VK_3);

tabbedPane.addTab("tab4", new class());

tabbedPane.setMnemonicAt(3, KeyEvent.VK_4);

解决方案

Based on this example, the sscce below simply creates a new panel for each click on the Add button and fills in the result. In a real program, you may want to use a SwingWorker to manage latency and resources.

jVrk8.png

import java.awt.BorderLayout;

import java.awt.EventQueue;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.swing.AbstractAction;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTabbedPane;

import org.h2.jdbcx.JdbcDataSource;

/**

* @see http://stackoverflow.com/a/19860170/230513

* @see http://stackoverflow.com/a/15715096/230513

* @see http://stackoverflow.com/a/11949899/230513

*/

public class TabData {

private int n = 1;

private void display() {

JFrame f = new JFrame("TabData");

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JTabbedPane jtp = new JTabbedPane();

jtp.add(String.valueOf(n), createPane());

f.add(jtp, BorderLayout.CENTER);

JPanel p = new JPanel(new FlowLayout(FlowLayout.RIGHT));

p.add(new JButton(new AbstractAction("Add") {

@Override

public void actionPerformed(ActionEvent e) {

jtp.add(String.valueOf(++n), createPane());

jtp.setSelectedIndex(n - 1);

}

}));

f.add(p, BorderLayout.SOUTH);

f.pack();

f.setLocationRelativeTo(null);

f.setVisible(true);

}

private JPanel createPane() {

JPanel p = new JPanel();

JLabel l = new JLabel();

p.add(new JLabel("Result: "));

p.add(l);

JdbcDataSource ds = new JdbcDataSource();

ds.setURL("jdbc:h2:file:~/src/java/jdbc/test;IFEXISTS=TRUE");

ds.setUser("sa");

ds.setPassword("");

try {

Connection conn = ds.getConnection();

Statement s = conn.createStatement();

ResultSet rs = s.executeQuery("SELECT RAND() FROM DUAL");

rs.next();

l.setText(rs.getString(1));

} catch (SQLException ex) {

ex.printStackTrace(System.err);

}

return p;

}

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

new TabData().display();

}

});

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值