Swing JTree登陆后动态加载

wuer0520 2014-02-26 02:21:58
在做一个桌面的程序,有一个主页面和一个登陆页面,主页面有一个菜单栏一个工具栏,工具栏下面有一个左面的JPanel和一个右面的JPanel,左面的JPanel里面有个JTree,右面的JPanel里面是左面的JTree单击后动态显示的内容,登陆页面显示在主页面前面是模态的,点击登陆后想动态的加载主页面里的JTree,但是点击登陆后这个JTree就显示不出来了

这个为什么不能上传项目进来让大家看啊,代码一个类一个类的稍微有点多啊

package com.bvtc.mdi.window;

import java.awt.BorderLayout;

/**
*
* @author wangjing 该类是主窗口
*
*/
public class IndexWindow extends JFrame {

/**
* 构造方法
*
* @param loginWindow
* 登录窗口
*
* 初始化主窗口
*/
public IndexWindow() {
// 设置窗口标题
this.setTitle("MySql Data Insert");
// 获取窗口左上角显示图标
BufferedImage iconImage = null;
try {
iconImage = ImageIO.read(IndexWindow.class.getClassLoader()
.getResource("image/icon.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
// 设置窗口的左上角图标
this.setIconImage(iconImage);
// 设置窗口大小和位置
this.setBounds(200, 100, 800, 600);
// 设置窗口打开时最大化,这样设置之后打开后窗口是最大化,按缩小就会缩小到setBounds的设置参数
// this.setExtendedState(JFrame.MAXIMIZED_BOTH);
// 设置窗口不可大小改变
// this.setResizable(false);
// 将布局管理器设置为空
getContentPane().setLayout(null);
// 调用构建菜单方法
createMenu();
// 调用构建工具栏方法
createToolBar();
// 调用构建左右下面板的方法
createPanel();
// 设置窗口可见
this.setVisible(true);
// 增加关闭事件
this.addWindowListener(new WindowAdapter() {

@Override
public void windowClosing(WindowEvent e) {
e.getWindow().setVisible(false);
System.exit(0);
}

});
// this.getContentPane().setBackground(Color.BLACK);
}

// 创建登录窗口的引用
LoginWindow loginWindow = null;
// 创建菜单栏
JMenuBar mnb = null;
// 创建菜单
JMenu mnuFile = null;
// 创建菜单栏项
JMenuItem mniNew = null;
JMenuItem mniQuit = null;
// 创建工具栏
JToolBar jToolBar = null;
// 创建工具栏中的显示登录窗口的按钮
JButton btnLogin = null;
//创建工具栏中的开始插入数据按钮
JButton btnInsertDate = null;
// 创建左面板、右面板的引用
JPanel leftWindow = null;
JPanel rightWindow = null;

// 创建左面板中树的引用
JTree tree = null;
// 创建右上面板和右下面板的引用
JPanel rightUpWindow = null;
JPanel rightDownWindow = null;

/**
*
* @param loginWindow
* 登录窗口 该方法用于设置登录窗口
*/
public void setLoginWindow(LoginWindow loginWindow) {
this.loginWindow = loginWindow;
}

/**
* 该方法用于构建窗口中的菜单
*/
private void createMenu() {
// 初始化菜单栏
mnb = new JMenuBar();
// 初始化菜单
mnuFile = new JMenu("文件");
// 初始化菜单项
mniNew = new JMenuItem("新建项目");
mniQuit = new JMenuItem("退出");
// 将菜单项添加到菜单中
mnuFile.add(mniNew);
mnuFile.add(mniQuit);
// 将菜单添加到菜单栏中
mnb.add(mnuFile);
// 将菜单栏挂靠在框架上
this.setJMenuBar(mnb);
/**
* 单击新建项目菜单触发
*/
mniNew.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// 显示登陆窗口
loginWindow.setVisible(true);
}
});
}

/**
* 该方法用于构建窗口中的工具栏
*/
private void createToolBar() {
// 初始化工具栏
jToolBar = new JToolBar();
// 设置工具栏的位置
jToolBar.setBounds(0, 0, 794, 38);
// 将工具栏添加到主窗口中
getContentPane().add(jToolBar);
// 初始化新建项目按钮
btnLogin = new JButton("\u65B0\u5EFA\u9879\u76EE");
//初始化开始插入数据按钮
btnInsertDate = new JButton("\u5F00\u59CB\u63D2\u5165\u6570\u636E");
/**
* 单击新建项目按钮触发的事件
*/
btnLogin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 显示登陆窗口
loginWindow.setVisible(true);
}
});
/**
* 单价开始插入数据按钮触发的事件
*/
btnInsertDate.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
}
});
// 将新建项目按钮添加到工具栏
jToolBar.add(btnLogin);
//将开始插入数据按钮添加到工具栏
jToolBar.add(btnInsertDate);
}

