㈠ 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。