㈠ java的Swing
使用I/O流吧,先获取上传文件路径,使用File的方法可以获取文件夹下的文件,不同的文件处理方法截然不同,所以必须使用相应的逻辑,例如处理excel,用第三方框架poi或jxl,简单的文本文件就很简单了,自己多看看这方面的介绍
㈡ java swing repaint不能显示图片的原因
你的代码我看过了,好久没写JAVA SWING了,我的意见是:
我怀疑可能是你repaint太多次,检查下你的调用逻辑,如果不是,那就是Canvas父类本身就码渣自动实现了repaint,无须手动调用活着重写repaint,因为你这里没橘返有用到双缓迟伍悄冲处理,我觉得没必要手动写repaint。
㈢ JAVA初学者:swing是什么
看看这个就知道了
Java应用程序用户界面开发包
Swing是一个用于开发Java应用程序用户界面的开发工具包。它以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。
工具包中所有的包都是以swing作为名称,例如javax.swing,javax.swing.event
用Swing创建图形界面步骤:
(1)导入Swing包
(2)选择界面风格
(3)设置顶层容器
(4)设置按钮和标签
(5)将组件放到容器上
(6)为组件增加边框
(7)处理事件
(8)辅助技术支持
1。导入Swing包
下面语句导入Swing包
import javax.swing.*;
大部分Swing程序用到了AWT的基础底层结构和事件模型,因此需要导入两个包:
import java.awt.*;
import java.awt.event.*;
如果图形界面中包括了事件处理,那么还需要导入事件处理包:
import javax.swing.event.*;
2.选择界面风格
Swing允许选择程序的图形界面风格常用的有java风格,windows风格等
下面的代码用于选择图形界面风格,这里选择的是跨平台的Java界面风格。
try { UIManager.setLookAndFeel(
UIManager.( )); }
catch (Exception e) { }
(3) 设置顶层容器
图形界面至少要有一个顶级Swing容器
顶级Swing容器为其它Swing组件在屏幕上的绘制和处理事件提供支持
常用的顶级容器:
JFrame(框架):表示主程序窗口
JDialog(对话框):每个JDialog对象表示一个对话框,对话框属于二级窗口
JApplet(小程序):在浏览器内显示一个小程序界面
一个框架包括边界、菜单栏、工具栏、状态栏,以及中间占主要部分的窗格
窗格也可以看作是一种面板,但它是框架的一个组成部分
组件不会直接放到框架上,而是放在若干个面板上,这些面板再放到窗格上
用框架对象的getContentPane()函数来获得窗格,再调用窗格的add()函数放置面板
public static void main(String[ ]args){JFrame frame=new JFrame("SwingApplication");
JPanel panel1=new JPanel();
frame.getContentPane().add(panel1,BorderLayout.CENTER);
......//添加其他组件
frame.pack();frame.setVisible(true);}
㈣ JavaSwing图形界面开发与案例详解的内容简介
全书共20章,其中第1~2章主要介绍有关Swing的基础知识,包括Swing的基本概述、如何使用IDE开发Swing程序;第3~15章结合众多实例和问题介绍最常用、最有用的组件及其应用方法,包括标签和按钮组件、布局管理器组件、面板组件、列表框组件、下拉列表框组件、进度条组件、时间组件、滑块组件、分隔条组件、选取器组件、文本组件、窗口组件、对话框组件、JApplet组件、菜单组件、工具条组件、表格组件、树组件以及组件的事件处理机制等;第16~19章主要讲述有关Swing图形开发的其他知识,包括观感器、Swing线程与并发、模型与架构等。第20章通过一个综合实例使读者能够在实际开发中理解和巩固所学知识,从而提高综合应用能力。
《JavaSwing图形界面开发与案例详解》几乎涵盖了目前JavaSwing图形开发必备的所有常用知识,拥有丰富的实例,且这些实例均来自于工程实践,《JavaSwing图形界面开发与案例详解》适合Java程序语言的初学者阅读,也可供具有一定编程经验的初级编程人员参考。
㈤ Swing增加透明窗体及不规则窗体
支持透明和不规则窗口已绝庆运经成为 AWT 和 Swing 团队长久以来梦寐以求的功能 尽管本机应用程序在主要操作系统上使用这项功能已经为时已久 但在核心 Java 中还不能使用它 即将发布的 Consumer JRE 正在进行修改 也就是对 Java SE 进行重大更新 Java SE 将为创建不规则 全透明和每个像素透明的顶级窗口提供 API
历史本机应用程序的开发人员通常在开发 UI 应用程序中享受了更高级的灵活性 但是为此而付出的代价是将应用程序限制在某一特定平台上 在许多情况中 这种灵活性不如获得更为丰富的 UI 体验和桌面紧密集成那么重要 从传统上讲 跨平台 UI 工具箱 例如 Swing SWT QT 和 wxWidgets 趋向于被动应付众所周知的两难问题 当只有某些目标平台支持所要求的功能时怎么办?在这种情况下 模拟缺失的功能可能只会让您南辕北辙
不规则和透明窗口是跨平台 UI 工具箱局限性的最好例子 如果在特定目标平台不支持此并梁项功能 那么在该平台上就没有什么更多事情要做了 此项功能可能用作强有力的参数向工具箱添加该项功能 但是 Swing 开发人员社区长久以来一直争论主要目标平台不久就会提供这些功能 事实上 Windows 自从 Windows (参见 MSDN 上的 SetWindowRgn 文档 )就已经支持不规则窗口了 在 X 中匹配功能自从 年 ( 参见 X Nonrectangular Window Shape Extension Library PDF 文档 )就已经可用了 在 OS X 中您仅能在 JFrame 上设置透明的背景颜色
直到现在 对跨平台透明和不规则窗口有兴趣的 Swing 应用程序有三种主要可选方式
在显示目标窗口之前使用 java awt Robot 捕获桌面 这种方法在 Joshua Marinacci 和 Chris Adamson 编写的 《 Swing Hacks 》 书中的 第 章 中已经进行了评述
使用 JNI 包装目标平台的本机 API 使用由 Timothy Wall 开发的 JNA 库 该库在 年问世 Timothy 对于 不规则窗口 和 字母掩码透明度 已经发表过博客
第一种方法的主要问题是要使用 Robot 类 即使您有权限获得屏幕截图 您也必须在显示窗口之前完成 此外 如何保持桌面后台同步?假设在后台正在播放 YouTube 视频 与窗口生成的事件不同( 调整大小 移动 ) AWT 并不在任何交叉窗口的重画上提供注册侦听器的任何方式 虽然 Chris 和 Joshua 通过在至少每秒内进行快照提供解决方法 这对于覆盖后台视频播放还不够 而且在每次快照前需要对窗口加以隐藏 这可能导致可见的闪烁
使用 JNI 和 JNA 导致显著的视觉保真性改进 纯 JNI 会带来开销的急剧下降 您必须将目标平台的每一个相关的 API 绑定 还要捆绑本机库 JNA 为您分担这项重任 它捆绑主机库并提供能在运行时提取并加载它们的类加载器 它支持 Linux OS X Windows Solaris 和 FreeBSD
Consumer JRE Java SE Update N 通常称作 Consumer JRE 是 Sun 公司的努力成果 为重新配置 Java将其作为开发富桌面应用程序的可行方法 在 Consumer JRE 中的新功能和主要改进列表相当广泛 并将特别闪耀的宝石隐藏在最新一周构建代码之一的发行说明中 Bug 被简单地赋予 需要支持不规则/透明窗口 的标题 但是该实现核心 JDK 新功能的可能性所带给 Swing 开发人员的意义是深远的 本文的剩余部分将显示能够实现和差羡如何实现该功能的几个示例
在进一步研究之前 有一个非常重要的注意事项 由于 Consumer JRE 被官方认为是对稳定 JDK 发行的一个次要更新 因此在 公共 包中不能添加任何新的 API( 类 方法等等 ) 例如 java awt 或 javax swing 在本文中讨论的所有 API 在新 sun awt AWTUtilities 类中出现 该类不是官方支持的部分 API 它在 Java SE 中的位置最有可能发生改变 签名方法可能在现在和最终的 Consumer JRE 发行之间发生轻微变化 所以当这种改变发生时准备更改您自己的代码
AWTUtilities 类我首先讨论 sun awt AWTUtilities 类 请参见 在核心 Java 中的透明和不规则窗口 博客条目 首先我们从图 中的简单窗口入手
图 带有控件的窗口
要使窗口透明 您可以使用 AWTUtilities setWindowOpacity(Window float) 方法 如图 所示
图 相同的窗口 但是有 % 的不透明度
要使窗口不规则 您可以使用 AWTUtilities setWindowShape(Window Shape) 方法 如图 所示
图 相同的窗口 但是被一个椭圆剪裁
正如您从图 中能看到的 不规则的窗口看起来不是很好 窗口的边缘呈锯齿状并且整体印象也不是很干净 要获得不规则窗口的更佳视觉效果 您必须使用 AWTUtilities setWindowOpaque(Window boolean) API 并使用柔性裁剪绘画窗口背景 这在后续的 Swing窗口的柔性裁剪和每像素透明度 博客条目中进行了阐明 对于窗口的左上角和右上角 该条目采用 Chris Campbell 的 柔性裁剪教程 以及 Romain Guy 的 反射教程 其中包括 Sebastien Petrucci 的改进 图 显示了每个像素透明的柔性裁剪窗口
图 柔性裁剪和每个像素透明的窗口
现在我们手头上已经有了这些 API 我们打算做些什么呢?对它们进行探索这种可能性当然是另人好奇的 我们正打算看看几个多样混合的示例
工具提示让我们使应用工具提示变得透明怎么样?对于轻量级工具提示 实现这一目标是相当容易的 因为它们被作为 Swing 顶级窗口的一部分加以绘画 ( 要获得关于轻量级弹出菜单的详细信息 请参见 玻璃窗格和轻量级弹出菜单 条目 )但是 一旦工具提示成为重量级并 打破 窗口绑定 您必须继续采用 Robot 或 JNI/JNA 现在让我们看一看使用 AWTUtilities API 如何完成这项任务
javax swing PopupFactory 是创建弹出菜单的厂 工具提示只是弹出功能的一个例子 其他例子包括组合框下拉列表和菜单 PopupFactory setSharedInstance API 可以被用于设置自定义弹出厂 这就是我们想要做的 当前的弹出厂被用于创建所有应用弹出窗口 我们将在所有的工具提示上安装自定义不透明厂
核心弹出厂的实现是相当复杂的 首先尝试创建轻量级弹出窗口 当要求创建重量级窗口时 系统要管理高速缓存以便重用先前创建的弹出窗口 实现过程将创建一个新的重量级弹出窗口 在相对较新的膝上型电脑上运行不同的方案还未显示任何突出的性能突破 让我们从自定义弹出厂着手研究
public class TranslucentPopupFactory extends PopupFactory { @Override public Popup getPopup(Component owner Component contents int x int y) throws IllegalArgumentException { // A more plete implementation would cache and reuse // popups return new TranslucentPopup(owner contents x y) }}TranslucentPopup 的实现相当简单 构造器创建新的 JWindow 将工具提示的不透明度设置为 从 Looks 项目安装提供拖放阴影的自定义边框
TranslucentPopup(Component owner Component contents int ownerX int ownerY) { // create a new heavyweight window this popupWindow = new JWindow() // mark the popup with partial opacity sun awt AWTUtilities setWindowOpacity(popupWindow (contents instanceof JToolTip) ? f f) // determine the popup location popupWindow setLocation(ownerX ownerY) // add the contents to the popup popupWindow getContentPane() add(contents BorderLayout CENTER) contents invalidate() JComponent parent = (JComponent) contents getParent() // set the shadow border parent setBorder(new ShadowPopupBorder()) }现在我们需要重写 Popup 的 show() 方法来标记整个弹出窗口为透明样式 这要求拖放阴影边框的每个像素具有透明性
@Override public void show() { this popupWindow setVisible(true) this popupWindow pack() // mark the window as non opaque so that the // shadow border pixels take on the per pixel // translucency sun awt AWTUtilities setWindowOpaque(this popupWindow false) }hide() 方法只是隐藏并处置弹出窗口
@Override public void hide() { this popupWindow setVisible(false) this popupWindow removeAll() this popupWindow dispose() }要安装该弹出窗口 仅简单调用
PopupFactory setSharedInstance(new TranslucentPopupFactory()) 图 显示了一个具有透明工具提示的示例帧 注意 与工具提示保持视觉(透明性和拖放阴影边框)上的一致性跨越 Swing 帧绑定并扩展到后台 Eclipse 窗口
图 工具提示
现在我们做相同的动画 当工具提示显示时将颜色调淡些 当它被隐藏起来时把它的颜色渐隐如何?一旦您熟悉了 AWTUtilities API 上述操作不难实现 下面给出 show() 方法的代码
@Override public void show() { if (this toFade) { // mark the popup with % opacity this currOpacity = sun awt AWTUtilities setWindowOpacity(popupWindow f) } this popupWindow setVisible(true) this popupWindow pack() // mark the window as non opaque so that the // shadow border pixels take on the per pixel // translucency sun awt AWTUtilities setWindowOpaque(this popupWindow false) if (this toFade) { // start fading in this fadeInTimer = new Timer( new ActionListener() { public void actionPerformed(ActionEvent e) { currOpacity += if (currOpacity <= ) { sun awt AWTUtilities setWindowOpacity(popupWindow currOpacity / f) // workaround bug should call // popupWindow repaint() but that will not repaint the // panel popupWindow getContentPane() repaint() } else { currOpacity = fadeInTimer stop() } } }) this fadeInTimer setRepeats(true) this fadeInTimer start() } }这时我们用0%的不透明度标记弹出窗口 然后我们启动重复计时器进行五次迭代 每一次跌代我们增加窗口不透明度 % 并重新绘画 最后我们停止计时器 最终的视觉结果是工具提示外观的平滑退色序列 这一序列持续大约 毫秒
hide() 方法非常类似
@Override public void hide() { if (this toFade) { // cancel fade in if it s running if (this fadeInTimer isRunning()) this fadeInTimer stop() // start fading out this fadeOutTimer = new Timer( new ActionListener() { public void actionPerformed(ActionEvent e) { currOpacity = if (currOpacity >= ) { sun awt AWTUtilities setWindowOpacity(popupWindow currOpacity / f) // workaround bug should call // popupWindow repaint() but that will not repaint the // panel popupWindow getContentPane() repaint() } else { fadeOutTimer stop() popupWindow setVisible(false) popupWindow removeAll() popupWindow dispose() currOpacity = } } }) this fadeOutTimer setRepeats(true) this fadeOutTimer start() } else { popupWindow setVisible(false) popupWindow removeAll() popupWindow dispose() } }首先检查退色序列是否仍在运行 根据需要将它删除 然后 不立即隐藏窗口 而是将不透明度以 % 的增量从 % 改为 (因此渐隐序列是退色序列的两倍)然后隐藏并处置弹出窗口 注意两种方法参阅了 Boolean toFade 变量 —— 它在工具提示上被设置为 true 弹出窗口的其他类型(菜单 组合框下拉列表)没有退色动画
视频反射现在让我们做些更为激动人心的事情 在 Romain Guy 的博客条目 重画管理器演示(第 章) 中 它显示了提供反射功能的 Swing 组件 从他与 Chet Haase 合著的 《肮脏的富客户机》 书中抽取一段测试应用程序 其中显示该组件提供了 QuickTime 电影的实时反射 在窗口绑定 之外 进行反射如何?
首先要有实际应用中的反射帧的屏幕截图 图 显示了正在播放 Get a Mac 广告的形状规则的 Swing 帧( 使用嵌入式 QuickTime 播放器 ) 伴随着覆盖桌面的透明的实时反射
图 QuickTime 电影的反射
该实现重用了来自 Romain 的几个构造块并将它们扩展到 桢外 它还有一个重画管理器 ( 要了解关于重画管理器方面的详细信息 请参见 使用重画管理器的验证覆盖 条目 )以便将主桢内容与反射窗口保持同步 还需要在主桢上注册组件侦听器和窗口侦听器以便确保反射窗口与主窗口的可见性 位置和大小保持同步 除此之外 还要有一个自定义窗格将其内容绘画到脱屏缓冲区 脱屏缓冲区被用于绘画主桢和在反射窗口内的反射
让我们看一下代码 主类是扩展 JFrame 的 JReflectionFrame 构造器创建了反射窗口并向其中添加非双重缓冲和透明的面板 还重写了面板的 paintComponent() 以便绘画主桢内容的反射 在初始化反射桢的位置和大小后 我们安装了一个自定义重画管理器
public JReflectionFrame(String title) { super(title) reflection = new JWindow() reflectionPanel = new JPanel() { @Override protected void paintComponent(Graphics g) { // paint the reflection of the main window paintReflection(g) } } // mark the panel as non double buffered and non opaque // to make it translucent reflectionPanel setDoubleBuffered(false) reflectionPanel setOpaque(false) reflection setLayout(new BorderLayout()) reflection add(reflectionPanel BorderLayout CENTER) // register listeners see below …… // initialize the reflection size and location reflection setSize(getSize()) reflection setLocation(getX() getY() + getHeight()) reflection setVisible(true) // install custom repaint manager to force re painting // the reflection when something in the main window is // repainted RepaintManager setCurrentManager(new ReflectionRepaintManager()) }下面是保持反射窗口与主桢同步的侦听器
this addComponentListener(new ComponentAdapter() { @Override public void ponentHidden(ComponentEvent e) { reflection setVisible(false) } @Override public void ponentMoved(ComponentEvent e) { // update the reflection location reflection setLocation(getX() getY() + getHeight()) } @Override public void ponentResized(ComponentEvent e) { // update the reflection size and location reflection setSize(getWidth() getHeight()) reflection setLocation(getX() getY() + getHeight()) } @Override public void ponentShown(ComponentEvent e) { reflection setVisible(true) // if the reflection window is opaque mark // it as per pixel translucent if ( sun awt AWTUtilities isWindowOpaque(reflection)) { sun awt AWTUtilities setWindowOpaque(reflection false) } } }) this addWindowListener(new WindowAdapter() { @Override public void windowActivated(WindowEvent e) { // force showing the reflection window reflection setAlwaysOnTop(true) reflection setAlwaysOnTop(false) } }) 重画管理器相当简单 它强制主桢的整个根窗格重画 然后更新反射窗口 这样可以最优化更新区域反射的同步 对于示例应用程序要达到的目的 这点就足够了
private class ReflectionRepaintManager extends RepaintManager { @Override public void addDirtyRegion(JComponent c int x int y int w int h) { Window win = SwingUtilities getWindowAncestor(c) if (win instanceof JReflectionFrame) { // mark the entire root pane to be repainted JRootPane rp = ((JReflectionFrame) win) getRootPane() super addDirtyRegion(rp rp getWidth() rp getHeight()) // workaround bug should call reflection repaint() // but that will not repaint the panel reflectionPanel repaint() } else { super addDirtyRegion(c x y w h) } } }主桢 (脱屏缓冲区) 和反射窗口的绘图代码在 Romain 的 反射教程 中进行了详细描述
lishixin/Article/program/Java/hx/201311/25650
㈥ 如何用JAVA Swing 做出 登陆界面时的 进度条
//给你个例子吧
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.*;
public class ProgressSample {
static class BarThread extends Thread {
private static int DELAY = 500;
JProgressBar progressBar;
public BarThread(JProgressBar bar) {
progressBar = bar;
}
public void run() {
int minimum = progressBar.getMinimum();
int maximum = progressBar.getMaximum();
Runnable runner = new Runnable() {
public void run() {
int value = progressBar.getValue();
progressBar.setValue(value+1);
}
};
for (int i=minimum; i<maximum; i++) {
try {
SwingUtilities.invokeAndWait(runner);
// Our task for each step is to just sleep
Thread.sleep(DELAY);
} catch (InterruptedException ignoredException) {
} catch (InvocationTargetException ignoredException) {
}
}
}
}
public static void main(String args[]) {
// Initialize
final JProgressBar aJProgressBar = new JProgressBar(0, 100);
final JButton aJButton = new JButton("Start");
aJProgressBar.setStringPainted(true); // 显示百分比字符
aJProgressBar.setIndeterminate(false); // 不确定的进度条
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
aJButton.setEnabled(false);
Thread stepper = new BarThread(aJProgressBar);
stepper.start();
}
};
aJButton.addActionListener(actionListener);
JFrame theFrame = new JFrame("Progress Bars");
theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = theFrame.getContentPane();
contentPane.setLayout(new GridLayout(2,1));
contentPane.add(aJProgressBar);
contentPane.add(aJButton);
theFrame.setSize(300, 100);
theFrame.setVisible(true);
}
}
㈦ 使用java swing做个界面,中间的容器部分是加载一个网页,该如何解决、可以提供代码参考最好
importjavax.swing.*;
importjava.awt.*;
importjava.io.*;
/**
*@authorHardneedl
*/
{
publicStringgetTitle(){return"htmldemo";}
=newDimension(600,400);
(){returnsize;}
public卜改DimensiongetMaximumSize(){returnsize;}
publicDimensiongetMinimumSize(){returnsize;}
publicDimensiongetSize(){returnsize;}
privateStringu;
HTMLDemo(Stringurl)throwsHeadlessException{
u=url;
attachListeners();
doLay();
}
privatevoidattachListeners(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
型胡判}
privatevoiddoLay(){
Containercontainer=做逗getContentPane();
try{
container.add(newJScrollPane(newJEditorPane(u)));
}catch(IOExceptione){
e.printStackTrace();
}
pack();
setVisible(true);
}
publicstaticvoidmain(finalString[]args){
SwingUtilities.invokeLater(newRunnable(){
publicvoidrun(){newHTMLDemo(args[0]);}
});
}
}
你可以参考这篇文章,使用JavaXPCOM在界面中嵌入mozilla浏览器。参考链接
㈧ 求高手用java SWING实现下图结构
这是服务器端:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.net.Socket;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
public class J_ChatClient extends JFrame
{
private ObjectInputStream m_input; // 输神码入流
private ObjectOutputStream m_output; // 输出流
private JTextField m_enter; // 输入区域
private JTextArea m_display; //老举 显示区域
public J_ChatClient( ) // 在图形界面中添加组件
{
super("聊天程序客户端"侍瞎碧);
Container c = getContentPane( );
m_enter = new JTextField( );
m_enter.setEnabled( false );
m_enter.addActionListener(new ActionListener( )
{
public void actionPerformed( ActionEvent event )
{ // 向服务器端发送数据
try
{
String s = event.getActionCommand( );
m_output.writeObject( s );
m_output.flush( );
mb_displayAppend( "客户端: " + s );
m_enter.setText( "" ); // 清除输入区域的原有内容
}
catch (Exception e)
{
System.err.println("发生异常:" + e);
e.printStackTrace( );
} // try-catch结构结束
} // 方法actionPerformed结束
} // 实现接口ActionListener的内部类结束
); // addActionListener方法调用结束
c.add( m_enter, BorderLayout.NORTH );
m_display = new JTextArea( );
c.add( new JScrollPane( m_display ), BorderLayout.CENTER );
} // J_ChatClient构造方法结束
public void mb_displayAppend( String s )
{
m_display.append( s + "\n" );
m_display.setCaretPosition( m_display.getText( ).length( ) );
m_enter.requestFocusInWindow( ); // 转移输入焦点到输入区域
} // 方法mb_displayAppend结束
public boolean mb_isEndSession( String m )
{
if (m.equalsIgnoreCase("q"))
return(true);
if (m.equalsIgnoreCase("quit"))
return(true);
if (m.equalsIgnoreCase("exit"))
return(true);
if (m.equalsIgnoreCase("end"))
return(true);
if (m.equalsIgnoreCase("结束"))
return(true);
return(false);
} // 方法mb_isEndSession结束
public void mb_run( String host, int port)
{
try
{
mb_displayAppend("尝试连接");
Socket s = new Socket(host, port);
String m; // 来自服务器端的消息
m_output = new ObjectOutputStream( s.getOutputStream( ) );
m_input = new ObjectInputStream( s.getInputStream( ) );
m_enter.setEnabled( true );
do
{
m = (String) m_input.readObject( );
mb_displayAppend("服务器端: " + m);
} while(!mb_isEndSession( m ));// do-while循环结束
m_output.writeObject("q"); // 通知服务端退出程序
m_output.flush( );
m_output.close( );
m_input.close( );
s.close( );
System.exit( 0 );
}
catch (Exception e)
{
System.err.println("发生异常:" + e);
e.printStackTrace( );
mb_displayAppend("发生异常");
} // try-catch结构结束
} // 方法mb_run结束
public static void main(String args[ ])
{
J_ChatClient app = new J_ChatClient( );
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setSize(350, 150);
app.setVisible(true);
if ( args.length == 0 )
app.mb_run("localhost", 5000);
else app.mb_run(args[0], 5000);
} // 方法main结束
} // 类J_ChatClient结束
这是客户端:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
public class J_ChatServer extends JFrame
{
private ObjectInputStream m_input; // 输入流
private ObjectOutputStream m_output; // 输出流
private JTextField m_enter; // 输入区域
private JTextArea m_display; // 显示区域
private int m_clientNumber = 0; // 连接的客户数
public J_ChatServer( ) // 在图形界面中添加组件
{
super("聊天程序服务器端");
Container c = getContentPane( );
m_enter = new JTextField( );
m_enter.setEnabled( false );
m_enter.addActionListener(new ActionListener( )
{
public void actionPerformed( ActionEvent event )
{ // 向客户端发送数据
try
{
String s = event.getActionCommand( );
m_output.writeObject( s );
m_output.flush( );
mb_displayAppend( "服务器端: " + s );
m_enter.setText( "" ); // 清除输入区域的原有内容
}
catch (Exception e)
{
System.err.println("发生异常:" + e);
e.printStackTrace( );
} // try-catch结构结束
} // 方法actionPerformed结束
} // 实现接口ActionListener的内部类结束
); // addActionListener方法调用结束
c.add( m_enter, BorderLayout.NORTH );
m_display = new JTextArea( );
c.add( new JScrollPane( m_display ), BorderLayout.CENTER );
} // J_ChatServer构造方法结束
public void mb_displayAppend( String s )
{
m_display.append( s + "\n" ); //将给定文本追加到文档结尾
//设置 TextComponent 的文本插入符的位置。注意,插入符可跟踪更改,所以如果组件的基础文本被更改,
//则此位置可能会移动。如果文档为 null,则不执行任何操作。位置必须在 0 和组件的文本长度之间,否则将抛出异常
m_display.setCaretPosition( m_display.getText( ).length( ) );
m_enter.requestFocusInWindow( ); // 转移输入焦点到输入区域
} // 方法mb_displayAppend结束
public boolean mb_isEndSession( String m )
{
if (m.equalsIgnoreCase("q"))
return(true);
if (m.equalsIgnoreCase("quit"))
return(true);
if (m.equalsIgnoreCase("exit"))
return(true);
if (m.equalsIgnoreCase("end"))
return(true);
if (m.equalsIgnoreCase("结束"))
return(true);
return(false);
} // 方法mb_isEndSession结束
public void mb_run( )
{
try
{
ServerSocket server = new ServerSocket(5000);
String m; // 来自客户端的消息
while (true)
{
m_clientNumber++;
mb_displayAppend("等待连接[" + m_clientNumber + "]" + " ");
Socket s = server.accept( );
mb_displayAppend("接收到客户端连接[" + m_clientNumber + "]" + " ");
m_output = new ObjectOutputStream( s.getOutputStream( ) );
m_input = new ObjectInputStream( s.getInputStream( ) );
m_output.writeObject("连接成功");
m_output.flush( );
m_enter.setEnabled( true );
do
{
m = (String) m_input.readObject( );
mb_displayAppend("客户端: " + m);
} while(!mb_isEndSession( m ));// do-while循环结束
m_output.writeObject("q"); // 通知客户端退出程序
m_output.flush( );
m_enter.setEnabled( false );
m_output.close( );
m_input.close( );
s.close( );
mb_displayAppend("连接[" + m_clientNumber + "]结束" + " ");
} // while循环结束
}
catch (Exception e)
{
System.err.println("发生异常:" + e);
e.printStackTrace( );
mb_displayAppend("连接[" + m_clientNumber +"]发生异常" + " ");
} // try-catch结构结束
} // 方法mb_run结束
public static void main(String args[ ])
{
J_ChatServer app = new J_ChatServer( );
app.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
app.setSize(350, 150);
app.setVisible(true);
app.mb_run( );
} // 方法main结束
} // 类J_ChatServer结束
楼主看看就应该懂了,我注释的很详细的,这个是我以前学Socket编程的时候,写的一个例子
㈨ java的swing组件的使用
Swing是用于图形用户界面开发的一个全面解决方案,包括250多个类,在这里不能一一列出。本书仅使用Swing用户界面。
1.标 签 2.按 钮 3.文本域 4.文本区 5.列表框 6.组合框
7.复选框 8.单选按钮 9.滚动条 10.选项卡 11.对话框 12.菜 单
1.标 签
标签类JLabel是用于显示文字或图标的简单组件。JLabel的构造方法包括:
public JLabel()
public JLabel(Icon icon)
public JLabel(Icon icon, int horizontalAlignment)
public JLabel(String text)
public JLabel(String text, Icon icon, int horizontalAlignment)
public JLabel(String text, int horizontalAlignment)
在构造方法中,text指定标签的文字,icon指定标签的图标,horizontalAlignment指定文本或图标的水平对齐方式。
JLabel实例维护的属性包括:
表8.3 JLabel的属性 属性名
数据类型
访问
缺省值
disabledIcon
Icon
SG
灰色过滤图标
displayedMnemonic
Int
SG
——
horizontalAlignment
Int
CSG
LEFT
horizontalTextPosition
Int
SG
RIGHT
Icon
Icon
CSG
null
iconTextGap
Int
SG
4个像素
labelFor
Component
SG
null
Text
String
CSG
“”
verticalAlignment
Int
SG
CENTER
verticalTextPosition
int
SG
CENTER
注:在访问中,C=可在构造时设置/G=获取方法/S=设置方法
disabledIcon:标签被禁用时显示的图标。
displayedMnemonic:设置LabelFor属性后显示的助记符。
horizontalAlignment:标签内容的水平对齐方式。取值包括:SwingConstants.LEFT、SwingConstants.RIGHT和SwingConstants.CENTER。
horizontalTextPosition:文本相对于图标的水平位置;与水平对齐方式的有效值相同。
icon:标签在启用时显示的图标。
iconTextGap:标签的文本与图标之间的间隙,以像素点为单位。
labelFor:一个组件,它在标签的助记符被键入时获得焦点。
Text:标签显示的文本。
verticalAlignment:标签内容的垂直对齐方式。取值包括:SwingConstants.TOP、SwingConstants.BOTTOM和SwingConstants.CENTER。