/**
* 该方法用于初始化左右下面板
*/
public void createPanel() {
/*
* //初始化左面板 leftWindow = new LeftWindow(); //调用左面板的显示方法
* leftWindow.showMethod(); //将左面板添加到主窗口
* getContentPane().add(leftWindow);
*
* JPanel panel = new JPanel(); leftWindow.add(panel); //初始化右面板
* rightWindow = new RightWindow(); //调用右面板的显示方法
* rightWindow.showMethod(); //将右面板添加到主窗口
* getContentPane().add(rightWindow);
*/
// 初始化左面板
leftWindow = new JPanel();
// 设置左面板位置
leftWindow.setBounds(10, 48, 293, 482);
// 将左面板添加到主窗口
getContentPane().add(leftWindow);
// 初始化右面板
rightWindow = new JPanel();
// 设置右面板位置
rightWindow.setBounds(313, 48, 461, 482);
// 将右面板添加到主窗口中
getContentPane().add(rightWindow);
//设置颜色,以后删掉
leftWindow.setBackground(Color.red);
rightWindow.setBackground(Color.pink);

// 设置右面板的布局管理器为空
rightWindow.setLayout(null);
// 初始化右上面板
rightUpWindow = new JPanel();
// 设置右上面板的位置
rightUpWindow.setBounds(10, 10, 441, 149);
//测试方法,一会删掉
//testMethod();

// 将右上面板添加到右面板
rightWindow.add(rightUpWindow);
// 初始化右下面板
rightDownWindow = new JPanel();
// 设置右下面板的位置
rightDownWindow.setBounds(10, 169, 441, 303);
// 将右下面板添加到右面板
rightWindow.add(rightDownWindow);
//设置颜色,以后删掉
rightUpWindow.setBackground(Color.BLACK);
rightDownWindow.setBackground(Color.yellow);
}
/**
* 本方法用来测试不用点击登陆方式直接放置一个JTree是否显示,结果是显示的!
*/
private void testMethod() {
DefaultMutableTreeNode color = new DefaultMutableTreeNode("Color", true);
/* DefaultMutableTreeNode gray = new DefaultMutableTreeNode("Gray");
color.add(gray);
color.add(new DefaultMutableTreeNode("Red"));
gray.add(new DefaultMutableTreeNode("Lightgray"));
gray.add(new DefaultMutableTreeNode("Darkgray"));
color.add(new DefaultMutableTreeNode("Green"));*/
JTree example5 = new JTree(color);
leftWindow.add(new JScrollPane(example5));
}

/**
*
* @param database
* 数据库名
* 该方法用于创建左面板中的树
* 该方法是由登录窗口登录完成后调用的
*/
public void createTree(String database) {
//初始化根节点
DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(database,true);
System.out.println("到底调用方法了么");
//初始化树
tree = new JTree(treeNode);
tree.setBackground(Color.BLACK);
//将树添加到左面板,JTree必须放在JScrollPane里面
leftWindow.add(new JScrollPane(tree));
}
}
...全文
929 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuer0520 2014-02-26
  • 打赏
  • 举报
