java swing 中的FileDialog
import java.io.File;
/**
*
* @author Administrator
*/
public class EBBFileFilter extends javax.swing.filechooser.FileFilter {
private String Filter_Type;
public EBBFileFilter(String Filter_Type){
this.Filter_Type = Filter_Type;
}
public boolean accept(File f) {
if(Filter_Type.equals(“FileFilter_NB”)){
if (f.isDirectory()|| f.getPath().toLowerCase().endsWith(“.nb”)) {
return true;
}else{
return false;
}
}
if(Filter_Type.equals(“FileFilter_YB”)){
if (f.isDirectory()|| f.getPath().toLowerCase().endsWith(“.yb”)) {
return true;
}else{
return false;
}
}
if(Filter_Type.equals(“FileFilter_RB”)){
if (f.isDirectory()|| f.getPath().toLowerCase().endsWith(“.rb”)) {
return true;
}else{
return false;
}
}
if(Filter_Type.equals(“FileFilter_ETF”)){
if (f.isDirectory()|| f.getPath().toLowerCase().endsWith(“.etf”)) {
return true;
}else{
return false;
}
}else{
return true;
}
}
public String getDescription(){
if(Filter_Type.equals(“FileFilter_NB”)){
return “年报”;
}
if(Filter_Type.equals(“FileFilter_YB”)){
return “月报”;
}
if(Filter_Type.equals(“FileFilter_RB”)){
return “日报”;
}
if(Filter_Type.equals(“FileFilter_ETF”)){
return “模板文件”;
}
return null;
}
}
/////////—
//打开报表文件
private void open_BB() {
javax.swing.JFileChooser cf = new javax.swing.JFileChooser() {
public void approveSelection() {
super.approveSelection();
File file = this.getSelectedFile();
open_BB_Data(file);
}
};
cf.setDialogTitle(“选择文件”);
cf.setCurrentDirectory(new java.io.File(“file”));
cf.setMaximumSize(new java.awt.Dimension(425, 245));
cf.addChoosableFileFilter(new EBBFileFilter(“FileFilter_NB”));
cf.addChoosableFileFilter(new EBBFileFilter(“FileFilter_YB”));
cf.addChoosableFileFilter(new EBBFileFilter(“FileFilter_RB”));
cf.setAcceptAllFileFilterUsed(true);
cf.showOpenDialog(this);
}
我想知道如何用java swing设计我想要的这样的一个界面?望抽空帮助,万分感谢!
效果图
思路:
JTabbedPane 提供了一个setUI方法,来修改JTabbedPane 的界面和外观
然后我们可以继承BasicTabbedPaneUI 重写里面的部分绘制方法来修改外观
参考代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
public class SwingDemo extends JFrame implements ActionListener {
JButton jb;
JPanel jp3;
public SwingDemo() {
JTabbedPane jtpTotal = new JTabbedPane();//横向的JTabbedPane ,模块一,模块二…
JTabbedPane jtpa = new JTabbedPane();//模块一,对应的是jtpa
jtpa.setTabPlacement(JTabbedPane.LEFT);//设置标签在纵向
JPanel jp1 = new JPanel(new BorderLayout());//新建一个JPanel,布局为边界布局
JTextArea jta = new JTextArea();//文本域
jta.append(“人生若只如初见,何事秋风悲画扇.”);//文本域的内容
jta.setFont(new Font(“宋体”,Font.BOLD, 25));//文本域的文字
jp1.add(jta);
JPanel jp2 = new JPanel();
JLabel jl = new JLabel(“PI=3.1415926”);
jl.setFont(new Font(“隶书”,Font.BOLD, 20));
jl.setForeground(Color.RED);//设置jl的文字颜色
jp2.add(jl);
//为了方便响应事件,把jb,和jp3的定义放到了顶上
jp3 = new JPanel();
jb = new JButton(“点击按钮修改本页的背景色”);
jb.addActionListener(this);//添加事件响应
jp3.add(jb);
jtpa.add(“选项一”, jp1);
jtpa.add(“选项二”, jp2);
jtpa.add(“选项三”, jp3);
JPanel jpA = new JPanel(new BorderLayout());
jpA.add(jtpa);
//把jtpa的所有选项的标签的背景色设置为白色
for (int i = 0; i jtpa.getTabCount(); i++) {
jtpa.setBackgroundAt(i, Color.WHITE);
}
jtpa.setUI(new TPUI());
jtpTotal.add(“模块一”, jpA);
//下面的jtpb和jtpc没有添加组件,也没有设置颜色, 但是结构看起来比较直观
JTabbedPane jtpb = new JTabbedPane();
jtpb.setTabPlacement(JTabbedPane.LEFT);
JPanel jp4 = new JPanel();
JPanel jp5 = new JPanel();
JPanel jp6 = new JPanel();
jtpb.add(“选项四”, jp4);
jtpb.add(“选项五”, jp5);
jtpb.add(“选项六”, jp6);
JPanel jpB = new JPanel(new BorderLayout());
jpB.add(jtpb);
jtpTotal.add(“模块二”, jpB);
JTabbedPane jtpc = new JTabbedPane();
jtpc.setTabPlacement(JTabbedPane.LEFT);
JPanel jp7 = new JPanel();
JPanel jp8 = new JPanel();
JPanel jp9 = new JPanel();
jtpc.add(“选项七”, jp7);
jtpc.add(“选项八”, jp8);
jtpc.add(“选项九”, jp9);
JPanel jpC = new JPanel(new BorderLayout());
jpC.add(jtpc);
jtpTotal.add(“模块三”, jpC);
add(jtpTotal);
setTitle(“主窗口”);// 标题
setSize(620, 480);// 大小
setLocationRelativeTo(null);// 居中
setDefaultCloseOperation(EXIT_ON_CLOSE);// 关闭窗口后退出程序
setVisible(true);// 窗口可见
}
public static void main(String[] args) {
new SwingDemo();
}
@Override
public void actionPerformed(ActionEvent e) {//点击修改jp3的颜色
if(e.getSource()==jb){//如果是jb按钮被点击
jp3.setBackground(new Color(getInt(),getInt(),getInt()));//那么修改jp3的背景色
}
}
public int getInt(){//随机产生0~255之间的数字,用于生成随机颜色r,g,b
return (int) (Math.random()*256);
}
}
//注意,此类用于修改外观JTabbedPane
class TPUI extends BasicTabbedPaneUI {
public static ComponentUI createUI(JComponent c) {
return new TPUI();
}
@Override
protected void paintTabBorder(Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h,
boolean isSelected) {
if (isSelected) {//如果该标签被选中, 那么绘制矩形
g.setColor(new Color(116, 168, 231));
g.fillRect(x + w – 10, y, x+w, h);
}else{//没有被选中时的边框, 也可以不用绘制
g.setColor(new Color(116, 168, 231));
g.drawRect(x + w – 8, y, x+w, h);
}
}
@Override
protected void paintTabBackground(Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h,
boolean isSelected) {
g.setColor(Color.RED);
super.paintTabBackground(g, tabPlacement, tabIndex, x, y, w, h, false);
// 最后一个参数 true绘制背景色.false不绘制
// 如果参数是isSelected ,那么选中就绘制背景色,不选中就不绘制
}
}
java swing界面设计
GUI图形界面设计的重点是布局
SWING也是采用AWT的布局方式,进行布局管理的。(实现LayoutManager接口的方法,来进行管理布局,API中已有实现类,我们通常只需要指定实现类,而不需要自己重写方法)
常用的布局有绝对布局, 边界布局BorderLayout,流布局FlowLayout,表格布局GridLayout。
JFrame等重量级组件,默认布局是边界布局,JPanel轻量级组件,默认布局是流布局
绝对布局:布局的特点,需要指定每个组件的大小,和具体位置。
优点:充分的自定义,充分的自由,可以写出漂亮的 ,细致的界面
缺点:绝对布局在不同的操作系统下,会有一些不同程度的变化,导致界面变形,甚至组件重叠等。在同一操作系统下,窗口放大缩小,界面也会变形
绝对布局的范例
import javax.swing.JButton;
import javax.swing.JFrame;
public class Frame1 extends JFrame{
JButton jb1;
public Frame1() {
setLayout(null);//指定窗口的布局管理器为空,也就是绝对布局
jb1 = new JButton(“按钮”);
jb1.setLocation(100, 50);//指定组件的位置
jb1.setSize(80, 30);//指定组件的大小
//jb1.setBounds(100, 50, 80, 30);//上面两句代码等同于这句代码
add(jb1);
setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Frame1().setVisible(true);
}
}
边界布局BorderLayout:它可以对容器组件进行安排,并调整其大小,使其符合下列五个区域:北、南、东、西、中。每个区域最多只能包含一个组件
优点:比较常用的布局,简单易掌握,放大缩小,不影响组件的位置
缺点:组件位置不够灵活。每个区域如果添加多个组件,那么后面的组件会覆盖前面的组件。(因为可以嵌套其他组件使用,所以这些缺点基本都能克服)
3. 代码参考
import javax.swing.*;
import java.awt.*;
public class P004_BorderLayout {
JFrame jframe;
JButton jb1,jb2,jb3,jb4,jb5;
public P004_BorderLayout(){
jframe = new JFrame();
jframe.setTitle(“边界布局”);
jframe.setBounds(300, 200, 180, 180);
jb1 = new JButton(“东”);
jframe.add(jb1, BorderLayout.EAST);
jb2 = new JButton(“西”);
jframe.add(jb2,BorderLayout.WEST);
jb3 = new JButton(“南”);
jframe.add(jb3,BorderLayout.SOUTH);
jb4 = new JButton(“北”);
jframe.add(jb4,BorderLayout.NORTH);
jb5 = new JButton(“中”);
jframe.add(jb5);//BorderLayout.CENTER可以省略
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setVisible(true);
}
public static void main(String[] args) {
new P004_BorderLayout();
}
}
流布局FlowLayout:像一排文字一个挨着一个的布局。流布局用于安排有向流中的组件,这非常类似于段落中的文本行。流的方向可以指定。
优点:可以快速添加组件,不用指定位置,也不用指定边界
缺点:线性排列 ,外观单调。(嵌套其他布局,可以忽略缺点)
代码参考
import java.awt.FlowLayout;
import javax.swing.*;
public class P003_FlowLayout {
JFrame jframe;
public P003_FlowLayout(){
jframe = new JFrame(“流式布局”);
for (int i = 1; i = 5; i++) {
jframe.add(new JButton(i+””));
}
jframe.setLocation(380, 260);
jframe.setLayout(new FlowLayout(FlowLayout.LEFT));//窗口指定位流式布局,方向从左往右
jframe.pack();
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setVisible(true);
}
public static void main(String[] args) {
new P003_FlowLayout();
}
}
表格布局GridLayout:它以矩形网格形式对容器的组件进行布置。容器被分成大小相等的矩形,一个矩形中放置一个组件。
优点:组件整齐排列,
缺点:如果添加的组件数量,和指定的数量不一致,容易导致缺失等
参考代码
import javax.swing.*;
import java.awt.*;
public class P005_GridLayout {
JFrame jframe;
public P005_GridLayout() {
jframe = new JFrame(“表格布局”);
jframe.setLayout(new GridLayout(3, 4));//表格布局,3行 4列
for (int i = 0; i = 12; i++) {
jframe.add(new JButton(i+””));
}
jframe.setLocation(300, 200);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.pack();
jframe.setVisible(true);
}
public static void main(String[] args) {
new P005_GridLayout();
}
}
最后: 布局是一种灵活的东西。你可以一个布局里嵌套另外一个布局。
比如边界布局的窗口的中间,加入按表格布局的组件,表格布局里面是流式布局。
很多的复杂的界面,通过细分,都能拆分成常用布局的嵌套
求高手用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(“www.easyaq.com”, 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编程的时候,写的一个例子