Java - 一个接一个地加载 JTabbedPane

Posted

技术标签:

【中文标题】Java - 一个接一个地加载 JTabbedPane【英文标题】:Java - Load JTabbedPane one tab after another 【发布时间】:2013-11-08 10:29:02 【问题描述】:

我有一个带有 4 个选项卡的 JTabbedPane。我想在标签使用、引用和从同一个数据库中检索时依次加载 1 个标签 1。这导致我的应用程序中出现“数据库被锁定”的问题。

提前感谢您的帮助和建议:)

这就是我创建 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);

【问题讨论】:

请发布所有相关代码...就目前的问题而言,我们无法为您提供帮助。 添加了一些代码,想知道它是否有帮助。 :) 您可能需要更多关于如何访问数据库的信息。您发布的代码显示同时添加了四个新选项卡,其中没有任何内容。您是否暗示数据检索非常耗时,并且您希望在每次数据可用时都显示?请发布有关您的问题的更多信息/代码。还要解释这个“数据库被锁定”的来源。 【参考方案1】:

基于此example,下面的sscce 只需为每次单击添加 按钮创建一个新面板并填充结果。在实际程序中,您可能希望使用SwingWorker 来管理延迟和资源。

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 https://***.com/a/19860170/230513
 * @see https://***.com/a/15715096/230513
 * @see https://***.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();
            
        );
    

【讨论】:

以上是关于Java - 一个接一个地加载 JTabbedPane的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jquery 一个接一个地为 Div 设置动画

使用java JSch库一个接一个地执行多个命令

在java中不使用join()一个接一个地启动线程

Java 脚本 - 当尝试按顺序一个接一个地播放音频时(通过 for 循环),一次播放所有音频

如何在 mvn clean install 中配置 maven hbm2hbmxml 和 hbm2java 一个接一个地运行

Outlook 2007 加载项异常处理