回复
引用 3 楼 Gaowen_HAN 的回复:
引用 2 楼 fangmingshijie 的回复:
awt和swing混用。会引发异常的
+1,一个是多线程设计(AWT),一个是单线程(Swing)。故大部分Swing组件不是线程安全的,只能在EDT中才是安全应用
我只学过awt,是不是Swing中全都是Swing的东西,不能用awt包里的东西啊,Swing里所有东西都重写了一份?
fearlessMore 2014-02-26
  • 打赏
  • 举报
回复
引用 2 楼 fangmingshijie 的回复:
awt和swing混用。会引发异常的
+1,一个是多线程设计(AWT),一个是单线程(Swing)。故大部分Swing组件不是线程安全的,只能在EDT中才是安全应用
  • 打赏
  • 举报
回复
awt和swing混用。会引发异常的
wuer0520 2014-02-26
  • 打赏
  • 举报
回复

package com.bvtc.mdi.window;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTextField;

import com.bvtc.mdi.dao.LoginDao;
/**
 * 
 * @author wangjing
 * 该类是登录窗口
 *
 */
public class LoginWindow extends JDialog {
	
	/**
	 * 
	 * @param frame	指定Frame
	 * @param title	指定标题
	 * @param model	是否model	
	 */
	public LoginWindow(Frame frame, String title, boolean model) {
		super(frame,title,model);
		//初始化父窗口的引用
		iw = (IndexWindow) frame;
		//调用登录窗口的showMethod方法显示登录窗口
		showMethod();
	}
	
	//创建父窗口的引用
	IndexWindow iw = null;
	//创建操作数据库的Dao类的对象的引用
	LoginDao loginDao = null;
	//拿到登陆窗口的组件容器
	Container container = this.getContentPane(); 
	
	//定义server、database、username、pssword文本显示区域
	JLabel jlServer = null;
	JLabel jlDataBase= null;
	JLabel jlUserName = null;
	JLabel jlPassword = null;
	//定义server、database、username、pssword输入区域
	JTextField jtfServer = null; 
	JTextField jtfDataBase = null; 
	JTextField jtfUserName = null; 
	JTextField jtfPassword = null; 
	//定义确定按钮和退出按钮
	JButton jbSubmit = null;
	JButton jbCancel = null;
	
	
	/**
	 * 该方法是显示登录窗口的方法
	 */
	public void showMethod() {
		//设置窗口大小
		this.setSize(300, 500);
		//调用该方法初始化登陆窗口中的控件并添加到登陆窗口中
		buildControl();
		//给确定按钮和取消按钮绑定事件
		event();
		//调用该方法将窗口显示到屏幕中间
		showInMiddle();
		//将窗口模式化
		this.setModal(true);
		this.setVisible(true);
	
	}
	/**
	 * 该方法是处理确定按钮和取消按钮的事件类
	 */
	private void event() {
		//处理取消按钮事件
		jbCancel.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				//调用本方法隐藏窗口
				hideWindow();
			}
		});
		//处理确定按钮事件
		jbSubmit.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				//定义用来存放server、datsbase、username、pssword值的变量
				String server = null;
				String database = null;
				String userName = null;
				String password = null;
				//给server、database、username、pssword变量赋值
				server = jtfServer.getText();
				database = jtfDataBase.getText();
				userName = jtfUserName.getText();
				password = jtfPassword.getText();
				//初始化loginDao对象
				loginDao = new LoginDao(server, database, userName, password);
				//如果可以连接上数据库,隐藏登陆窗口
				if(loginDao.validate()!=false) {
					hideWindow();
				}else {//如果连接不上,弹出报错窗口
					
				}	
				iw.createTree(database);
			}
		});
	}
	/**
	 * 该方法用于隐藏窗口
	 */
	private void hideWindow() {
		this.setVisible(false);
	}
	/**
	 * 该方法用于构建登陆窗口中的控件
	 * 将控件初始化并添加到登陆窗口中
	 */
	private void buildControl() {
		//设置窗口的布局管理器为null
		this.setLayout(null);
		//初始化确定按钮和取消按钮
		jbSubmit = new JButton("确定");
		jbCancel = new JButton("取消");
		//初始化server、database、username、pssword文本显示区域
		jlServer = new JLabel("server");
		jlDataBase = new JLabel("database");
		jlUserName = new JLabel("username");
		jlPassword = new JLabel("password");
		//初始化server、database、username、pssword输入区域
		jtfServer = new JTextField();
		jtfDataBase = new JTextField();
		jtfUserName = new JTextField();
		jtfPassword = new JTextField();
		//设置确定按钮和取消按钮的位置和大小
		jbSubmit.setBounds(130, 400, 60, 30);
		//设置按钮的颜色
		jbSubmit.setBackground(new Color(1,169,219));
		//要想按钮的颜色显示出来必须将不透明设置为true
		jbSubmit.setOpaque(true);
		jbCancel.setBounds(200, 400, 60, 30);
		jbCancel.setBackground(new Color(1,169,219));
		jbCancel.setOpaque(true);
		//设置server、database、username、pssword文本显示区域的位置和大小
		jlServer.setBounds(40, 40, 70, 30);
		jlDataBase.setBounds(40, 130, 70, 30);
		jlUserName.setBounds(40, 220, 70, 30);
		jlPassword.setBounds(40, 310, 70, 30);
		//设置server、database、username、pssword输入区域的位置和大小
		jtfServer.setBounds(130, 40, 120, 30);
		jtfDataBase.setBounds(130, 130, 120, 30);
		jtfUserName.setBounds(130, 220, 120, 30);
		jtfPassword.setBounds(130, 310, 120, 30);
		//将控件添加到登陆窗口中
		container.add(jbSubmit);
		container.add(jbCancel);
		container.add(jlServer);
		container.add(jlDataBase);
		container.add(jlUserName);
		container.add(jlPassword);
		container.add(jtfServer);
		container.add(jtfDataBase);
		container.add(jtfUserName);
		container.add(jtfPassword);
	}
	/**
	 * 该方法是将登录窗口显示到屏幕中间的方法
	 */
	private void showInMiddle() {
		//获取屏幕大小
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		//获取JDialog的大小
		Dimension frameSize = this.getSize();
		if (frameSize.height > screenSize.height) {
			frameSize.height = screenSize.height;
		}
		if (frameSize.width > screenSize.width) {
			frameSize.width = screenSize.width;
		}
		this.setLocation((screenSize.width - frameSize.width) / 2,
				(screenSize.height - frameSize.height) / 2);
	}
}

package com.bvtc.test;

import com.bvtc.mdi.window.IndexWindow;
import com.bvtc.mdi.window.LoginWindow;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		//创建主窗口的引用
		IndexWindow iw = new IndexWindow();
		// 创建并初始化登录窗口
		LoginWindow loginWindow = new LoginWindow(iw,"Project Configuration",true);
		iw.setLoginWindow(loginWindow);
	}
	
}

package com.bvtc.mdi.dao;

import com.bvtc.mdi.db.DB;
/**
 * 
 * @author wangjing
 *	该类是登陆窗口操作数据库的dao类
 */
public class LoginDao {
	// 定义用来接收server、database、username、pssword值的变量
	String server = null;
	String database = null;
	String userName = null;
	String password = null;
	
	//创建数据库操作类对象
	DB db = new DB();

	/**
	 * 
	 * @param server
	 *            服务器
	 * @param database
	 *            数据库
	 * @param userName
	 *            用户名
	 * @param password
	 *            密码
	 */
	public LoginDao(String server, String database, String userName, String password) {
		super();
		this.server = server;
		this.database = database;
		this.userName = userName;
		this.password = password;
	}
	
	public boolean validate() {
		return db.connect(server, database, userName, password);
	}

}

package com.bvtc.mdi.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
 * 
 * @author wangjing
 *	该类是用于操作数据库的类
 */
public class DB {
	Connection conn = null;
	/**
	 * 
	 * @param server
	 * @param database
	 * @param userName
	 * @param password
	 * 该方法是连接数据库的方法
	 */
	public boolean connect(String server, String database, String userName,
			String password) {
		//拼接url
		String url = "jdbc:mysql://"+server+":3306/"+database;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(url, userName, password);
			return true;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
		return false;
	}
}
此外还有一个mysql连接JDBC的jar包没上传 求大神们指点啊
源码直接下载地址: https://pan.quark.cn/s/0c43ed5159df 本资源为HCDA认证培训教程,旨在面向准备参加HCDA考试的学员,或希望掌握TCP/IP基础、路由、交换技术、广域网、以太网技术基本原理以及华为通用路由平台VRP上实现的相关内容。具体涵盖的模块包括:Module 1-网络互联基础、Module 2-路由和路由协议基础与实现、Module 3-以太网交换技术基础与实现、Module 4-广域网技术基本原理与实现、Module 5-网络安全基础、Module 6-华为数通产品概述 ### 华为-NAT技术详解 #### 一、概述 NAT(Network Address Translation,网络地址转换)是一种在专用网络内部使用私有IP地址的情况下,使这些设备能够通过公有IP地址进行外部通信的技术手段。NAT技术在多种网络环境中得到广泛应用,特别是在企业网络中发挥着关键性作用。作为HCDA认证培训教程的一部分,本文档将系统性地阐述NAT的基础理论及其实现方法,并深入探讨在华为VRP平台上的具体应用场景。 #### 二、NAT处理流程 NAT处理流程主要包含两种类型:基于源IP地址和基于目的IP地址的处理模式。 ##### 1. 基于源IP地址的NAT处理 **1.1 一对一NO-PAT** 一对一NO-PAT即非端口地址转换(No-Port Address Translation),在这种模式下,一个私有IP地址对应一个公有IP地址,不涉及端口号的转换。当配置了NAT no-pat时,华为设备会为已配置的多通道协议产生的实际流量数据建立server-map表项。这种方式适用于需要固定公网IP的服务器等场景。 **1.2 多对一...
内容概要:本文基于Simulink仿真平台,复现并深入研究了一篇关于全桥LLC谐振变换器的学术论文,重点聚焦于变频控制与移相控制相结合的协同策略,旨在优化变换器在不同工作模式切换过程中的动态响应特性。通过构建高精度的全桥LLC变换器仿真模型,系统分析了传统单一控制方式下模式切换易引发的电压电流冲击问题,进而提出一种融合频率调节与移相角调节的复合控制方法。该方法通过精确协调两个控制自由度,有效平抑了切换瞬态的电气应力,显著提升了系统的运行平稳性、效率及整体稳定性。文中详尽阐述了协同控制的逻辑架构、关键参数的设计与整定原则,并通过严谨的仿真对比实验,验证了所提策略在改善模式切换平滑性方面的优越性能。; 适合人群:具备扎实的电力电子与电力传动理论基础,熟练掌握Simulink/MATLAB仿真工具,正在从事高频软开关变换器、DC-DC电源变换、新能源并网逆变器等相关领域研究的硕士、博士研究生及科研技术人员。; 使用场景及目标:①深入理解全桥LLC谐振变换器的工作原理、谐振特性及其多模式运行机制;②掌握变频与移相结合的混合控制策略的设计思想与实现方法;③将其应用于高效率、高可靠性电源系统的动态性能优化,为解决实际工程中电源启停、负载突变等工况下的稳定性问题提供理论依据和技术方案。; 阅读建议:建议读者结合所提供的Simulink模型文件进行同步操作与学习,重点关注控制器模块的搭建细节、控制逻辑的实现方式以及各关键参数的调节过程。应主动对比单一变频、单一移相与协同控制三种策略下的仿真波形,从电压、电流的瞬态响应中直观感受协同控制的优势,从而深化对先进控制理论在电力电子系统中应用价值的理解。
代码转载自:https://pan.quark.cn/s/b9146ae38508 《Linux From Scratch》(LFS)是一部详尽阐述如何从源代码开始构建Linux系统的指南性著作。书中包含了完整的流程和说明,指导读者逐步构建个性化的Linux系统。这本书不仅适合那些希望探究Linux操作系统内部运作机制的用户,同时也适合那些希望构建专业级、高度定制化系统的进阶用户。LFS的中文版本将这一过程用中文详细描述,使中文用户能够毫无障碍地遵循书中的步骤来定制Linux系统。本书的翻译工作由多位译者分别承担,他们分别是金步国、ipconfigme和bobkey,各自负责不同章节的翻译任务。本书的结构分为若干部分,各部分内容如下: 第一部分主要阐述了如何构建LFS系统。在这一部分中,首先解释了LFS的定义以及构建LFS系统的必要性。接着,列出了构建LFS系统的目标读者群体、先决条件、对宿主系统的要求,并说明了排版约定和本书的组织结构。此外,还提供了版本更新记录,帮助读者了解不同版本之间的差异。 在“准备一个新分区”章节中,讲解了如何在计算机上创建新分区并在该分区上建立文件系统,为安装LFS系统进行准备。 在“软件包和补丁”章节,LFS列出了所有需要下载的软件包和补丁,并介绍了它们的用途。 在“最后的准备工作”章节,书中指导读者设置环境变量$LFS,创建$LFS/tools目录,添加LFS用户,并设定工作环境。 紧随其后,在“构建临时编译环境”章节中,详细介绍了如何创建一个临时编译环境,这个环境是编译和安装最终的LFS系统所必需的工具链。这一部分包括了如何编译安装Binutils、GCC、Linux内核头文件、Glibc,以及调整工具链等步骤。 本书详细说...
IEEE基于高频信号注入法的PMSM零低速无位置控制永磁同步电机仿真,有参考文献内容概要:本文主要介绍了一种基于高频信号注入法的永磁同步电机(PMSM)在零低速条件下的无位置传感器控制技术,重点研究了通过高频信号注入实现转子初始位置辨识和零低速运行时的精确控制。该方法利用电机交直轴高频阻抗的差异特性,通过注入高频电压信号并检测响应电流,构建转子位置观测器,从而实现对转子位置与速度的准确估计。文中详细阐述了脉振高频电压注入法的原理、观测器设计方法及其收敛性分析,并结合Simulink仿真平台验证了所提控制策略的有效性和鲁棒性。此外,文档还列举了大量相关研究主题,涵盖电机控制、新能源系统优化、智能算法应用等多个领域,体现出该技术在现代电力电子与电机控制系统中的广泛适用性。; 适合人群:具备一定电机控制与电力电子基础知识,从事自动化、电气工程及相关领域研究的研发人员与高校研究生。; 使用场景及目标:①应用于永磁同步电机驱动系统中,解决低速及零速时因反电动势微弱而导致的传统观测器失效问题;②为无位置传感器控制策略的科研仿真与工程实现提供技术参考与代码支持;③结合Matlab/Simulink进行教学演示与算法验证,促进理论与实践结合。; 阅读建议:此资源以仿真为核心,建议读者结合提供的Simulink模型与Matlab代码进行实操演练,重点关注高频信号注入参数设计、观测器结构搭建与系统稳定性分析,同时可参照文中列出的相关研究方向拓展学习深度。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