java swing JTextField 设置为空时 获取的内容是?

jtf3 = new JTextField(3);
String date = this.jtf3.getText().trim();
当文本框中我没有输入任何东西,date获得的值是什么?

2个回答

好像是null吧。你试试呗

没有输入的话,getText()返回空字符串“”,建议查一下API

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java swing组件拖动和显示问题
两个问题(1)做出来的窗体组件运行后点击“添加”按钮,应该再窗体上生成一个JLabel标签,点击后能够生成但显示不出来,改变窗体大小才能显示出来。(2)生成的JLabel能够改变大小和拖动,先拖动到另一个位置,改变窗体大小后,又回到原来的位置去了。求大神知道下。 看了以前的帖子@raistlic说是重绘问题,但是按帖子方法把setVisible放在添加控件后面不起作用。使用getContentPane()invalidate.()总是提示找不到符号。 ``` import java.awt.*; import java.awt.event.*; import static java.awt.BorderLayout.*; import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.SwingUtilities; import javax.swing.plaf.ButtonUI; class Win extends Frame { JButton jb1,jb2,jb3,jb4,jb5;//编辑、添加、修改、删除、调度 JPanel jp_button;//放置按钮的面板 JPanel jp_xianlu;//放置线路图的面板 JTextField jt; //添加 时用的text String str1; Win() { super("我的面板"); setExtendedState( Frame.MAXIMIZED_BOTH ); setLayout(new BorderLayout(30,5)); jp_button =new JPanel(); jp_button.setVisible(true); jp_button.setOpaque(true); jp_button.setBackground(Color.BLUE); add(jp_button,SOUTH); jp_xianlu =new JPanel(); jp_xianlu.setVisible(true); jp_xianlu.setOpaque(true); jp_xianlu.setBackground(Color.GREEN); add(jp_xianlu,CENTER); JTextField jt= new JTextField("我的标签"); jp_button.add(jt); jt.setOpaque(true); jt.setBackground(Color.RED); jb1 = new JButton("编辑"); jb2 = new JButton("添加"); jb3 = new JButton("修改"); jb4 = new JButton("删除"); jb5 = new JButton("调度"); jp_button.add(jb1); jp_button.add(jb2); jp_button.add(jb3); jp_button.add(jb4); jp_button.add(jb5); //Frame上添加windows监听,使之关闭按钮可用 addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); //点击“添加”按钮时在jp_xianlu面板上生成JLabel jb2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { str1 = jt.getText(); setLab(str1,100,100); } }); } public void setLab(String str,int a,int b){ try { // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); if(str==null) { System.out.println("输入不能不能为空"); } else { JLabel lab= new JLabel(str); //输入标签显示内容 lab.setOpaque(true); //label 是透明的 lab.setBackground(Color.RED); //设置背景色 lab.setBounds(a,b,80,80); //给生成的JLabel添加监听,使之可以自由改变大小并可以拖动 DnDAdapter dda =new DnDAdapter(); lab.addMouseMotionListener(dda); jp_xianlu.add(lab); } } catch(Exception e){ System.out.println(e.getMessage()); } } public static void main(String args[]) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { Win win=new Win(); //win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); win.setLocationRelativeTo(null); win.setVisible(true); } }); } } //自定义的可以自由实现组件拖动的监听器(摘自网络,还未完全理解) class DnDAdapter extends MouseAdapter { //每个组件的信息,在进入组件时获得。 private JComponent jcom; private Point jcomOriginPoint;//组件在容器内的坐标 private int jcomWidth,jcomHeight; //与定位、缩放相关信息 private int a=10;//鼠标检测边沿大小 private Point pointMoved;//移动时,容器内坐标 private CurType curCuror;// private enum CurType {LeftTop,LeftBottom,RightTop,RightBottom,Top,Bottom,Left,Right,Center} //光标区域判断 private CurType getCurType(MouseEvent e) { Point p=e.getPoint();//getPoint返回组件内的坐标 //左上角 0<x<a,0<y<a if((p.x>=0 && p.x<=a)&&(p.y>=0&&p.y<=a)) return CurType.LeftTop; //右下角 w-a<x<w h-a<y<h else if((p.x>=jcomWidth-a&&p.x<=jcomWidth)&&(p.y>=jcomHeight-a&&p.y<=jcomHeight)) return CurType.RightBottom; //右上角w-a<x<w,0<y<a else if((p.x>=jcomWidth-a&&p.x<=jcomWidth)&&(p.y>=0&&p.y<=a)) return CurType.RightTop; //左下角0<x<a,h-a<y<h else if((p.x>=0&&p.x<=a)&&(p.y>=jcomHeight-a&&p.y<=jcomHeight)) return CurType.LeftBottom; //垂直:w-a<x<w && a<y<h-a 右边 else if( p.x>=jcomWidth-a && p.x<=jcomWidth && p.y>=a && p.y<=jcomHeight-a) return CurType.Right; //垂直:0<x<a,a<y<h-a 左边 else if(p.x>=0 && p.x<=a && p.y>=a && p.y<=jcomHeight-a) return CurType.Left; //水平 a<x<w-a && 0<y<a 上边 else if((p.x>=a&&p.x<=jcomWidth-a) &&p.y>=0&&p.y<=a) return CurType.Top; //水平 a<x<w-a &&h-a<y<h 下边 else if((p.x>=a&&p.x<=jcomWidth-a) &&p.y>=jcomHeight-a&&p.y<=jcomHeight) return CurType.Bottom; //中间 else //jcom.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));//没有这句鼠标会一直保持形状 return CurType.Center; } private void setCurType(MouseEvent e) { switch(getCurType(e)) { case LeftTop: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR)); curCuror=CurType.LeftTop; break; case LeftBottom: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR)); curCuror=CurType.LeftBottom; break; case RightTop: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR)); curCuror=CurType.RightTop; break; case RightBottom: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR)); curCuror=CurType.RightBottom; break; case Top: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR)); curCuror=CurType.Top; break; case Bottom: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR)); curCuror=CurType.Bottom; break; case Left: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR)); curCuror=CurType.Left; break; case Right: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR)); curCuror=CurType.Right; break; default: jcom.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); curCuror=CurType.Center; break; } } private void setPosition(MouseEvent e) { Point pointNow=e.getLocationOnScreen(); int incX=pointNow.x-pointMoved.x;//增量是相对于最后一次移动的点。 int incY=pointNow.y-pointMoved.y; /// //System.out.print("PointNow:("+pointNow.x+","+pointNow.y+")\t"); //System.out.println("PointMoved:("+pointMoved.x+","+pointMoved.y+")\t"); Rectangle rect=new Rectangle(); switch(curCuror) { case LeftTop: rect.x=jcomOriginPoint.x+incX; rect.y=jcomOriginPoint.y+incY; rect.width=jcomWidth-incX; rect.height=jcomHeight-incY; break; case LeftBottom: rect.x=jcomOriginPoint.x+incX; rect.y=jcomOriginPoint.y; rect.width=jcomWidth-incX; rect.height=jcomHeight+incY; break; case RightTop: rect.x=jcomOriginPoint.x; rect.y=jcomOriginPoint.y+incY; rect.width=jcomWidth+incX; rect.height=jcomHeight-incY; break; case RightBottom: rect.x=jcomOriginPoint.x; rect.y=jcomOriginPoint.y; rect.width=jcomWidth+incX; rect.height=jcomHeight+incY; break; //////////////////////////////////////////// case Top: rect.x=jcomOriginPoint.x; rect.y=jcomOriginPoint.y+incY; rect.width=jcomWidth; rect.height=jcomHeight-incY; break; case Bottom: rect.x=jcomOriginPoint.x; rect.y=jcomOriginPoint.y; rect.width=jcomWidth; rect.height=jcomHeight+incY; break; case Left: rect.x=jcomOriginPoint.x+incX; rect.y=jcomOriginPoint.y; rect.width=jcomWidth-incX; rect.height=jcomHeight; break; case Right://右缩放 rect.x=jcomOriginPoint.x; rect.y=jcomOriginPoint.y; rect.width=jcomWidth+incX; rect.height=jcom.getHeight(); break; /////////////////////////////////////////////// case Center://移动 rect.x=jcomOriginPoint.x+incX; rect.y=jcomOriginPoint.y+incY; rect.width=jcom.getWidth();//防止出现恢复原大小问题。 rect.height=jcom.getHeight(); break; default: break; } jcom.setBounds(rect); } @Override public void mouseMoved(MouseEvent e) { pointMoved=e.getLocationOnScreen(); jcom=(JComponent)e.getSource();//防止抖动关键在这一点 jcomOriginPoint=jcom.getLocation();//获取组件在父窗口的位置 jcomWidth=jcom.getWidth(); jcomHeight=jcom.getHeight(); /////////////////////////////////////////// setCurType(e); //super.mouseMoved(e); } public void mouseDragged(MouseEvent e) { //相对于移动最后一点的增量 setPosition(e); super.mouseDragged(e); } } ```
JAVA中append不显示输出的内容是怎么回事
package hh; import javafx.scene.chart.PieChart.Data; import javax.swing.*; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Label; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.URLEncoder; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import com.sun.corba.se.spi.orbutil.fsm.Guard.Result; import ee.WeatherInf; import ee.util; import java.awt.*; //窗体颜色 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.URLEncoder; import java.util.*; public class window extends JFrame implements ActionListener{ JButton butok; JPanel panel1; TextField text1; JTextArea prince=new JTextArea(15, 30); public window() { setTitle("无敌天气预报"); //窗体标题 setLocation(250,250); //窗体位置 setSize(500,300); //窗体大小 panel1 =new JPanel(); //添加一个panel对象,方便布局 butok= new JButton("查询"); butok.addActionListener(this); text1=new TextField("输入要查询的城市:",20); panel1.add(text1); panel1.add(butok); add(panel1,BorderLayout.NORTH); add(new JScrollPane(prince),BorderLayout.CENTER); } public void actionPerformed(ActionEvent arg0) { // TODO 自动生成的方法存根 String str=text1.getText(); //将传入城市名的getNet接口类作为参数初始化线程类 getNet city=new getNet(str); Thread thread=new Thread(city); //线程开始 thread.start();// try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } prince.append(city.result); } public static void main(String[] args) { new window(); } } class getNet implements Runnable{ WeatherInf wInf; String city; String result; public getNet(String city){ this.city=city; } public void run() { try { //url串 String url="http://api.map.baidu.com/telematics/v3/weather?location="+URLEncoder.encode(city,"utf-8")+"&output=json&ak=YknGmxIoPugT7YrNrG955YLS"; //调用工具类的方法获取json数据 String content=util.getJsonString(url); //调用工具类的方法解释json数据 wInf=util.resolveWeatherInf(content); //将解释好的日期 城市 天气 温度 PM2.5 穿衣指数选出放入result String result=wInf.getWeatherdate() +" "+wInf.getLocation()+" "+wInf.getWeatherInfs()[0].getWeather()+" "+wInf.getWeatherInfs()[0].getTempertureOfDay() +" PM2.5指数 "+wInf.getPmTwoPointFive() +" 穿衣指数:"+wInf.getDressAdvise(); System.out.print(result); System.out.println(); } catch (Exception e) { System.out.println("查不到此地区天气!"); } } public void actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根 } public static void main(String agrs[]) { window win= new window(); //初始化窗体 win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置窗体关闭按钮 win.setVisible(true); //使窗体可见 } } 我编写了一个,点击按钮就能查询当地天气的程序,然后我单击按钮之后,天气的详情并不显示在append上的文本框,怎么办?
java 动态页面
现在也写一个动态的界面,上面有不确定个数的 jTextField ,其个数是根据参数的个数确定的,生成界面的代码如下 [code="java"] for (int j = 0; j<n; j++){ JLabel jLabel = new JLabel(); getContentPane().add(jLabel); jLabel.setText(identifier.get(j) + "(" + title.get(j)+ ")"); jLabel.setBounds(26, 79 + j*48, 492, 15); final JTextField jTextField = new JTextField(); getContentPane().add(jTextField); jTextField.setText(""); [/code] 界面的截图如下 [img]http://dl.iteye.com/upload/attachment/0068/4023/ad70f7a5-84e7-391e-89c7-a5dda9aae3e1.jpg[/img] [img]http://dl.iteye.com/upload/attachment/0068/4025/5b236e57-4d2d-345b-acbf-63319b0b9ba2.jpg[/img] 现在的问题是我不确定如何去获取这些 jTextField 输入的内容,一直没有找到合适的方法。
怎么解决java网络通信编程ip和port是从文本框中获取的?
为什么我把connect()方法加入button1的事件中就会黑屏 代码如下 客户端: package sunxu.util; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class ClientSocketFrame extends JFrame { /** * */ private static final long serialVersionUID = 1L; private PrintWriter writer; // 声明PrintWriter类对象 private BufferedReader reader; // 声明BufferedReader对象 private Socket socket; // 声明Socket对象 private JTextArea ta_info; // 创建JtextArea对象 JButton button1 = new JButton("Connect"); //private JTextField tf_send; // 创建JtextField对象 private InetAddress sendIp; private int sendPort; private void connect() { // 连接套接字方法 ta_info.append("Connect to server…\n"); // 文本域中信息信息 try { // 捕捉异常 socket = new Socket(sendIp,sendPort); // 实例化Socket对象 while (true) { writer = new PrintWriter(socket.getOutputStream(), true); reader = new BufferedReader(new InputStreamReader(socket .getInputStream())); // 实例化BufferedReader对象 ta_info.append("Client connected…\n"); // 文本域中提示信息 getServerInfo(); } } catch (Exception e) { e.printStackTrace(); // 输出异常信息 } } public static void main(String[] args) { // 主方法 ClientSocketFrame clien = new ClientSocketFrame(); // 创建本例对象 clien.setVisible(true); // 将窗体显示 //clien.connect(); // 调用连接方法 } private void getServerInfo() { try { while (true) { if (reader != null) { String line = reader.readLine();// 读取服务器发送的信息 if (line != null) ta_info.append("接收到服务器发送的信息:" + line + "\n"); // 显示服务器端发送的信息 } } } catch (Exception e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close();// 关闭流 } if (socket != null) { socket.close(); // 关闭套接字 } } catch (IOException e) { e.printStackTrace(); } } } /** * Create the frame */ public ClientSocketFrame() { super(); setTitle("客户端"); setBounds(100, 100, 361, 257); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JPanel panel = new JPanel(); getContentPane().add(panel, BorderLayout.NORTH); panel.setBorder(BorderFactory.createTitledBorder("客户机设置:")); final JLabel label = new JLabel(); label.setText("Server IP:"); panel.add(label); JTextField tf_sen= new JTextField(); tf_sen.setPreferredSize(new Dimension(50, 25)); panel.add(tf_sen); final JLabel label1 = new JLabel(); label1.setText("Server Port:"); panel.add(label1); JTextField tf_Port = new JTextField(); tf_Port.setPreferredSize(new Dimension(50, 25)); panel.add(tf_Port); final JButton button1 = new JButton("Connect"); button1.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { try { sendIp=InetAddress.getByName(tf_sen.getText()); } catch (UnknownHostException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } sendPort=Integer.parseInt(tf_Port.getText()); ta_info.append("Connect to server…\n"); // 文本域中信息信息 ta_info.append(sendIp+"\n"); // 文本域中信息信息 ta_info.append(sendPort+"\n"); // 文本域中信息信息 connect(); } }); panel.add(button1); final JPanel panel_1 = new JPanel(); getContentPane().add(panel_1, BorderLayout.SOUTH); final JLabel label_1 = new JLabel(); label_1.setText("Say:"); panel_1.add(label_1); JTextField tf_send = new JTextField(); tf_send.setPreferredSize(new Dimension(220, 25)); panel_1.add(tf_send); final JButton button = new JButton(); button.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { writer.println(tf_send.getText()); // 将文本框中信息写入流 ta_info.append("客户端发送的信息:" + tf_send.getText() + "\n"); // 将文本框中信息显示在文本域中 tf_send.setText(""); // 将文本框清空 } }); button.setText("Say"); panel_1.add(button); final JScrollPane scrollPane = new JScrollPane(); getContentPane().add(scrollPane, BorderLayout.CENTER); ta_info = new JTextArea(); scrollPane.setViewportView(ta_info); // } } 服务器: package sunxu.util; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.*; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class ServerSocketFrame extends JFrame { //private JTextField tf_send; private JTextArea ta_info; private PrintWriter writer; // 声明PrintWriter类对象 private BufferedReader reader; // 声明BufferedReader对象 private ServerSocket server; // 声明ServerSocket对象 private Socket socket; // 声明Socket对象socket private int sendPort; public void getServer() { try { server = new ServerSocket(sendPort); // 实例化Socket对象 ta_info.append("服务器套接字已经创建成功\n"); // 输出信息 while (true) { // 如果套接字是连接状态 ta_info.append("等待客户机的连接......\n"); // 输出信息 socket = server.accept(); // 实例化Socket对象 reader = new BufferedReader(new InputStreamReader(socket .getInputStream())); // 实例化BufferedReader对象 writer = new PrintWriter(socket.getOutputStream(), true); getClientInfo(); // 调用getClientInfo()方法 } } catch (Exception e) { e.printStackTrace(); // 输出异常信息 } } private void getClientInfo() { try { while (true) { String line = reader.readLine();// 读取客户端发送的信息 if (line != null) ta_info.append("接收到客户机发送的信息:" + line + "\n"); // 显示客户端发送的信息 } } catch (Exception e) { ta_info.append("客户端已退出。\n"); // 输出异常信息 } finally { try { if (reader != null) { reader.close();// 关闭流 } if (socket != null) { socket.close(); // 关闭套接字 } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { // 主方法 ServerSocketFrame frame = new ServerSocketFrame(); // 创建本类对象 frame.setVisible(true); //frame.getServer(); // 调用方法 } public ServerSocketFrame() { super(); setTitle("服务器端程序"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 379, 260); final JScrollPane scrollPane = new JScrollPane(); getContentPane().add(scrollPane, BorderLayout.CENTER); ta_info = new JTextArea(); scrollPane.setViewportView(ta_info); final JPanel panel = new JPanel(); getContentPane().add(panel, BorderLayout.SOUTH); final JLabel label = new JLabel(); label.setText("Say:"); panel.add(label); JTextField tf_send = new JTextField(); tf_send.setPreferredSize(new Dimension(150, 25)); panel.add(tf_send); final JButton button = new JButton(); button.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { writer.println(tf_send.getText()); // 将文本框中信息写入流 ta_info.append("服务器发送的信息是:" + tf_send.getText() + "\n"); // 将文本框中信息显示在文本域中 tf_send.setText(""); // 将文本框清空 } }); button.setText("Say:"); panel.add(button); final JPanel panel_1 = new JPanel(); getContentPane().add(panel_1, BorderLayout.NORTH); panel_1.setBorder(BorderFactory.createTitledBorder("服务器设置:")); final JLabel label_1 = new JLabel(); label_1.setText("Port:"); JTextField tf_sen= new JTextField(); tf_sen.setPreferredSize(new Dimension(220, 25)); panel_1.add(label_1); panel_1.add(tf_sen); final JButton button1 = new JButton("Strat"); button1.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { sendPort=Integer.parseInt(tf_sen.getText()); getServer(); } }); panel_1.add(button1); } }
JAVA通讯录 TXT文档分页问题
我在做一个JAVA通讯录,想请问一下如何把这个TXT文档 超过20行分页显示,请前辈们多多指教,谢谢 方便的话请帮我写一下代码看看行吗 package MyAddBook; import java.awt.Choice;//选择 import java.awt.Container;//容器 import java.awt.Frame; import java.awt.GridLayout;//间距 import java.awt.Toolkit;//居中 import java.awt.event.ActionEvent;//事件 import java.awt.event.ActionListener;//监听 import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter;//文本输出流打印对象的格式化 import java.text.Collator;//区分语言 import java.util.Arrays; import java.util.Comparator;//排序 import java.util.Scanner; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenuBar; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane;//消息提示框 import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class MyAddBook { public static JFrame frame; public MyAddBook() { frame=new JFrame("通讯录");//面板标题 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//单击关闭按钮关闭窗口 frame.setVisible(true);//窗口可见 /* * 在一个窗口中,我们经常需要给窗口添加菜单条。在 Java * 中这一部分是由三个类实现的,它们是JMenuBar、JMenu和JMenuItem, 分别对应菜单条、菜单和菜单项。 * 同时,可以给JMenuItem注册侦听器,但不能对JMenuBar,JMenu注册侦听器. * * 一、菜单条(JMenuBar) * JMenuBar 的构造方法是 JMenuBar(),相当简单。在构造之后,还要将它设置成窗口的菜单条,这里要用 setJMenuBar * 方法: JMenuBar TestJMenuBar=new JMenuBar(); * TestFrame.setJMenuBar(TestJMenuBar); 需要说明的是,JMenuBar 类根据 JMenu * 添加的顺序从左到右显示,并建立整数索引。 * * 二、菜单(JMenu) 在添加完菜单条后,并不会显示任何菜单,所以还需要在菜单条中添加菜单。菜单 * JMenu 类的构造方法有4种: JMenu() 构造一个空菜单。 JMenu(Action a) * 构造一个菜单,菜单属性由相应的动作来提供。 JMenu(String s) 用给定的标志构造一个菜单。 JMenu(String * s,Boolean b) 用给定的标志构造一个菜单。如果布尔值为false,那么当释放鼠标按钮后,菜单项会消失;如果布尔值为true, * 那么当释放鼠标按钮后,菜单项仍将显示。这时的菜单称为 tearOff 菜单。 在构造完后,使用 JMenuBar 类的 add * 方法添加到菜单条中。 * * 三、菜单项(JmenuItem) 接下来的工作是往菜单中添加内容。 * 在菜单中可以添加不同的内容,可以是菜单项(JMenuItem),可以是一个子菜单,也可以是分隔符。 在构造完后,使用 JMenu 类的 * add 方法添加到菜单中。 子菜单的添加是直接将一个子菜单添加到母菜单中,而分隔符的添加只需要将分隔符作为菜单项添加到菜单中。 */ JMenuBar bar=new JMenuBar(); JMenu edit=new JMenu("编辑"); JMenuItem edit1=new JMenuItem("录入"); JMenuItem edit2=new JMenuItem("查询"); JMenuItem edit3=new JMenuItem("删除"); JMenuItem edit4=new JMenuItem("修改"); JMenuItem edit5=new JMenuItem("排序"); edit1.addActionListener(new Type());//监听 JMenu show=new JMenu("按性别显示"); JMenuItem show1=new JMenuItem("男"); JMenuItem show2=new JMenuItem("女"); Container c=frame.getContentPane(); JPanel p=new JPanel(); c.add(p); p.add(bar); bar.add(edit); bar.add(show); edit.add(edit1); edit.add(edit2); edit.add(edit3); edit.add(edit4); edit.add(edit5); show.add(show1); show.add(show2); // 获取你的屏幕的宽和高 int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.getDefaultToolkit().getScreenSize().height; // 然后设置你编写的窗口的初始位置,也就是在中间, frame.setLocation(width / 2 - 200, height / 2 - 150); frame.setSize(500, 300); /* * 1. JFrame是javax.swing.JFrame的类,Frame是Java.awt.Frame的类 * * 2. 关闭窗口的方式不同: * 2.1 JFrame的关闭方式:传递参数使得关闭按钮有效 * Frame的关闭方式:加监听使得关闭按钮有效 */ edit2.addActionListener(new ActionListener() // 监听查询 { public void actionPerformed(ActionEvent e) { new Operation("查询", 2).dialog.setVisible(true); } }); edit3.addActionListener(new ActionListener() // 监听删除 { public void actionPerformed(ActionEvent e) { //获取你的屏幕的宽和高 int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.getDefaultToolkit().getScreenSize().height; //然后设置你编写的窗口的初始位置,也就是在中间, frame.setLocation(width / 2 - 200, height / 2 - 150); new Operation("删除", 3).dialog.setVisible(true); } }); edit4.addActionListener(new ActionListener() // 监听修改 { public void actionPerformed(ActionEvent e) { new Operation("修改", 4).dialog.setVisible(true); } }); // 输出类 edit5.addActionListener(new ActionListener() // 监听排序 { public void actionPerformed(ActionEvent e) { new Print("按姓名排序后", 2);//调用 排序 函数 } }); show1.addActionListener(new ActionListener() // 监听男 { public void actionPerformed(ActionEvent e) { new Print("男", 1);//调用 匹配 显示 } }); show2.addActionListener(new ActionListener() // 监听女 { public void actionPerformed(ActionEvent e) { new Print("女", 1);//调用 匹配 显示 } }); } public static void main(String[] args) { new MyAddBook(); } public String[] getSortOfChinese(String[] a) { // Collator 类是用来执行区分语言环境,这里使用CHINA Comparator cmp = Collator.getInstance(java.util.Locale.CHINA); // JDKz自带对数组进行排序。 Arrays.sort(a, cmp); return a; } } class Operation{ private Frame frame; /* * public JDialog(Dialog owner, String title, boolean modal) * 创建一个具有指定标题、模式和指定所有者 Dialog 的对话框。 此构造方法将该组件的语言环境属性设置为 * JComponent.getDefaultLocale 所返回的值。 * * 参数: owner - 显示该对话框的所有者 Dialog; 如果此对话框没有所有者,则为 null * title -该对话框的标题栏中所显示的 String * modal - 指定对话框在显示时是否阻塞用户向其他顶层窗口输入。如果为true,则模式类型属性被设置为 DEFAULT_MODALITY_TYPE; * 否则对话框是无模式的。 * 抛出: * HeadlessException - 如果 GraphicsEnvironment.isHeadless() 返回 true。 */ JDialog dialog = new JDialog(frame, "查询对话框", true); public Operation(String str, int n) { dialog.setSize(450, 300); //获取你的屏幕的宽和高 int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.getDefaultToolkit().getScreenSize().height; //然后设置你编写的窗口的初始位置,也就是在中间, dialog.setLocation(width / 2 - 200, height / 2 - 150); Container c = dialog.getContentPane(); /*GridLayout(int rows, int cols, int hgap, int vgap) : 创建具有指定行数、列数以及组件水平、纵向一定间距的网格布局。*/ dialog.setLayout(new GridLayout(2, 1, 5, 5)); JLabel LOperation = new JLabel("请输入要" + str + "人员的名字"); final JTextField Tname = new JTextField(10);//单行文本输入框 JButton sure = new JButton("确定"); JButton cancel = new JButton("取消"); JPanel pane1 = new JPanel(); JPanel pane2 = new JPanel(); c.add(pane1); c.add(pane2); pane1.add(LOperation); pane1.add(Tname); pane2.add(sure); pane2.add(cancel); dialog.setDefaultCloseOperation(dialog.DISPOSE_ON_CLOSE); if (n == 2) { sure.addActionListener(new ActionListener() // 查询 { public void actionPerformed(ActionEvent e) { try { FileReader file = new FileReader("D:\\AddressBook.txt"); Scanner find = new Scanner(file); /* * 这里while括号里面的find.hasNext()方法用于判断find对象中有没有下一条数据 * 返回 bool 值 , 有则返回true 无 则返回false * 下面的find.next()是获取find对象中的值 然后赋值给 str 然后输出这个方法 * 其实就是循环输出it 对象中所有的值 */ while (find.hasNext()) { if (find.next().equals(Tname.getText())) { dialog.dispose();//关闭窗体,并释放一部分资源。 Type fd = new Type(); fd.frame = new JFrame("查询结果如下"); fd.Tname.setText(Tname.getText()); fd.Csex.select(find.next()); fd.Tunit.setText(find.next()); fd.Thomephone.setText(find.next()); fd.Temail.setText(find.next()); fd.Ttelephone.setText(find.next()); fd.Type(); } } file.close(); find.close(); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block // e1.printStackTrace(); System.out.print("未找到文件"); } catch (IOException e2) { // TODO Auto-generated catch block // e2.printStackTrace(); System.out.print("未找到该人员"); } } }); } if (n == 3) { sure.addActionListener(new ActionListener() // 删除 { public void actionPerformed(ActionEvent e) { try { File file = new File("D:\\AddressBook.txt");//创建文件 Scanner find = new Scanner(file);//输入 FileWriter file1 = new FileWriter("D:\\AddressBook1.txt", true); PrintWriter write = new PrintWriter(file1); while (find.hasNext()) {//取下一个元素 String s = find.next(); if (!(s.equals(Tname.getText()))) { write.print(s + "\t"); write.print(find.next() + "\t"); write.print(find.next() + "\t\t"); write.print(find.next() + "\t\t"); write.print(find.next() + "\t\t"); write.println(find.next()); } else { find.next(); find.next(); find.next(); find.next(); find.next(); } } // file.close(); find.close(); file.delete(); write.close(); file1.close(); File file2 = new File("D:\\AddressBook1.txt"); file2.renameTo(new File("D:\\AddressBook.txt")); JOptionPane.showMessageDialog(null, "删除成功", "删 除 结 果", JOptionPane.INFORMATION_MESSAGE); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block // e1.printStackTrace(); JOptionPane.showMessageDialog(null, "未找到文件"); } catch (IOException e2) { // TODO Auto-generated catch block // e2.printStackTrace(); System.out.print("未找到该人员"); } } }); } if (n == 4) { sure.addActionListener(new ActionListener() // 修改 { public void actionPerformed(ActionEvent e) { try { File file = new File("D:\\AddressBook.txt"); Scanner find = new Scanner(file); FileWriter file1 = new FileWriter("D:\\AddressBook1.txt", true); PrintWriter write = new PrintWriter(file1); while (find.hasNext()) { String s = find.next(); if (!(s.equals(Tname.getText()))) { write.print(s + "\t"); write.print(find.next() + "\t"); write.print(find.next() + "\t\t"); write.print(find.next() + "\t\t"); write.print(find.next() + "\t\t"); write.println(find.next()); } else { dialog.dispose(); Type fd = new Type(); Type.y = 1; fd.frame = new JFrame("查询结果如下"); fd.Tname.setText(Tname.getText()); String s1 = find.next(); fd.Csex.select(s1); String s2 = find.next(); fd.Tunit.setText(s2); String s5 = find.next(); fd.Thomephone.setText(s5); String s6 = find.next(); fd.Temail.setText(s6); String s7 = find.next(); fd.Ttelephone.setText(s7); fd.Type(); if (Type.z == 1) { write.print(Tname.getText() + "\t"); write.print(s1 + "\t"); write.print(s2 + "\t\t"); write.print(s5 + "\t\t"); write.print(s6 + "\t\t"); write.println(s7); Type.z = 2; } } } // file.close(); find.close(); file.delete(); write.close(); file1.close(); File file2 = new File("D:\\AddressBook1.txt"); file2.renameTo(new File("D:\\AddressBook.txt")); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block // e1.printStackTrace(); System.out.print("未找到文件"); } catch (IOException e2) { // TODO Auto-generated catch block // e2.printStackTrace(); System.out.print("未找到该人员"); } } }); } cancel.addActionListener(new ActionListener() // 取消 { public void actionPerformed(ActionEvent e) { dialog.dispose();//关闭查询面板 } }); } } class Print{ public JTextArea area;// 多行文本输入框 public Print(String st, int n) { JFrame frame = new JFrame(st + "信息如下"); area = new JTextArea();// 多行文本输入框 frame.add(area); frame.setVisible(true); frame.setSize(1000, 500); frame.setLocation(350, 150);// 显示位置坐标 if (n == 2) try // 排序 { int i, j, k; String[] all; all = new String[1000]; BufferedReader read = new BufferedReader(new FileReader("D:\\AddressBook.txt")); area.append("姓 名" + "\t" + "性别" + "\t" + "单位" + "\t\t" + "住宅电话" + "\t\t" + "Email" + "\t\t\t" + "移动电话" + '\n'); int z = 1, count = 0; while (z == 1) { for (i = 0; i < 1000; i++) { String str = read.readLine(); if (str != null) { all[i] = str; count++; } else z = 0; } } String[] bll; bll = new String[count]; for (i = 0; i < count; i++) bll[i] = all[i]; getSortOfChinese(bll);// 调用排序函数 for (i = 0; i < count; i++) area.append(bll[i] + '\n');// 在指定元素的结尾追加内容 read.close(); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e2) { e2.printStackTrace(); } if (n == 1) try // 指定类人员 { FileReader file = new FileReader("D:\\AddressBook.txt"); Scanner find = new Scanner(file); area.append("姓 名" + "\t" + "性别" + "\t" + "单位" + "\t\t" + "住宅电话" + "\t\t" + "Email" + "\t\t\t" + "移动电话" + '\n'); while (find.hasNext()) { String str1 = find.next(); String str2 = find.next(); if (str2.equals(st)) { area.append(str1 + "\t"); area.append(str2 + "\t"); area.append(find.next() + "\t\t"); area.append(find.next() + "\t\t"); area.append(find.next() + "\t\t"); area.append(find.next() + '\n'); } else { find.next(); find.next(); find.next(); find.next(); } } file.close(); find.close(); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e2) { e2.printStackTrace(); } } private void getSortOfChinese(String[] bll) { // TODO Auto-generated method stub } } class Type implements ActionListener { public static int z = 2; public static int y = 0; public JLabel Lname, Lsex, Lunit, Lhomephone, Lemail, Ltelephone, Lnote;//添加标签 public JTextField Tname = new JTextField(15), Thomephone = new JTextField(25), Temail = new JTextField(25),Ttelephone = new JTextField(25), Tunit = new JTextField(25); public Choice Csex = new Choice();//创建文本框 public JButton sure, cancel;//添加“确定”“取消”按钮 public JFrame frame = new JFrame("录入联系人信息");//面板标题 public Type() { Csex.addItem("男");//给列表框或组合框等具有列表的对象添加项目 Csex.addItem("女"); } public void Type() { Container c = frame.getContentPane();//创建容器 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//单击窗口的关闭按钮时程序执行的操作 frame.setSize(800, 400);//窗口大小 frame.setLayout(new GridLayout(7, 2, 7, 7));//设置用户界面上的屏幕组件的格式布局 frame.setVisible(true);//设置面板可见 //获取你的屏幕的宽和高 int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.getDefaultToolkit().getScreenSize().height; //然后设置你编写的窗口的初始位置,也就是在中间, frame.setLocation(width / 2 - 200, height / 2 - 150); Lname = new JLabel("姓名");//标签 Lsex = new JLabel("性别"); Lunit = new JLabel("单位"); Lhomephone = new JLabel("住宅电话"); Lemail = new JLabel("Email"); Ltelephone = new JLabel("移动电话"); sure = new JButton("确定"); cancel = new JButton("取消"); JPanel pane1 = new JPanel();//添加面板 JPanel pane2 = new JPanel(); JPanel pane3 = new JPanel(); JPanel pane5 = new JPanel(); c.add(pane1);//将面板添加到容器中 c.add(pane2); c.add(pane3); c.add(pane5); pane1.add(Lname);//将标签添加到面板 pane1.add(Tname); pane1.add(Lsex); pane1.add(Csex); pane2.add(Lunit); pane2.add(Tunit); pane2.add(Lhomephone); pane2.add(Thomephone); pane3.add(Lemail); pane3.add(Temail); pane3.add(Ltelephone); pane3.add(Ttelephone); pane5.add(sure); pane5.add(cancel); sure.addActionListener(new ActionListener() // 设置监听器 { public void actionPerformed(ActionEvent e) // 用匿名内部类实现监听器 { if (Tname.getText().equals(""))//输入的姓名是否为空 /* * 显示一个错误对话框,该对话框显示的 message 为 'alert': * JOptionPane.showMessageDialog(null, "alert", * "alert", JOptionPane.ERROR_MESSAGE); */ JOptionPane.showMessageDialog(null, "录入失败姓名必须填写", "录入结果", JOptionPane.INFORMATION_MESSAGE); else { try { FileWriter AddressBook = new FileWriter("D:\\AddressBook.txt", true);//写入文件 PrintWriter add = new PrintWriter(AddressBook); String s1, s2, s3,s4; if (Tunit.getText().equals(""))//未输入数据 s1 = "无"; else s1 = Tunit.getText(); if (Thomephone.getText().equals("")) s2 = "无"; else s2 = Thomephone.getText(); if (Temail.getText().equals("")) s3 = "无"; else s3 = Temail.getText(); if (Ttelephone.getText().equals("")) s4 = "无"; else s4 = Ttelephone.getText(); add.println(Tname.getText()+ "\t" + Csex.getSelectedItem() + "\t" + s1 + "\t\t" + s2 + "\t\t" + s3 + "\t\t" + s4); add.close(); AddressBook.close(); z = 1; } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } if (y == 0) { JOptionPane.showMessageDialog(null, "录入成功", "录入结果", JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(null, "修改成功", "修改结果", JOptionPane.INFORMATION_MESSAGE); } Tname.setText(""); //删除时传入空白串 Tunit.setText(""); Thomephone.setText(""); Temail.setText(""); Ttelephone.setText(""); } } }); cancel.addActionListener(new ActionListener() // 设置监听器 { public void actionPerformed(ActionEvent e) // 用匿名内部类实现监听器 { frame.dispose();//关闭面板 z = 0; } }); } public void actionPerformed(ActionEvent e) { new Type().Type(); } }
Java 密码框明文查看显示
想制作一个密码框 正常回显为* 点击显示密码 后显示为明文 就跟各网站上登录的密码框一样 我发现Jpassword 是没有这样的方法的,有一个setEchoChar 可以改变回显字符 然后我就想 可以使用基本的输入框, 获取字符后 在框里显示 * 实则记录下字符是什么,存进StringBuilder里 我试了一下加上 过滤器, 的确可以实现每输入一个字符 就返回 * 到输入框上 JFormattedTextField 不过有一个问题就是 如何才让 用户输错字符 删去一个字符以后 对应后台的StringBuilder 也删去一个字符 (即如何监控是否删去了输入的密码, 如果是清空还好判断,但有可能是删去任意一个,所以,思考半天觉得此方法不适合) 后来又想着 有空那个一个SwingWorker 对JtextField 监控,发现依旧是无法解决 此问题 希望有经验的各位指点一下,如何实现 显示密码框明文并查看输入的密码
Java 自制的计算器菜单键无法复制
代码如下: import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JTextField; /** * 一个计算器,与Windows附件自带计算器的标准版功能、界面相仿。 但还不支持键盘操作。 */ public class Calculator extends JFrame implements ActionListener { /** 计算器上的键的显示名字 */ private final String[] KEYS = { "7", "8", "9", "/", "4", "5", "6", "*" , "1", "2", "3","-", "0","+/-",".","+", "1/x", "%", "sqrt", "=" }; /** 计算器上的功能键的显示名字 */ private final String[] COMMAND = { "Backspace", "C" }; /** 计算器上键的按钮 */ private JButton keys[] = new JButton[KEYS.length]; /** 计算器上的功能键的按钮 */ private JButton commands[] = new JButton[COMMAND.length]; /** 计算结果文本框 */ private JTextField resultText = new JTextField("0"); // private JMenuBar mb=new JMenuBar(); //编辑 private JMenu mEdit = new JMenu("编辑(E)"); //复制黏贴 private JMenuItem mCopy = new JMenuItem("复制(C)"); private JMenuItem mPaste = new JMenuItem("黏贴(V)"); //剪切板 private StringBuffer copyBoard=new StringBuffer(20); // 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字 private boolean firstDigit = true; // 计算的中间结果。 private double resultNum = 0.0; // 当前运算的运算符 private String operator = "="; // 操作是否合法 private boolean operateValidFlag = true; /** * 构造函数 */ public Calculator() { super(); // 初始化计算器 init(); // 设置计算器的背景颜色 this.setBackground(Color.LIGHT_GRAY); this.setTitle("计算器"); // 在屏幕(500, 300)坐标处显示计算器 this.setLocation(500, 300); // 许修改计算器的大小 this.setResizable(true); // 使计算器中各组件大小合适 this.pack(); //添加菜单与目录 this.setJMenuBar(mb); mb.add(mEdit); mEdit.setMnemonic(KeyEvent.VK_E); mEdit.add(mCopy); mEdit.add(mPaste); } /** * 初始化计算器 */ private void init() { // 文本框中的内容采用右对齐方式 resultText.setHorizontalAlignment(JTextField.RIGHT); // 允许修改结果文本框 resultText.setEditable(true); // 设置文本框背景颜色为白色 resultText.setBackground(Color.white); // 初始化计算器上键的按钮,将键放在一个画板内 JPanel calckeysPanel = new JPanel(); // 用网格布局器,5行,4列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 calckeysPanel.setLayout(new GridLayout(5, 4, 0, 0)); for (int i = 0; i < KEYS.length; i++) { keys[i] = new JButton(KEYS[i]); calckeysPanel.add(keys[i]); keys[i].setForeground(Color.black); } // 初始化功能键,都用红色标示。将功能键放在一个画板内 JPanel commandsPanel = new JPanel(); // 用网格布局器,1行,3列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 commandsPanel.setLayout(new GridLayout(1, 3, 0, 0)); for (int i = 0; i < COMMAND.length; i++) { commands[i] = new JButton(COMMAND[i]); commandsPanel.add(commands[i]); } // 下面进行计算器的整体布局,将calckeys和command画板放在计算器的中部, // 将文本框放在北部,将calms画板放在计算器的西部。 // 新建一个大的画板,将上面建立的command和calckeys画板放在该画板内 JPanel panel1 = new JPanel(); // 画板采用边界布局管理器,画板里组件之间的水平和垂直方向上间隔都为3象素 panel1.setLayout(new BorderLayout(3, 3)); panel1.add("North", commandsPanel); panel1.add("Center", calckeysPanel); // 建立一个画板放文本框 JPanel top = new JPanel(); top.setLayout(new BorderLayout()); top.add("Center", resultText); // 整体布局 getContentPane().setLayout(new BorderLayout(3, 5)); getContentPane().add("North", top); getContentPane().add("Center", panel1); // 为各按钮添加事件侦听器 // 都使用同一个事件侦听器,即本对象。本类的声明中有implements ActionListener for (int i = 0; i < KEYS.length; i++) { keys[i].addActionListener(this); } for (int i = 0; i < COMMAND.length; i++) { commands[i].addActionListener(this); } } /** * 处理事件 */ public void actionPerformed(ActionEvent e) { // 获取事件源的标签 String label = e.getActionCommand(); if(label.equals("复制(C)")) { String temp = resultText.getText().trim(); copyBoard.replace(0, copyBoard.length(), temp); } else if(label.equals("黏贴(V)")) { resultText.setText(copyBoard.toString()); }else if (label.equals(COMMAND[0])) { // 用户按了"Backspace"键 handleBackspace(); }else if (label.equals(COMMAND[1])) { // 用户按了"C"键 handleC(); } else if ("0123456789.".indexOf(label) >= 0) { // 用户按了数字键或者小数点键 handleNumber(label); // handlezero(zero); } else { // 用户按了运算符键 handleOperator(label); } } /** * 处理Backspace键被按下的事件 */ private void handleBackspace() { String text = resultText.getText(); int i = text.length(); if (i > 0) { // 退格,将文本最后一个字符去掉 text = text.substring(0, i - 1); if (text.length() == 0) { // 如果文本没有了内容,则初始化计算器的各种值 resultText.setText("0"); firstDigit = true; operator = "="; } else { // 显示新的文本 resultText.setText(text); } } } /** * 处理数字键被按下的事件 * * @param key */ private void handleNumber(String key) { if (firstDigit) { // 输入的第一个数字 resultText.setText(key); } else if ((key.equals(".")) && (resultText.getText().indexOf(".") < 0)) { // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面 resultText.setText(resultText.getText() + "."); } else if (!key.equals(".")) { // 如果输入的不是小数点,则将数字附在结果文本框的后面 resultText.setText(resultText.getText() + key); } // 以后输入的肯定不是第一个数字了 firstDigit = false; } /** * 处理C键被按下的事件 */ private void handleC() { // 初始化计算器的各种值 resultText.setText("0"); firstDigit = true; operator = "="; } /** * 处理运算符键被按下的事件 * * @param key */ private void handleOperator(String key) { if (operator.equals("/")) { // 除法运算 // 如果当前结果文本框中的值等于0 if (getNumberFromText() == 0.0) { // 操作不合法 operateValidFlag = false; resultText.setText("除数不能为零"); } else { resultNum /= getNumberFromText(); } } else if (operator.equals("1/x")) { // 倒数运算 if (resultNum == 0.0) { // 操作不合法 operateValidFlag = false; resultText.setText("零没有倒数"); } else { resultNum = 1 / resultNum; } } else if (operator.equals("+")) { // 加法运算 resultNum += getNumberFromText(); } else if (operator.equals("-")) { // 减法运算 resultNum -= getNumberFromText(); } else if (operator.equals("*")) { // 乘法运算 resultNum *= getNumberFromText(); } else if (operator.equals("sqrt")) { // 平方根运算 resultNum = Math.sqrt(resultNum); } else if (operator.equals("%")) { // 百分号运算,除以100 resultNum = resultNum / 100; } else if (operator.equals("+/-")) { // 正数负数运算 resultNum = resultNum * (-1); } else if (operator.equals("=")) { // 赋值运算 resultNum = getNumberFromText(); } if (operateValidFlag) { // 双精度浮点数的运算 long t1; double t2; t1 = (long) resultNum; t2 = resultNum - t1; if (t2 == 0) { resultText.setText(String.valueOf(t1)); } else { resultText.setText(String.valueOf(resultNum)); } } // 运算符等于用户按的按钮 operator = key; firstDigit = true; operateValidFlag = true; } /** * 从结果文本框中获取数字 * * @return */ private double getNumberFromText() { double result = 0; try { result = Double.valueOf(resultText.getText()).doubleValue(); } catch (NumberFormatException e) { } return result; } public static void main(String args[]) { Calculator calculator1 = new Calculator(); calculator1.setVisible(true); calculator1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
java如何调用其他类中的变量
初学者,最近在学着用窗体做一个个人记账本。其中我已经写好了load部分和register部分,连上数据库也都可以实现。然后在编写Accountbook这个类的时候我要知道我现在是哪个用户在登录并查询这个用户的记录。但是这个用户变量在load类中。怎么调用? 以下为部分源码: load类: import java.awt.*; import javax.swing.*; import java.sql.*; import java.awt.event.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Login extends JFrame implements ActionListener { Connection conn; Statement stat; PreparedStatement ps; ResultSet rs; JButton load,reg; JLabel userJLabel,passJLabel; JPanel userJPanel, passJPanel,loadJPanel; JTextField userJtf; JPasswordField passJtf; String user,pwd; public static void main(String[] args) { Login login = new Login(); } public Login(){ super("登录"); this.setSize(400,300); this.setLocation(300,200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLayout(new GridLayout(4, 0)); userJLabel = new JLabel("用户名:"); userJtf = new JTextField(10); userJPanel = new JPanel(); userJPanel.add(userJLabel); userJPanel.add(userJtf); this.getContentPane().add(userJPanel); passJLabel = new JLabel("密 码:"); passJtf = new JPasswordField(10); passJPanel = new JPanel(); passJPanel.add(passJLabel); passJPanel.add(passJtf); this.getContentPane().add(passJPanel); loadJPanel = new JPanel(); load = new JButton("登录"); load.addActionListener(this); loadJPanel.add(load); reg = new JButton("注册"); reg.addActionListener(this); loadJPanel.add(reg); this.getContentPane().add(loadJPanel); this.setVisible(true); this.connection(); } public void connection(){ try { Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/db_user"; conn = DriverManager.getConnection(url,"root","root"); stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); } catch (Exception e) { JOptionPane.showMessageDialog(this,"连接数据库错误!","错误对话框",JOptionPane.ERROR_MESSAGE); } } public void actionPerformed(ActionEvent e) { if(e.getSource() == load){ try { ps=conn.prepareStatement("select * from tb_user where user=? and pwd=? "); ps.setString(1, userJtf.getText()); ps.setString(2, new String(passJtf.getPassword())); rs = ps.executeQuery(); if(rs.next()) { user = rs.getString(1); pwd = rs.getString(2); JOptionPane.showMessageDialog(null, "登录成功!!!", "提示消息", JOptionPane.WARNING_MESSAGE); System.out.println("成功获取到密码和用户名from数据库"); System.out.println(user + "\t" + pwd + "\t"); }else { JOptionPane.showMessageDialog(null, "用户名或者密码错误,请重新输入!", "提示消息", JOptionPane.ERROR_MESSAGE); } } catch (Exception ex) {} } if(e.getSource() == reg){ Register register = new Register(); } } } Accountbook类中: rs=stat.executeQuery("select * from tb_accountbook where user = '"+user+"'"); 这个user怎么获取
java简易计算器实现,添加能够切换简易计算器和科学计算器的按键。
![图片说明](https://img-ask.csdn.net/upload/201810/27/1540655964_202901.png) 现已有完整计算器框架和实现,但是需求有一条是: 能 通过菜单可以切换简易计算器和科学计算器。 如今就这个功能未实现,简易计算器就是只包含+、-、*、/的状态,而科学计算器则包括开方、平方、幂运算、1/n等操作。各运算已实现,但就是不知道怎么切换界面。求大神添加一个能够让其变化界面的按钮函数来实现。 附上代码: ``` import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; /** * 一个计算器,与Windows附件自带计算器的标准版功能、界面相仿。 但还不支持键盘操作。 */ public class Calculator extends JFrame implements ActionListener { /** 计算器上的键的显示名字 */ private final String[] KEYS = { "7", "8", "9", "÷", "sqrt", "4", "5", "6", "x", "%", "1", "2", "3", "-", "1/x", "0", "+/-", ".", "+", "=" }; /** 计算器上的功能键的显示名字 */ private final String[] COMMAND = { "Backspace", "CE", "C" }; /** 计算器左边的M的显示名字 */ private final String[] M = { " ", "MC", "MR", "MS", "M+" }; /** 计算器上键的按钮 */ private JButton keys[] = new JButton[KEYS.length]; /** 计算器上的功能键的按钮 */ private JButton commands[] = new JButton[COMMAND.length]; /** 计算器左边的M的按钮 */ private JButton m[] = new JButton[M.length]; /** 计算结果文本框 */ private JTextField resultText = new JTextField("0"); // 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字 private boolean firstDigit = true; // 计算的中间结果。 private double resultNum = 0.0; // 当前运算的运算符 private String operator = "="; // 操作是否合法 private boolean operateValidFlag = true; /** * 构造函数 */ public Calculator() { super(); // 初始化计算器 init(); // 设置计算器的背景颜色 this.setBackground(Color.BLACK); this.setTitle("计算器"); // 在屏幕(500, 300)坐标处显示计算器 this.setLocation(500, 300); // 不许修改计算器的大小 this.setResizable(false); // 使计算器中各组件大小合适 this.pack(); } /** * 初始化计算器 */ private void init() { // 文本框中的内容采用右对齐方式 resultText.setHorizontalAlignment(JTextField.RIGHT); // 不允许修改结果文本框 resultText.setEditable(false); // 设置文本框背景颜色为白色 resultText.setBackground(Color.WHITE); // 初始化计算器上键的按钮,将键放在一个画板内 JPanel calckeysPanel = new JPanel(); // 用网格布局器,4行,5列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 calckeysPanel.setLayout(new GridLayout(4, 5, 3, 3)); for (int i = 0; i < KEYS.length; i++) { keys[i] = new JButton(KEYS[i]); calckeysPanel.add(keys[i]); keys[i].setForeground(Color.blue); } // 运算符键用红色标示,其他键用蓝色表示 keys[3].setForeground(Color.red); keys[8].setForeground(Color.red); keys[13].setForeground(Color.red); keys[18].setForeground(Color.red); keys[19].setForeground(Color.red); // 初始化功能键,都用红色标示。将功能键放在一个画板内 JPanel commandsPanel = new JPanel(); // 用网格布局器,1行,3列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 commandsPanel.setLayout(new GridLayout(1, 3, 3, 3)); for (int i = 0; i < COMMAND.length; i++) { commands[i] = new JButton(COMMAND[i]); commandsPanel.add(commands[i]); commands[i].setForeground(Color.red); } // 初始化M键,用红色标示,将M键放在一个画板内 JPanel calmsPanel = new JPanel(); // 用网格布局管理器,5行,1列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 calmsPanel.setLayout(new GridLayout(5, 1, 3, 3)); for (int i = 0; i < M.length; i++) { m[i] = new JButton(M[i]); calmsPanel.add(m[i]); m[i].setForeground(Color.red); } // 下面进行计算器的整体布局,将calckeys和command画板放在计算器的中部, // 将文本框放在北部,将calms画板放在计算器的西部。 // 新建一个大的画板,将上面建立的command和calckeys画板放在该画板内 JPanel panel1 = new JPanel(); // 画板采用边界布局管理器,画板里组件之间的水平和垂直方向上间隔都为3象素 panel1.setLayout(new BorderLayout(3, 3)); panel1.add("North", commandsPanel); panel1.add("Center", calckeysPanel); // 建立一个画板放文本框 JPanel top = new JPanel(); top.setLayout(new BorderLayout()); top.add("Center", resultText); // 整体布局 getContentPane().setLayout(new BorderLayout(3, 5)); getContentPane().add("North", top); getContentPane().add("Center", panel1); getContentPane().add("West", calmsPanel); // 为各按钮添加事件侦听器 // 都使用同一个事件侦听器,即本对象。本类的声明中有implements ActionListener for (int i = 0; i < KEYS.length; i++) { keys[i].addActionListener(this); } for (int i = 0; i < COMMAND.length; i++) { commands[i].addActionListener(this); } for (int i = 0; i < M.length; i++) { m[i].addActionListener(this); } } /** * 处理事件 */ public void actionPerformed(ActionEvent e) { // 获取事件源的标签 String label = e.getActionCommand(); if (label.equals(COMMAND[0])) { // 用户按了"Backspace"键 handleBackspace(); } else if (label.equals(COMMAND[1])) { // 用户按了"CE"键 resultText.setText("0"); } else if (label.equals(COMMAND[2])) { // 用户按了"C"键 handleC(); } else if ("0123456789.".indexOf(label) >= 0) { // 用户按了数字键或者小数点键 handleNumber(label); // handlezero(zero); } else { // 用户按了运算符键 handleOperator(label); } } /** * 处理Backspace键被按下的事件 */ private void handleBackspace() { String text = resultText.getText(); int i = text.length(); if (i > 0) { // 退格,将文本最后一个字符去掉 text = text.substring(0, i - 1); if (text.length() == 0) { // 如果文本没有了内容,则初始化计算器的各种值 resultText.setText("0"); firstDigit = true; operator = "="; } else { // 显示新的文本 resultText.setText(text); } } } private void handleNumber(String key) { if (firstDigit) { // 输入的第一个数字 resultText.setText(key); } else if ((key.equals(".")) && (resultText.getText().indexOf(".") < 0)) { // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面 resultText.setText(resultText.getText() + "."); } else if (!key.equals(".")) { // 如果输入的不是小数点,则将数字附在结果文本框的后面 resultText.setText(resultText.getText() + key); } // 以后输入的肯定不是第一个数字了 firstDigit = false; } private void handleC() { // 初始化计算器的各种值 resultText.setText("0"); firstDigit = true; operator = "="; } private void handleOperator(String key) { if (operator.equals("÷")) { // 除法运算 // 如果当前结果文本框中的值等于0 if (getNumberFromText() == 0.0) { // 操作不合法 operateValidFlag = false; resultText.setText("除数不能为零"); } else { resultNum /= getNumberFromText(); } } else if (operator.equals("1/x")) { // 倒数运算 if (resultNum == 0.0) { // 操作不合法 operateValidFlag = false; resultText.setText("零没有倒数"); } else { resultNum = 1 / resultNum; } } else if (operator.equals("+")) { // 加法运算 resultNum += getNumberFromText(); } else if (operator.equals("-")) { // 减法运算 resultNum -= getNumberFromText(); } else if (operator.equals("x")) { // 乘法运算 resultNum *= getNumberFromText(); } else if (operator.equals("sqrt")) { // 平方根运算 resultNum = Math.sqrt(resultNum); } else if (operator.equals("%")) { // 百分号运算,除以100 resultNum = resultNum / 100; } else if (operator.equals("+/-")) { // 正数负数运算 resultNum = resultNum * (-1); } else if (operator.equals("=")) { // 赋值运算 resultNum = getNumberFromText(); } if (operateValidFlag) { // 双精度浮点数的运算 long t1; double t2; t1 = (long) resultNum; t2 = resultNum - t1; if (t2 == 0) { resultText.setText(String.valueOf(t1)); } else { resultText.setText(String.valueOf(resultNum)); } } // 运算符等于用户按的按钮 operator = key; firstDigit = true; operateValidFlag = true; } /** * 从结果文本框中获取数字 * * @return */ private double getNumberFromText() { double result = 0; try { result = Double.valueOf(resultText.getText()).doubleValue(); } catch (NumberFormatException e) { } return result; } public static void main(String args[]) { Calculator calculator1 = new Calculator(); calculator1.setVisible(true); calculator1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } ```
Java图形界面进度条显示问题
# 这是我最近做的关于java图形界面组件的小练习,主要功能是实现文件复制并显示进度。代码没有报错,运行也无异常,但是在程序运行过程中,进度条没有随着复制进度的增长而增长,一直显示为0%,只有复制完毕才会显示100%。但是我能用getValue()方法获取当前的进度值,而这个值是没有问题的,但是他没有在进度条中显示出来,不知道什么原因。 ## package com.GUI; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JTextField; public class TestControl1 { public static float fileSize = 0; public static float targetFileSize = 0; public static void main(String[] args) { // TODO Auto-generated method stub JFrame jf = new JFrame("带进度条的文件复制"); jf.setSize(500, 150); jf.setLocationRelativeTo(null); jf.setLayout(null); JPanel copyPanel = new JPanel(); copyPanel.setBounds(6, 10, 450, 40); copyPanel.setLayout(new FlowLayout()); JLabel srcFileAdress = new JLabel("源文件地址:"); JTextField adressText = new JTextField("f:/jdk"); adressText.setPreferredSize(new Dimension(100, 25)); JLabel copyLabel = new JLabel("复制到:"); JTextField copyText = new JTextField("f:/jdk2"); copyText.setPreferredSize(new Dimension(100, 25)); copyPanel.add(srcFileAdress); copyPanel.add(adressText); copyPanel.add(copyLabel); copyPanel.add(copyText); JPanel copyStartPanel = new JPanel(); copyStartPanel.setBounds(10, 60, 450, 50); copyStartPanel.setLayout(new FlowLayout()); JButton startCopyButton = new JButton("开始复制"); startCopyButton.setPreferredSize(new Dimension(100, 30)); JLabel fileCopyProgress = new JLabel("文件复制进度"); JProgressBar fileProgress = new JProgressBar(); fileProgress.setPreferredSize(new Dimension(126, 31)); fileProgress.setMaximum(100); fileProgress.setStringPainted(true); copyStartPanel.add(startCopyButton); copyStartPanel.add(fileCopyProgress); copyStartPanel.add(fileProgress); jf.add(copyPanel); jf.add(copyStartPanel); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setVisible(true); File srcFile = new File(adressText.getText()); calclateAllFilesize(srcFile); File targetFile = new File(copyText.getText()); startCopyButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub copyTo(srcFile, targetFile,fileProgress); } }); } public static void copyTo(File file1, File file2,JProgressBar showProgress) { File srcFile = file1; File targetFile = file2; JProgressBar fileProgress = showProgress; if (!srcFile.exists()) { return; } File[] allFile = srcFile.listFiles(); for (File each : allFile) { File nextFile = new File(targetFile.getAbsolutePath(), each.getName()); if (each.isDirectory()) { nextFile.mkdirs(); copyTo(each, nextFile,fileProgress); } else { try( FileReader fr = new FileReader(each); BufferedReader br = new BufferedReader(fr); FileWriter fw = new FileWriter(nextFile); PrintWriter pw = new PrintWriter(fw); ){ while(true){ String line = br.readLine(); if(line == null ){ break; } pw.println(line); pw.flush(); } }catch(IOException e){ e.printStackTrace(); } targetFileSize += (float)each.length(); int current = (int)(targetFileSize/fileSize*100); fileProgress.setValue(current); System.out.println(fileProgress.getValue()); if(current == 100){ JOptionPane.showMessageDialog(showProgress, "复制完毕"); } } } } public static void calclateAllFilesize(File file) { if (file.isFile()) { fileSize += (float)file.length(); } if (file.isDirectory()) { File[] fs = file.listFiles(); for (File f : fs) { calclateAllFilesize(f); } } } }
有没有大神能指点一下哪里错了。。。。
package Frame; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.*; import javax.swing.*; import db.DButil; public class login extends JFrame implements ActionListener{ private JPanel jp=new JPanel(); //创建标签数组 private JLabel[] jlArray={new JLabel("用户名"), new JLabel("密 码"),new JLabel("")}; private JButton jb1; private JButton jb2; private JButton jb3; private JTextField jtf=new JTextField(); private JPasswordField jpf=new JPasswordField(); //布局构造实现方法 public login(){ Icon icon1=new ImageIcon("login.jpg"); Icon icon2=new ImageIcon("reset.jpg"); Icon icon3=new ImageIcon("zhuce.jpg"); JPanel jp=new JPanel(){ protected void paintComponent(Graphics g) { ImageIcon icon = new ImageIcon("bg.jpg"); Image img = icon.getImage(); g.drawImage(img, 0, 0, icon.getIconWidth(), icon.getIconHeight(), icon.getImageObserver()); }}; jp.setLayout(null); jb1=new JButton(icon1); jb2=new JButton(icon3); jb3=new JButton(icon2); jlArray[0].setBounds(70,120,90,32); jb1.setBounds(365,110,130,60); jb2.setBounds(365,170,130,60); jlArray[1].setBounds(70,170,90,32); //将标签与按钮添加到JPanel容器中 jp.add(jlArray[0]); jp.add(jlArray[1]); jp.add(jb1); jp.add(jb2); jb1.addActionListener(this); jb2.addActionListener(this);//为按钮注册动作事件监听器 //添加修改密码的按钮 jb3.setBounds(365,230,130,60); jp.add(jb3); jp.add(jtf); jtf.setBounds(140,120,180,30);//设置文本框位置 jp.add(jpf); jpf.setBounds(140,170,180,30);//设置密码框位置 jpf.setEchoChar('*'); //密码显示字符形式 jpf.addActionListener(this); //为密码框注册动作事件监听器 this.setVisible(true);//设置窗体的可见性 jpf.addActionListener(this); //为密码框注册动作事件监听器 //设置用于显示登陆状态的标签大小位置,并将其添加进JPanel容器 jlArray[2].setBounds(70,220,300,30); jp.add(jlArray[2]); this.setTitle("登陆");//设置窗体标题 this.setBounds(450,200,500,318);//设置窗体的大小 this.setResizable(false);//设置窗体不让用户调整大小 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.setVisible(true);//设置窗体的可见性 this.add(jp);//将窗体添加到面板中 jp.setBackground(Color.blue); } public static void main(String[] args) { new login();//创建登陆窗体 } public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub //得到用户名与密码 String user=jtf.getText().trim(); String pwd=String.valueOf(jpf.getPassword());//返回密码的字符串表示方式 String sql=""; if(e.getSource()==jtf){//事件源为文本框,切换焦点到密码框 jpf.requestFocus(); } else if(e.getSource()==jb1||e.getSource()==jpf){ //判断用户名和密码是否匹配 查询数据库 if(DButil.check(user, pwd)){ //登陆成功 MainFrame mf=new MainFrame(jtf.getText());//主窗体 this.dispose(); } else{ //登陆失败 jlArray[2].setText("对不起,非法的用户名和密码"); this.clear(); } } else if(e.getSource()==jb2) {//事件源为注册按钮 if(user.equals("")||pwd.equals("")) {//如果注册的用户名为空或者密码为空 jlArray[2].setText("用户名和密码都不得为空!!!"); this.clear();//清空输入文本框 } else { sql="select uid from user where uid='"+user+"'"; if(DButil.isExist(sql)) {//用户名已经存在 jlArray[2].setText("对不起,用户名已存在!!!"); this.clear();//清空输入文本框 } else { sql="insert into user values('"+user+"','"+pwd+"')"; if(DButil.update(sql)>0) {//注册成功 jlArray[2].setText("恭喜您!!!注册成功,请登陆"); } } } } else if(e.getSource()==jb3)//修改密码的监听 { //判断是否已经输入用户名和密码 if(user.equals("")||pwd.equals("")) { jlArray[2].setText("修改密码先输入正确的用户名和密码!!!"); this.clear();//清空输入文本框 } //判断是否输入了正确的用户名和密码 else if(DButil.check(user,pwd)) { //正确的用户名和密码 String password=JOptionPane.showInputDialog(this,"修改密码:","请输入新密码", JOptionPane.PLAIN_MESSAGE); //得到新的密码为空 if(password==null||password.equals("")) { JOptionPane.showMessageDialog(this,"密码不得为空!!!","错误", JOptionPane.WARNING_MESSAGE); } else {//密码不为空 sql="update user set pwd='"+password+"' where uid='"+user+"'";//更新密码的SQL if(DButil.update(sql)>0) {//密码修改成功 this.clear();//清空输入文本框 jlArray[2].setText("恭喜您!!!密码修改成功,请用新密码登陆"); } } } else { JOptionPane.showMessageDialog(this,"用户名或者密码错误!!!","错误", JOptionPane.WARNING_MESSAGE); this.clear();//清空输入文本框 } } } package Frame; import javax.swing.*; import javax.swing.table.DefaultTableModel; import db.DButil; import java.awt.*; import java.awt.event.*; import java.sql.*; import java.io.*; import java.util.*; public class MainFrame extends JFrame implements ActionListener,ItemListener { private String uname=null;//当前用户的名字 private boolean isInsert=false;//是否为添加默认为否 private JPanel topjp=new JPanel();//界面上半部分的JPanel容器 private JButton jba=new JButton("模糊查询"); private JButton jbs=new JButton("查找"); private JTextField jtfs=new JTextField();//按给出信息查找联系人信息 private JRadioButton jrbxm=new JRadioButton("按姓名查找",true); private JRadioButton jrbbh=new JRadioButton("按学号查找",false); private ButtonGroup bg=new ButtonGroup();//单选按钮组 private JPanel jpbr=new JPanel();//单选按钮面板 private JPanel jpyInfo=new JPanel();//右侧显示个人信息的面板 private JTextArea jta=new JTextArea(); // 模糊查询得到的信息文本区 private JLabel[] jlInfo={new JLabel("学号:"),new JLabel("姓名:"), new JLabel("性别:"),new JLabel("出生日期:"), new JLabel("电话号码:"),new JLabel("QQ:"), new JLabel("Email:"),new JLabel("地址:"), new JLabel("添加相片")}; private JButton[] jbInfo={new JButton("编辑"),new JButton("保存"), new JButton("浏览"), new JButton("上传"),}; private JLabel jlPhoto=new JLabel();//显示图像的JLabel控件 private JTextField[] jtfInfo=new JTextField[10]; private JTextField jtfPhoto=new JTextField();//添加照片到相册的路径 private JFileChooser jfcPic=new JFileChooser();//上传图像的文件选择器 private DefaultTableModel tableModel; private JTable table; //性别部分 private JRadioButton jrbMale=new JRadioButton("男",true); private JRadioButton jrbFemale=new JRadioButton("女"); private ButtonGroup bgGender=new ButtonGroup(); private JPanel jpGender=new JPanel();//单选按钮面板 private JLabel jlDetail=new JLabel();//右侧显示一幅图片的标签 private JSplitPane jspOuter=//上下分割的JSplitPane new JSplitPane(JSplitPane.VERTICAL_SPLIT,true); //系统托盘部分 private PopupMenu popup=new PopupMenu(); private SystemTray tray;//定义SystemTray成员变量 private TrayIcon trayIcon;//定义TrayIcon成员变量 private MenuItem exit=new MenuItem("退出程序");//定义菜单 public void initJps() {//界面上半部分的初始化 topjp.setLayout(null);//设置topjp布局管理器为null //设置按钮大小并添加到JPanel面板里 jba.setBounds(5,10,120,26); jba.addActionListener(this);//为模糊查询按钮注册事件监听器 topjp.add(jba); jbs.setBounds(130,10,80,26); jbs.addActionListener(this);//为查找按钮注册事件监听器 topjp.add(jbs);//添加按钮到topjp面板里 //设置jtfs文本框大小并添加到jps面板里 jtfs.setBounds(215,10,120,26); jtfs.addActionListener(this);//为文本框注册事件监听器 topjp.add(jtfs); //设置单选按钮大小和位置并添加到jpbr面板里同时添加到bg单选按钮组里 jrbxm.setBounds(5,3,50,26); jrbxm.addItemListener(this);//为单选按钮注册ItemEvent事件监听器 bg.add(jrbxm); jpbr.add(jrbxm); jrbbh.setBounds(60,3,50,26); jrbbh.addItemListener(this); bg.add(jrbbh); jpbr.add(jrbbh); jpbr.setBounds(360,10,200,26); topjp.add(jpbr); } public void initInfo() {//初始化信息界面 jpyInfo.setLayout(null);//设置布局管理器为空 jpyInfo.setBounds(50,50,380,360);//设置信息面板的大小和位置 jlPhoto.setBounds(220,10,150,170);//设置联系人图像JLabel的大小和位置 jlPhoto.setBorder(BorderFactory.createLineBorder(Color.BLACK));//将JLbel的边框线显现出来 jpyInfo.add(jlPhoto);//将显示联系人照片的JLabel添加到信息面板 tableModel=new DefaultTableModel(); Vector vector1 = new Vector(); DButil db = new DButil(); vector1.add("学号"); vector1.add("姓名"); vector1.add("性别"); vector1.add("出生日期"); vector1.add("电话号码"); vector1.add("QQ"); vector1.add("Email"); vector1.add("地址"); vector1.add("照片路径"); tableModel.setDataVector(null, vector1); System.out.print(123); table=new JTable(tableModel); //table.addMouseListener((MouseListener) this); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); JScrollPane js=new JScrollPane(table); //添加相片部分的控件 jtfPhoto.setBounds(80,250,200,26);//设置得到照片路径的文本框的大小和位置 jpyInfo.add(jtfPhoto);//将得到照片路径的文本框添加到信息面板 jbInfo[2].setBounds(285,250,80,26); jbInfo[2].addActionListener(this);//为添加照片的浏览按钮注册事件监听器 jpyInfo.add(jbInfo[2]); //上传按钮 jbInfo[3].setBounds(380,250,80,26); jbInfo[3].addActionListener(this);//为添加照片的浏览按钮注册事件监听器 jpyInfo.add(jbInfo[3]); for(int i=0;i<9;i++)//添加JLabel,并设置大小和位置 { jlInfo[i].setBounds(20,10+i*30,60,26); jpyInfo.add(jlInfo[i]); } for(int i=0;i<10;i++) {//初始化一些文本框 jtfInfo[i]=new JTextField(); } //学号 jtfInfo[0].setBounds(80,10,135,26); jpyInfo.add(jtfInfo[0]); //姓名 jtfInfo[1].setBounds(80,40,135,26); jpyInfo.add(jtfInfo[1]); //出生日期 jtfInfo[3].setBounds(80,100,135,26); jpyInfo.add(jtfInfo[3]); //电话号码 jtfInfo[4].setBounds(80,130,135,26); jpyInfo.add(jtfInfo[4]); //QQ jtfInfo[5].setBounds(80,160,135,26); jpyInfo.add(jtfInfo[5]); //Email jtfInfo[6].setBounds(80,190,135,26); jpyInfo.add(jtfInfo[6]); //地址文本框的添加 jtfInfo[7].setBounds(80,220,285,26); jpyInfo.add(jtfInfo[7]); //模糊查询信息文本区的添加 js.setBounds(0,350,600,100); jpyInfo.add(js); //编辑、保存按钮 jbInfo[0].setBounds(160,300,80,26); jbInfo[0].addActionListener(this); jpyInfo.add(jbInfo[0]); jbInfo[1].setBounds(260,300,80,26); jbInfo[1].addActionListener(this); jpyInfo.add(jbInfo[1]); //性别部分 jrbMale.setBounds(5,3,50,26); jrbMale.addItemListener(this); //为单选按钮注册ItemEvent事件监听器 bgGender.add(jrbMale); jpGender.add(jrbMale); jrbFemale.setBounds(60,3,50,26); jrbFemale.addItemListener(this); //为单选按钮注册ItemEvent事件监听器 bgGender.add(jrbFemale); jpGender.add(jrbFemale); jpGender.setBounds(60,70,125,26); jpyInfo.add(jpGender); } public void clearInfo()//清空信息面板 { for(int i=0;i<10;i++) { jtfInfo[i].setText("");//清空文本框 } jlPhoto.setIcon(null);//清空图像 } public void setjtaArea(String information){ if(information.isEmpty()){ JOptionPane.showMessageDialog(this,"所查用户不存在!!!","错误", JOptionPane.WARNING_MESSAGE); } else { jta.setText(information); } } public void setInfo(Vector<String> pInfo)//将信息向量设置到信息面板中 {//将信息向量按规则填到信息面板里 this.clearInfo(); if(pInfo.size()==0) { JOptionPane.showMessageDialog(this,"所查用户不存在!!!","错误", JOptionPane.WARNING_MESSAGE); } else { for(int i=0;i<2;i++) {//显示联系人编号和姓名 jtfInfo[i].setText(pInfo.get(i)); } if(pInfo.get(2).equals("男")) {//显示性别 jrbMale.setSelected(true); } else {//显示性别 jrbFemale.setSelected(true); } for(int i=3;i<9;i++) {//显示出生日期、电话号码和QQ jtfInfo[i].setText(pInfo.get(i)); } } } public Vector<String> getInfo()//从信息面板得到用户输入的信息 { Vector<String> pInfo=new Vector<String>(); pInfo.add(jtfInfo[0].getText().trim());//添加pid pInfo.add(jtfInfo[1].getText().trim());//添加pname String gender=jrbMale.isSelected()?"男":"女"; pInfo.add(gender);//添加性别 pInfo.add(jtfInfo[3].getText().trim());//出生日期 pInfo.add(jtfInfo[4].getText().trim());//电话号码 pInfo.add(jtfInfo[5].getText().trim());//QQ pInfo.add(jtfInfo[6].getText().trim());//Email pInfo.add(jtfInfo[7].getText().trim());//地址 String photoPath=jtfPhoto.getText().trim();//得到照片路径 pInfo.add(photoPath);//照片路径 return pInfo; } public void monitorSaveButton() //监听保存按钮的方法 { String sql=""; String pid=jtfInfo[0].getText().trim();//得到联系人的编号 String pname=jtfInfo[1].getText().trim();//得到联系人的姓名 String gender=jrbMale.isSelected()?"男":"女"; String s1=jtfInfo[3].getText().trim(); String s2=jtfInfo[4].getText().trim(); String s3=jtfInfo[5].getText().trim(); String s4=jtfInfo[6].getText().trim(); String s5=jtfInfo[7].getText().trim(); String s6=jtfPhoto.getText().trim(); String sqla="select * from contacts where pid='"+pid+"'";//判断此编号是否存在的SQL String sqlb="select * from contacts where pname='"+pname+"'";//判断此姓名是否存在的SQL boolean isIdExist=DButil.isExist(sqla);//得到编号是否存在 boolean isNameExist=DButil.isExist(sqlb);//得到姓名是否存在 if(!(pid.equals(" ")||pname.equals(" "))) { if(isIdExist||isNameExist){ JOptionPane.showMessageDialog(this,"联系人已存在"+ " , 添加联系人失败","错误",JOptionPane.WARNING_MESSAGE); } else { sql="insert into contacts values (?,?,?,?,?,?,?,?,?,?)"; String[] paras={pid,pname,gender,s1,s2,s3,s4,s5,s6,null}; if(DButil.update(sql,paras)>0){ JOptionPane.showMessageDialog(this,"联系人保存成功","提示", JOptionPane.INFORMATION_MESSAGE); } } } } public void setEditable(boolean Editable)//设置信息窗口是否可编辑 { jrbFemale.setEnabled(Editable);//设置性别是否可编辑 jrbMale.setEnabled(Editable);//设置性别是否可编辑 for(int i=0;i<8;i++) { jtfInfo[i].setEditable(Editable);//设置文本框是否可编辑 } } public void monitorSearchButton()//监听查找按钮的方法 { String name=jtfs.getText().trim(); String sql="";//声明查找字符串 if(name.equals("")) { JOptionPane.showMessageDialog(this,"查找条件不能为空!!!", "错误", JOptionPane.WARNING_MESSAGE); } else { if(jrbxm.isSelected()==true) {//按姓名查找 sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where pname='"+name+"'"; this.setInfo(DButil.getPerInfo(sql));//设置信息面板为该联系人的信息 } else {//按编号查找 sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where pid='"+name+"'"; this.setInfo(DButil.getPerInfo(sql));//设置信息面板为该联系人的信息 } } this.setEditable(false);//设置面板不可编辑 } public void monitorRandomSearchButton(String information){ //监听模糊查询按钮 String adress=jba.getText().trim(); String sql="";//声明查找字符串 if(adress.equals("")) { JOptionPane.showMessageDialog(this,"查找条件不能为空!!!", "错误", JOptionPane.WARNING_MESSAGE); } else{ sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where padress like '%天河区%'"; } } public MainFrame(String uname) { //主窗体构造器 this.uname=uname;//设置用户名 this.initJps();//界面上半部分的搭建 this.initInfo(); jspOuter.setDividerLocation(46);//设置分割窗体JSplitPane的位置 jspOuter.setTopComponent(topjp);//设置窗体上半部分的控件 jspOuter.setBottomComponent(jpyInfo);//设置下半部分的控件 //设置窗体关闭按钮执行的动作 this.add(jspOuter); this.addWindowListener( new WindowAdapter() { @SuppressWarnings("deprecation") public void WindowClosing(WindowEvent e) { //将窗体隐藏 MainFrame.this.hide(); } } ); //设置主窗体的图标、标题、大小以及可见性 this.setResizable(false);//设置窗体不让调整大小 this.setTitle(uname+"的通讯录"); this.setBounds(420,80,618,550); this.setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getSource()==jbInfo[1]) {//保存按钮的监听 this.monitorSaveButton(); } else if(e.getSource()==jba) {//模糊查询按钮的监听 DButil db = new DButil(); Vector vector1 = new Vector(); vector1.add("学号"); vector1.add("姓名"); vector1.add("性别"); vector1.add("出生日期"); vector1.add("电话号码"); vector1.add("QQ"); vector1.add("Email"); vector1.add("地址"); vector1.add("照片路径"); String ad = jtfs.getText().trim(); tableModel.setDataVector(db.getData(ad),vector1); } else if(e.getSource()==jbInfo[2]) {//打开图像文件路径 jfcPic.showOpenDialog(this); if(jfcPic.getSelectedFile()!=null) { jtfPhoto.setText(""+jfcPic.getSelectedFile()); } } else if(e.getSource()==jbInfo[0]) {//编辑按钮的监听 this.setEditable(true);//设置信息面板可编辑 } else if(e.getSource()==jbs||e.getSource()==jtfs) {//查找,按按钮或者在文本框里敲回车 this.monitorSearchButton(); } } public void itemStateChanged(ItemEvent e) { } public static void main(String[] args){ } } package db; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import java.util.Vector; public class DButil { private static String jdbcName="org.gjt.mm.mysql.Driver";//声明驱动类字符串 //声明数据库连接字符串 private static String dbUrl="jdbc:mysql://127.0.0.1:3306/maillist"; private static String dbUserName="root"; private static String dbPassword="admin"; private static Connection con=null;//声明数据库连接对象引用 private static Statement stat=null;//声明语句对象引用 private static PreparedStatement pstmt=null; private static ResultSet rs=null;//声明结果集对象引用 private static PreparedStatement psInsert=null;//声明预编译语句对象引用 public static Connection getConnection()//得到数据库连接的方法 { System.out.println("连接中.."); try { Class.forName(jdbcName);//加载驱动类 con=DriverManager.getConnection(dbUrl,dbUserName,dbPassword);//得到连接 System.out.println("成功连接"); } catch(Exception e){e.printStackTrace();} return con;//返回连接 } public static boolean check(String user,String pwd)//登陆验证 { boolean flag=false; try { con=DButil.getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery("select pwd from user where uid='"+user+"'"); rs.next(); String spwd=rs.getString(1);//得到密码 if(spwd.equals(pwd)) { flag=true;//密码匹配,登陆成功 } } catch(Exception e) { flag=false;//有任何异常发生,登陆失败 } finally{DButil.closeCon();}//关闭数据库连接 return flag; } //某条记录是否存在 public static boolean isExist(String sql) { boolean flag=false;//设置返回值 try { con=DButil.getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery(sql);//执行查询 if(rs.next()) { flag=true;//存在,设置返回值为true } } catch(Exception e) { e.printStackTrace(); flag=false;//发生任何异常,置返回结果为false } finally{DButil.closeCon();}//关闭数据库连接 return flag;//返回结果 } public static int update(String sql,String[] paras)//更新数据库 { int count=0;//声明返回值 try { con=DButil.getConnection(); pstmt=con.prepareStatement(sql); for(int i=0; i<paras.length;i++){ pstmt.setString(i+1, paras[i]); } count=pstmt.executeUpdate(); } catch(Exception e) { e.printStackTrace(); count=-1;//更新失败返回值为-1 } finally{DButil.closeCon();}//关闭数据库连接 return count;//返回结果 } public static int update(String sql)//更新数据库 { int count=0;//声明返回值 try { con=DButil.getConnection(); stat=con.createStatement(); count=stat.executeUpdate(sql);//执行更新 } catch(Exception e) { e.printStackTrace(); count=-1;//更新失败返回值为-1 } finally{DButil.closeCon();}//关闭数据库连接 return count;//返回结果 } //====================添加联系人================================= public static String insertPerson(String uid,Vector<String> pInfo) { String isPathNull="isNotNull";//传过来的图像是不是合法,默认不为空 try{ con=getConnection();//得到数据库连接 if(pInfo.get(8).equals("")||pInfo.get(8)==null) {//照片路径为空,则不插入图像 psInsert=con.prepareStatement("insert into contacts(pid,pname,pgender,pbirthday,pnumber,"+ "pQQ,pemail,padress,uid)"+ "values(?,?,?,?,?,?,?,?,?)"); } else {//照片路径不为空,则插入图像 psInsert=con.prepareStatement("insert into contacts(pid,pname,pgender,pbirthday,pnumber,"+ "pQQ,pemail,padress,pphoto,uid)"+ "values(?,?,?,?,?,?,?,?,?,?,?)" ); File f=new File(pInfo.get(8));//获取选取的图片文件 byte[] b=new byte[(int)f.length()];//创建存储图片数据的数组 FileInputStream fin=new FileInputStream(f); fin.read(b);fin.close();//读取文件存于byte数组中并关闭输入流 psInsert.setBytes(11,b);//设置pphoto参数的数据 } for(int i=0;i<8;i++) {//设置公共信息 psInsert.setString(i+1,pInfo.get(i)); } psInsert.setString(10,uid);//所属用户 psInsert.execute();psInsert.close();//执行更新并关闭语句 } catch(FileNotFoundException fnfe){isPathNull="isNull";}//图片路径不对 catch(Exception e){e.printStackTrace();} finally{DButil.closeCon();}//关闭数据库连接 return isPathNull; } public static String updatePerson(String uid,Vector<String> pInfo){ String isPathNull="isNotNull";//传过来的path是不是合法 try{ con=getConnection(); if(pInfo.get(9).equals("")||pInfo.get(9)==null) {//更新时候,如果照片路径为空,则不更新图像 psInsert=con.prepareStatement("update contacts set pname=?,pgender=?,birthday=?,pnumber=?,"+ "pQQ=?,pemail=?,padress=?,pphoto=?,uid=? where pid='"+pInfo.get(0).trim()+"'"); } else {//如果照片路径不为空,则更新图像 psInsert=con.prepareStatement("update contacts set pname=?,pgender=?,page=?,pnumber=?,"+ "pemail=?,pgroup=?,ppostalcode=?,padress=?,uid=?,pphoto=? where pid='"+pInfo.get(0).trim()+"'"); File f=new File(pInfo.get(9));//获取选取的图片文件 byte[] b=new byte[(int)f.length()];//创建存储图片数据的数组 FileInputStream fin=new FileInputStream(f); fin.read(b);fin.close();//读取文件存于byte数组中并关闭输入流 psInsert.setBytes(10,b); } for(int i=1;i<8;i++){//设置公共的信息部分 psInsert.setString(i,pInfo.get(i)); } psInsert.setString(9,uid);//所属用户 psInsert.execute();psInsert.close();//执行更新并关闭语句 } catch(FileNotFoundException fnfe){isPathNull="isNull";}//路径不合法 catch(Exception e){e.printStackTrace();} finally{DButil.closeCon();}//关闭连接 return isPathNull; } public Vector getData(String ad){ Vector vector=new Vector(); try { //陈述对象 con=getConnection();//得到数据库连接 stat=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);//创建语句对象 rs=stat.executeQuery("select * from contacts where padress LIKE '%"+ad+"%'"); ResultSetMetaData rm=rs.getMetaData(); //循环打印出数据库表中数据 int n=rm.getColumnCount(); while(rs.next()){ Vector ve=new Vector(); for(int i=1;i<n+1;i++){ String s=rs.getString(i); ve.add(s); } vector.add(ve);//Vector对象接收表中数据 } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{if(rs!=null){ try { rs.close();//关闭结果集 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stat!=null){ try { stat.close();//关闭陈述对象 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(con!=null){ try { con.close();//关闭连接 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return vector; } public static Vector<String> getPerInfo(String sql)//得到联系人信息 { Vector<String> pInfo=new Vector<String>(); try { con=getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery(sql);//执行查询 while(rs.next()) { for(int i=1;i<10;i++) { System.out.println(rs.getString(i)); pInfo.add(rs.getString(i));//将联系人信息添加到返回向量 } } } catch(Exception e) { e.printStackTrace(); } finally{DButil.closeCon();}//关闭数据库连接 return pInfo;//返回信息集合 } public static void closeCon()//关闭数据库连接的方法 { try { if(rs!=null){rs.close(); rs=null;}//如果结果集不为空关闭结果集并赋值null if(stat!=null){stat.close(); stat=null;}//如果语句对象不为空关闭语句对象并赋值null if(con!=null){con.close(); con=null;}//如果连接不为空关闭连接并赋值null } catch(Exception e){e.printStackTrace();} } public static void main(String[] args){ DButil DB=new DButil(); System.out.println(DB.getConnection()); } } }
Swing问题
package com.D; /* * 用图形界面做一个查找文件并在可以打开该文件的软件 */ import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import javax.swing.*; public class FileAndFrame { JButton button; JTextField filePathText; JTextArea fileContentArea; JFileChooser fileChooser; BufferedReader reader; //创建一个窗口 上面含有一个文本框 和一个按钮,文本框用来获取要查找的文件名,按钮时用来打开文件的,下面是文本域用来显示文件的内容 public JPanel createPanel() { JPanel mainPanel=new JPanel(new BorderLayout()); JPanel top=new JPanel(); button =new JButton("打开文件"); button.addActionListener(new Mo()); filePathText=new JTextField(20); top.add(filePathText); top.add(button); mainPanel.add(top,BorderLayout.NORTH); fileContentArea=new JTextArea(); fileContentArea.setWrapStyleWord(true); fileContentArea.setLineWrap(true); mainPanel.add(fileContentArea); mainPanel.setVisible(true); return mainPanel; } private class Mo implements ActionListener { public void actionPerformed(ActionEvent e) { File openFile=new File(" "); if(openFile!=null) { fileChooser=new JFileChooser(openFile.getParentFile()); } else { fileChooser=new JFileChooser(); } int state =fileChooser.showOpenDialog(null); if(state==JFileChooser.APPROVE_OPTION) { File openFile1=fileChooser.getSelectedFile(); filePathText.setText(openFile1.getPath()); showFileContent(openFile1); } } private void showFileContent(File openFile) { reader=new BufferedReader(new FileReader(openFile)); String temp=null; while(temp=reader.readLine()!=null)//该行报错!! { fileContentArea.append(temp); } } } public static void main(String[] args) { JFrame f=new JFrame("文件寻找窗口"); f.setSize(300,250); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container con=f.getContentPane(); con.add(new FileAndFrame().createPanel()); f.setVisible(true); } } 请各位指点!
文本框加入的事件出现问题
一段用NetBeans生成的 有些没用的直接忽略就可以的 问题在前十来行的 e.consume(); 是这样的 本来是文本框加个事件不是数字不能输入 结果出现了 什么都能输入 而且退格左右移动光标都废了 是否数字判断也没问题 ! package cn.itcast_07; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; /** * * @author Hunter */ public class NewJFrame extends javax.swing.JFrame { public NewJFrame() { initComponents(); onlynum(); init(); } public void onlynum() { this.firstNumber.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { char ch = e.getKeyChar(); if (!(ch > '0' && ch < '9')) { e.consume(); } } }); this.secondNumber.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { char ch = e.getKeyChar(); if (!(ch > '0' && ch < '9')) { e.consume(); } } }); } private void init() { this.setTitle("模拟四呢运算"); } private void initComponents() { jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); firstNumber = new javax.swing.JTextField(); secondNumber = new javax.swing.JTextField(); result = new javax.swing.JTextField(); operator = new javax.swing.JComboBox(); jButton1 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jLabel1.setText("第一个数"); jLabel2.setText("第二个数"); jLabel3.setText("结果"); operator.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "+", "-", "*", "/" })); jButton1.setText("计算"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(25, 25, 25) .addComponent(firstNumber) .addGap(20, 20, 20)) .addGroup(layout.createSequentialGroup() .addGap(37, 37, 37) .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 26, Short.MAX_VALUE))) .addComponent(operator, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(0, 22, Short.MAX_VALUE) .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 57, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(75, 75, 75) .addComponent(jLabel3) .addGap(62, 62, 62)) .addGroup(layout.createSequentialGroup() .addComponent(secondNumber, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 79, Short.MAX_VALUE) .addComponent(result)) .addGap(0, 0, Short.MAX_VALUE)))) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(33, 33, 33) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel2) .addComponent(jLabel3)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(firstNumber, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(secondNumber, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(result, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(operator, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 28, Short.MAX_VALUE) .addComponent(jButton1) .addContainerGap()) ); pack(); }// </editor-fold>//GEN-END:initComponents private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed //获取第一个操作数 String firstNumberString = this.firstNumber.getText().trim(); //获取第二个操作数 String secondNumberString = this.secondNumber.getText().trim(); //获取运算符 String operatorString = this.operator.getSelectedItem().toString(); ////第一个数转成int int firstNumber = Integer.parseInt(firstNumberString); //第二个数转成int int secondNumber = Integer.parseInt(secondNumberString); int resultNumber = 0; switch (operatorString) { case "+": resultNumber = firstNumber + secondNumber; break; case "-": resultNumber = firstNumber - secondNumber; break; case "*": resultNumber = firstNumber * secondNumber; break; case "/": resultNumber = firstNumber / secondNumber; break; } this.result.setText(String.valueOf(resultNumber)); }//GEN-LAST:event_jButton1ActionPerformed /** * @param args the command line arguments */ public static void main(String args[]) { try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(NewJFrame.class .getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(NewJFrame.class .getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(NewJFrame.class .getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(NewJFrame.class .getName()).log(java.util.logging.Level.SEVERE, null, ex); } //</editor-fold> /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new NewJFrame().setVisible(true); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextField firstNumber; private javax.swing.JButton jButton1; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JComboBox operator; private javax.swing.JTextField result; private javax.swing.JTextField secondNumber; // End of variables declaration//GEN-END:variables } [图片说明](https://img-ask.csdn.net/upload/201506/13/1434207078_562340.png)
请问如何点击按钮就可以弹出图片?
``` import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Arrays; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.*; import java.awt.Image; //让GUI继承Icon可以画图 public class GUI implements Icon{ static JButton Button1 = new JButton("父亲"); static JButton Button2 = new JButton("母亲"); static JButton Button3 = new JButton("儿子"); static JButton Button4 = new JButton("女儿"); static JButton Button5 = new JButton("姐姐"); static JButton Button6 = new JButton("妹妹"); static JButton Button7 = new JButton("哥哥"); static JButton Button8 = new JButton("弟弟"); static JButton Button9 = new JButton("老婆"); static JButton Button10 = new JButton("删除"); static JButton Button11 = new JButton("清空"); static JButton Button12 = new JButton("等于"); static JTextField txt =new JTextField("",10); static String[] str = new String[15]; static int i = 0; //写死一个标签,用来存放图片,写了再说管这么多 static JLabel label; private ImageIcon father = new ImageIcon ("D:\\图片\\亲属计算器图片\\大耳朵图图\\爸爸.jpg"); // JDialog txt1 =new JDialog(); public static void main(String[] args) { JFrame frame = new JFrame("亲戚计算器"); /* final Box base = Box.createVerticalBox(); final Box box1 = Box.createHorizontalBox(); final Box box2 = Box.createHorizontalBox(); //在这里先导入图片 ImageIcon image_father = new ImageIcon("D:\\图片\\亲属计算器图片\\大耳朵图图\\爸爸.jpg"); image_father.setImage(image_father.getImage().getScaledInstance(100, 200, 70)); Button1.setIcon(image_father);*/ // box1.add(Button1); // base.add(box1); // frame.add(base); /* 思路,先添加一块区域,可以用来显示图片,再在此基础上添加响应事件 其实就是Label*/ frame.setBounds(600,260,1000,1000); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel outLabel = new JLabel(); //frame.add(father); JPanel panel = new JPanel(); frame.add(panel); panel.setLayout(null); placeComponents(panel); new GUI(panel); System.out.println(str[0]); //这里其实只监听了文本,并且只能够监听文本 MyActionListener1 myActionListener1 = new MyActionListener1(txt,outLabel); MyActionListener2 myActionListener2 = new MyActionListener2(txt); MyActionListener3 myActionListener3 = new MyActionListener3(txt); MyActionListener4 myActionListener4 = new MyActionListener4(txt); Button1.addActionListener(myActionListener1); Button2.addActionListener(myActionListener1); Button3.addActionListener(myActionListener1); Button4.addActionListener(myActionListener1); Button5.addActionListener(myActionListener1); Button6.addActionListener(myActionListener1); Button7.addActionListener(myActionListener1); Button8.addActionListener(myActionListener1); Button9.addActionListener(myActionListener1); Button10.addActionListener(myActionListener2); Button11.addActionListener(myActionListener3); Button12.addActionListener(myActionListener4); frame.setVisible(true); } private static void placeComponents(JPanel panel) { // TODO Auto-generated method stub } public GUI(JPanel panel) { txt.setBounds(10,10, 200, 36); panel.add(txt); Button1.setBounds(30, 150, 80, 50); panel.add(Button1); Button2.setBounds(110, 150, 80, 50); panel.add(Button2); Button3.setBounds(190, 150, 80, 50); panel.add(Button3); Button4.setBounds(30, 200, 80, 50); panel.add(Button4); Button5.setBounds(110, 200, 80, 50); panel.add(Button5); Button6.setBounds(190, 200, 80, 50); panel.add(Button6); Button7.setBounds(30, 250, 80, 50); panel.add(Button7); Button8.setBounds(110, 250, 80, 50); panel.add(Button8); Button9.setBounds(190, 250, 80, 50); panel.add(Button9); Button10.setBounds(400, 150, 80, 50); panel.add(Button10); Button11.setBounds(400, 200, 80, 50); panel.add(Button11); Button12.setBounds(400, 250, 80, 50); panel.add(Button12); //与文本类似,这里放了一个标签,可以用来准备显示图片 // Button1.setBounds(400, 150, 80, 50); // panel.add(Button10); } } /*class MyActionListener0 implements ActionListener{//按键后显示相应的图片 private JImageField imageField; }*/ class MyActionListener1 implements ActionListener{//按键后文本框显示,获取相应文本及图片 //即需要定义一个图片区域,并且需要判断这个文字对应的图片 //这才是关键的监听代码的区域 private JTextField textField; public MyActionListener1(JTextField txt, JLabel label) { super(); this.textField = txt; } //每按一次按钮,此方法都会自动调用一次 public void actionPerformed(ActionEvent e) {//名称按键 // TODO Auto-generated method stub textField.setText(textField.getText()+e.getActionCommand()+"的"); GUI.str[GUI.i] = e.getActionCommand().substring(0,2); GUI.i++; //System.out.println(Arrays.toString(GUI.str)); //System.out.println(textField.getText()+e.getActionCommand()+"的"); } } class MyActionListener2 implements ActionListener{//删除方法 private JTextField textField; public MyActionListener2(JTextField txt) { super(); this.textField = txt; } public void actionPerformed(ActionEvent e) { textField.setText(textField.getText().substring(0, textField.getText().length()-3)); GUI.str[GUI.i] = null; GUI.i--; } } class MyActionListener3 implements ActionListener{//清空按键 private JTextField textField; public MyActionListener3(JTextField txt) { super(); this.textField = txt; } public void actionPerformed(ActionEvent e) { textField.setText(textField.getText().substring(0, 0)); for (int i = 0; i <= GUI.i; i++) { GUI.str[i] = null; } GUI.i = 0; } } class MyActionListener4 implements ActionListener{//计算按键 private JTextField textField; public MyActionListener4(JTextField txt) { super(); this.textField = txt; } public void actionPerformed(ActionEvent e) { Jisuanqi jsp = new Jisuanqi(); textField.setText(jsp.jisaunmian(GUI.str, "y")); for (int i = 0; i <= GUI.i; i++) { GUI.str[i] = null; } GUI.i = 0; } } ``` 这是部分代码,运行不出来,因为少了其它的配合的类,主要是要在MyActionListener1中添加一些代码,使得点击Button1-9不仅可以弹出文字,还可以弹出图片。
java文本框读取显示乱码
# package Conn; import java.sql.*; import java.util.*; import javax.swing.JOptionPane; import sun.security.krb5.internal.PAData; import sun.security.util.Password; public class conmysql { static String userword; static String pwd;//账号和密码 static Connection connection=null; static Statement stmt=null;//预备处理语句 static ResultSet rs=null;//结果集 static Vector<Object> sVec=new Vector<Object>(); static Vector<Object> cVec=new Vector<Object>(); static String[] sName={"username"}; static String[] sName1={"password"}; static String sql="select*from accountnumber"; public void connectMysql() { try { Class.forName("com.mysql.jdbc.Driver");//驱动加载 connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/student", "root","root"); System.out.println("数据库连接成功"); stmt = connection.createStatement() ; rs=stmt.executeQuery(sql); mySqlselect(rs); } catch (Exception e) { e.printStackTrace(); }finally{ try { connection.close(); stmt.close(); rs.close(); } catch (Exception e2) { e2.printStackTrace(); } } } private static void mySqlselect(ResultSet RS) { try { while (rs.next()) { String str=RS.getString("username"); String str1=RS.getString("password"); sVec.add(str); cVec.add(str1); } }catch(Exception e){ e.printStackTrace(); } } public int ISName(String user,String passwd) { // TODO Auto-generated method stub int m_b=0; Object[] str2=sVec.toArray(); Object[] str3=cVec.toArray(); System.out.println(str2.length); System.out.println(str3.length); for(int i=0;i<str2.length;i++){ if((String)str2[i]==user && (String)str3[i]==passwd){ m_b=1; break; } } return m_b; } } ## package loginSystem; import Conn.*; import java.awt.GradientPaint; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JRadioButton; import javax.swing.JTextField; import com.sun.xml.internal.bind.v2.runtime.reflect.Accessor.GetterOnlyReflection; public class login extends JFrame implements ActionListener{ JPanel panel,panel1,panel2,panel3=null; JLabel label,label1,label2=null; JButton button,button1,button2=null; JMenuBar bar1; JMenu jm,jm1; JRadioButton jra,jra1; ButtonGroup bg; JTextField jt; JPasswordField jpa; conmysql conn=new conmysql(); public login() { //初始化一个空白容器 panel=new JPanel(); panel1=new JPanel(); panel2=new JPanel(); panel3=new JPanel(); label=new JLabel("用户名");//创建一个 用户名的标签 label1=new JLabel("密 码 "); label2=new JLabel("权 限"); button=new JButton("登录");//创建一个“登录”按钮 button1=new JButton("重置"); button2=new JButton("退出"); button.addActionListener( this);//设置监听 button1.addActionListener( this); button2.addActionListener(this); bar1=new JMenuBar();//新建一个菜单栏 jm=new JMenu("选项");//创建一个菜单 jm1=new JMenu("退出系统"); jm.add(jm1);//把“退出系统”菜单添加到“选项”菜单中 bar1.add(jm); //jra=new JRadioButton("管理员",true);//创建一个复选框 //jra1=new JRadioButton("学生"); bg=new ButtonGroup(); //bg.add(jra);//把复选框添加到按钮组里面 //bg.add(jra1); jt=new JTextField(10);//新建一个文本框 jpa=new JPasswordField(10);//新建一个密码文本框 panel.add(label); panel.add(jt); panel1.add(label1); panel1.add(jpa); panel2.add(label2); //panel2.add(jra); //panel2.add(jra1); panel3.add(button); panel3.add(button1); panel3.add(button2); this.setJMenuBar(bar1); this.add(panel); this.add(panel1); this.add(panel2); this.add(panel3); this.setLayout(new GridLayout(4,1)); this.setTitle("学生宿舍系统"); this.setSize(300, 250); this.setLocation(600,600); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); this.setResizable(true); } public static void main(String[] args) { new login(); } @Override public void actionPerformed(ActionEvent e) { if (e.getActionCommand()=="退出") {//获取标签名 System.exit(0); } else if (e.getActionCommand()=="登录") { String UserText=jt.getText(); char[] PaText=jpa.getPassword(); String PasswdText=PaText.toString(); System.out.println(PaText+" "+PasswdText); if (UserText==null||PasswdText==null) { System.out.println("用户名和密码为空"); } if (UserText==null&&PasswdText==null) { System.out.println("用户名或密码为空"); } conn.connectMysql(); int i=conn.ISName(UserText, PasswdText); System.out.println(i); if(1==i){ System.out.println("信息已确认"); }else{ System.out.println("用户名或密码错误"); //continue; } } } } ![图片说明](https://img-ask.csdn.net/upload/201711/14/1510671473_8048.png)
java.sql.SQLException错误
运行StuDialog.class出现下面错误提示,初学Java请求帮助找出下面是什么原因? java.sql.SQLException: No value specified for parameter 2 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929) at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2560) at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2536) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2383) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2327) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2312) at com.studentmanager.StuAddDialog.actionPerformed(StuAddDialog.java:109) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6216) at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) at java.awt.Component.processEvent(Component.java:5981) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4583) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2475) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178) at java.awt.Dialog$1.run(Dialog.java:1051) at java.awt.Dialog$3.run(Dialog.java:1103) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Dialog.show(Dialog.java:1101) at java.awt.Component.show(Component.java:1516) at java.awt.Component.setVisible(Component.java:1468) at java.awt.Window.setVisible(Window.java:841) at java.awt.Dialog.setVisible(Dialog.java:991) at com.studentmanager.StuAddDialog.<init>(StuAddDialog.java:73) at com.studentmanager.StuDialog.actionPerformed(StuDialog.java:109) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6216) at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) at java.awt.Component.processEvent(Component.java:5981) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4583) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2475) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 1、StuDialog.class如下: package com.studentmanager; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Vector; public class StuDialog extends JFrame implements ActionListener{ //定义一些控件 JPanel jp1,jp2; JLabel jl1; JButton jb1,jb2,jb3,jb4; JTable jt; JScrollPane jsp; JTextField jtf; public static void main(String[] args) { // TODO Auto-generated method stub StuDialog stuDialog=new StuDialog(); } public StuDialog() { jp1=new JPanel(); jtf=new JTextField(10); jb1=new JButton("查询"); jb1.addActionListener(this); jl1=new JLabel("请输入名字"); //把各个控件加入到jp1 jp1.add(jl1); jp1.add(jtf); jp1.add(jb1); jp2=new JPanel(); jb2=new JButton("添加"); jb2.addActionListener(this); jb3=new JButton("修改"); jb4=new JButton("删除"); //把各个按钮就加入到jp2 jp2.add(jb2); jp2.add(jb3); jp2.add(jb4); /*//rowData可以存放多行 Vector hang=new Vector(); hang.add("sp001"); hang.add("孙悟空"); hang.add("男"); hang.add("25"); hang.add("火锅山"); hang.add("少林派"); //加入到rowData rowData.add(hang);*/ //创建一个数据模型对象 StuModel sm=new StuModel(); //初始化JTable jt=new JTable(sm); //初始化Jsp JScrollPane jsp=new JScrollPane(jt); //把jsp放入JFrame this.add(jsp); this.add(jp1,"North"); this.add(jp2,"South"); this.setSize(400,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub //判断是哪个按钮被点击 if(e.getSource()==jb1) { System.out.println("用户想查询"); //因为把表的现实的数据封装到StuModel中,那么我们就可以 //简单完成查询 //查询数据库,更新JTable String name=this.jtf.getText().trim(); //写一个SQL语句 String sql="select * from stu where stuName='"+name+"'"; //构建新的数据模型,并更新 StuModel sm=new StuModel(sql); //更新JTable jt.setModel(sm); //当用户点击添加 } else if(e.getSource()==jb2) { StuAddDialog sa=new StuAddDialog(this,"添加学生",true); //重新再获得新的数据模型 } } } 2、StuAddDialog.class如下: package com.studentmanager; import java.awt.*; import javax.swing.*; import java.util.*; import java.awt.event.*; import javax.swing.JDialog; import java.sql.*; public class StuAddDialog extends JDialog implements ActionListener { //定义我需要的swing控件 JPanel jp1,jp2,jp3; JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6; JButton jb1,jb2; JLabel jl1,jl2,jl3,jl4,jl5,jl6; //owner 它的父窗口 //title窗口名 //model指定是模式窗口,还是非模式窗口 public StuAddDialog(Frame owner,String title,boolean modal) { super(owner,title,modal);//调用父类构造方法,达到模式对话框效果 jl1=new JLabel("学号"); jl2=new JLabel("姓名"); jl3=new JLabel("性别"); jl4=new JLabel("年龄"); jl5=new JLabel("籍贯"); jl6=new JLabel("系别"); jtf1=new JTextField(); jtf2=new JTextField(); jtf3=new JTextField(); jtf4=new JTextField(); jtf5=new JTextField(); jtf6=new JTextField(); jb1=new JButton("添加"); jb1.addActionListener(this); jb2=new JButton("取消"); jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); //设置布局 jp1.setLayout(new GridLayout(6,1)); jp2.setLayout(new GridLayout(6,1)); jp1.add(jl1); jp1.add(jl2); jp1.add(jl3); jp1.add(jl4); jp1.add(jl5); jp1.add(jl6); jp2.add(jtf1); jp2.add(jtf2); jp2.add(jtf3); jp2.add(jtf4); jp2.add(jtf5); jp2.add(jtf6); jp3.add(jb1); jp3.add(jb2); this.add(jp1,BorderLayout.WEST); this.add(jp2,BorderLayout.CENTER); this.add(jp3,BorderLayout.SOUTH); jb1.addActionListener(this); //展现 this.setSize(300,250); //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getSource()==jb1) { //对用户点击添加按钮后的响应动作 //连接数据库 Connection ct=null; Statement stmt=null; ResultSet rs=null; PreparedStatement psmt=null; //连接数据库,判断用户是否合法 try{ //1加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2创建连接对象,注册驱动程序并打开连接对象 ct=DriverManager.getConnection("jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=GBK","root","123456"); psmt=ct.prepareStatement("select * from stu"); //3获取语句对象 //stmt=ct.createStatement(); //与编译语句对象 psmt=ct.prepareStatement("insert into stu values(?,?,?,?,?,?)"); //给参数赋值 psmt.setString(1,jtf1.getText()); psmt.setString(1,jtf2.getText()); psmt.setString(1,jtf3.getText()); psmt.setString(1,jtf4.getText()); psmt.setString(1,jtf5.getText()); psmt.setString(1,jtf6.getText()); //4执行操作 psmt.executeUpdate(); this.dispose();//关闭对话框 }catch(ClassNotFoundException e1) { e1.printStackTrace(); }catch(SQLException e2) { e2.printStackTrace(); } finally { //释放语句对象,连接对象 try { if(rs!=null) rs.close(); if(stmt!=null) stmt.close(); if(ct!=null) ct.close(); }catch(Exception e2) { e2.printStackTrace(); } } } } @Override public Container getContentPane() { // TODO Auto-generated method stub return super.getContentPane(); } @Override public void setContentPane(Container contentPane) { // TODO Auto-generated method stub super.setContentPane(contentPane); } }
【学生一枚,请大神指教】关于Java中组件及事件处理,希望哪位大神可以帮看代码,提出建议
题目描述: ![图片说明](https://img-ask.csdn.net/upload/201704/13/1492090575_763617.jpg) 编写一个算术测试小软件,程序由3个类组成,其中Teacher类对象负责给出加减算术运算题目,并判断回答者的答案是否正确;ComputerFrame类对象负责为算术题目提供视图,例如用户可以通过ComputerFrame类对象提供的GUI界面看到题目,并通过该GUI界面输入答案;MailClasss是软件的主类。 小白一枚,初学Java,上面是一道简单的题,虽然可以实现出来,但是不知道这样写是否可以。如果作为一个Java工程师,您对下面的代码会有什么建议,小白想着一开始便形成一种良好的写代码方式或者思维模式,希望各位大神可以批评建议一下,在这里给各位路过的大神提前拜个早年了,祝您新年快乐!! @+_+@ 代码如下: ComputerFrame类: import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.util.*; public class ComputerFrame extends JFrame{ public static JLabel label; JMenuBar bar; JMenu menu; JButton button1,button2; JTextField text1,text2,text3; public ComputerFrame(){ init(); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void init(){ setLayout(new FlowLayout()); //setTitle("算术测试");凭什么布局不用对象.设置,title却用 bar=new JMenuBar(); menu=new JMenu("选择级别"); button1=new JButton("获取题目"); button2=new JButton("确认答案"); text1=new JTextField(5); text2=new JTextField(5); text3=new JTextField(5); menu.add(new JMenuItem("小学生级别")); bar.add(menu); add(bar); setJMenuBar(bar); add(button1); add(text1); add(new JLabel("+")); add(text2); add(new JLabel("=")); add(text3); add(button2); label=new JLabel("啥也没有"); add(label); } public void setListener(Teacher listener){ listener.setText1(text1); listener.setText2(text2); listener.setText3(text3); listener.setButton1(button1); listener.setButton2(button2); button1.addActionListener(listener); button2.addActionListener(listener); //add(label); } } Teacher类 import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.util.*; public class Teacher implements ActionListener{ JButton button1,button2; JTextField text1,text2,text3; int r1,r2; //JLabel label; public void setText1(JTextField text1){ this.text1=text1; } public void setText2(JTextField text2){ this.text2=text2; } public void setText3(JTextField text3){ this.text3=text3; } public void setButton1(JButton button1){ this.button1=button1; } public void setButton2(JButton button2){ this.button2=button2; } /*public void setJLabel(JLabel label){ this.label=label; } public JLabel getJLabel(){ return label; }*/ public void actionPerformed(ActionEvent e){ if(e.getSource()==button1){ Random random=new Random(); r1=random.nextInt(100); r2=random.nextInt(100); text1.setText(Integer.toString(r1)); text2.setText(Integer.toString(r2)); } if(e.getSource()==button2){ if(Integer.parseInt(text3.getText())==(r1+r2)){ ComputerFrame.label.setText("回答正确"); } else ComputerFrame.label.setText("回答错误"); } } } MailClass类: public class MailClass { public static void main(String args[]){ ComputerFrame win=new ComputerFrame(); win.setTitle("算术测试"); win.setBounds(100,100,460,310); Teacher listener=new Teacher(); win.setListener(listener); } }
defaulttablemodel 刷新数据库里的数据
如下图,我页面上有一个刷新按钮,想通过那个按钮在按钮监听事件中,获取result值然后直接刷新列表。现在按钮点了没反应,不知道哪里出了问题![图片说明](https://img-ask.csdn.net/upload/201703/26/1490518781_255645.png) ``` import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.RowSorter; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.JTableHeader; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; import org.springframework.jdbc.core.RowCallbackHandler; import com.tlxx.dao.MaterialDao; import com.tlxx.model.MaterialList; import com.tlxx.util.DbUtil; import com.tlxx.util.StringUtil; public class MaterialsFrm extends javax.swing.JInternalFrame { MaterialDao materialDao = new MaterialDao(); DbUtil dbUtil = new DbUtil(); private JTable Table; String[] COLUMN = { "物料编号", "物料名称", "规格", "包装规格", "产地", "计量单位", "库存", "单价" };// 表格的列 private Object[][] result; private DefaultTableModel model;// 声明定义表格的模型 private JTextField ItmNameTxt; private JTextField ItmIdTxt; /** * Create the frame. */ public MaterialsFrm() { setClosable(true); setIconifiable(true); setFrameIcon(null); this.setLocation(0, 0); setTitle("\u836F\u6750\u5217\u8868"); initComponents(); getContentPane().setLayout(null); } // 搜索框检索查询 private void searchActionPerformed(ActionEvent evt) { String itmName = this.ItmNameTxt.getText(); String itmId = this.ItmIdTxt.getText(); if (StringUtil.isEmpty(itmName) && StringUtil.isEmpty(itmId)) { JOptionPane.showMessageDialog(null, "<html> <font face= '宋体 ' size= '5'> <b>物料名称或编号不能为空!</b> </font> </html> "); return; } MaterialList matlist = new MaterialList(itmId, itmName); try { result = getFileStates(materialDao.search(dbUtil.getCon(), matlist)); if (result.length == 0) { JOptionPane.showMessageDialog(null, "<html> <font face= '宋体 ' size= '5'> <b>不存在该物料,请重新输入!</b> </font> </html>"); } } catch (Exception e) { e.printStackTrace(); JOptionPane.showConfirmDialog(null, "<html> <font face= '宋体 ' size= '5'> <b>查询异常,请重试或联系管理员!</b> </font> </html>"); } } // 刷新物料按钮 private void refreshActionPerformed(ActionEvent evt) { try { result = getFileStates(materialDao.selectMaterial(dbUtil.getCon())); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } model = new DefaultTableModel(result, COLUMN); Table = new JTable(); Table.setModel(model); } private void initComponents() { JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(30, 150, 1300, 538); getContentPane().add(scrollPane); Table = new JTable(); scrollPane.setColumnHeaderView(Table); try { result = getFileStates(materialDao.selectMaterial(dbUtil.getCon())); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } JButton searchButton = new JButton("搜索"); searchButton.setBounds(610, 27, 123, 33); getContentPane().add(searchButton); searchButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { searchActionPerformed(evt); } }); JLabel label_ItemName = new JLabel("物料名称"); label_ItemName.setFont(new Font("宋体", Font.PLAIN, 20)); label_ItemName.setBounds(30, 31, 81, 33); getContentPane().add(label_ItemName); ItmNameTxt = new JTextField(); ItmNameTxt.setBounds(140, 28, 96, 33); getContentPane().add(ItmNameTxt); ItmNameTxt.setColumns(10); JLabel label_ItmID = new JLabel("物料编号"); label_ItmID.setFont(new Font("宋体", Font.PLAIN, 20)); label_ItmID.setBounds(297, 31, 81, 33); getContentPane().add(label_ItmID); ItmIdTxt = new JTextField(); ItmIdTxt.setBounds(406, 28, 96, 33); getContentPane().add(ItmIdTxt); ItmIdTxt.setColumns(10); JButton refreshButton = new JButton("刷新物料"); refreshButton.setBounds(30, 106, 123, 29); getContentPane().add(refreshButton); refreshButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { refreshActionPerformed(evt); } }); // 数字字段需要按照数值类型排序,而不是字符串类型排序。需覆盖DefaultTableModel的getColumnClass方法进行数值排序 model = new DefaultTableModel(result, COLUMN) { public Class getColumnClass(int column) { Class returnValue; if ((column >= 0) && (column < getColumnCount())) { returnValue = getValueAt(0, column).getClass(); } else { returnValue = Object.class; } return returnValue; } }; Table = new JTable() { //表格不允许被编辑 public boolean isCellEditable(int row, int column) { return false; } }; Table.setModel(model); // RowSorter方法进行表格内排序 RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); Table.setRowSorter(sorter); // Table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // 设置表格大小改变自动变化模型 Table.setGridColor(Color.black);// 设置表格中网格线颜色 Table.setFont(new Font("宋体", Font.BOLD, 20));// 设置字体 DefaultTableCellRenderer cr = new DefaultTableCellRenderer();// 设置单元格居中显示 cr.setHorizontalAlignment(SwingConstants.CENTER); Table.setDefaultRenderer(Object.class, cr); JTableHeader tableHeader = Table.getTableHeader(); tableHeader.setReorderingAllowed(false);// 设置表格列不可移动 scrollPane.setViewportView(Table); pack(); } /** * @param args * the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); try { /* * 更改皮肤,点击substance.jar -> 找到org.jvnet.substance.skin这个包 -> * 将下面的SubstanceDustCoffeeLookAndFeel 替换成 * 刚刚打开的包下的任意一个“Substance....LookAndFeel”即可 */ UIManager.setLookAndFeel(new org.jvnet.substance.skin.SubstanceCremeCoffeeLookAndFeel()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } new MaterialsFrm().setVisible(true); } }); } private Object[][] getFileStates(List list) { // 获取二维数组的方法 Object[][] types = new Object[list.size()][8]; for (int i = 0; i < list.size(); i++) { MaterialList type = (MaterialList) list.get(i); types[i][0] = type.getItmID(); types[i][1] = type.getItmName(); types[i][2] = type.getItmSpec(); types[i][3] = type.getPackSpec(); types[i][4] = type.getPlace(); types[i][5] = type.getPrice(); types[i][6] = type.getStock(); types[i][7] = type.getUnit(); } return types; } } ```
关于java聊天室,求助
问题: 服务器端退出,线程却还在运行 报错: java.net.SocketException: Socket closed at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:152) at java.net.SocketInputStream.read(SocketInputStream.java:122) at java.net.SocketInputStream.read(SocketInputStream.java:210) at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:337) at java.io.DataInputStream.readUTF(DataInputStream.java:589) at java.io.DataInputStream.readUTF(DataInputStream.java:564) at talkingRoom.Servicer$1.run(Servicer.java:127) *********客户端************************ import java.awt.*; import java.net.*; import java.awt.event.*; import java.io.*; import javax.swing.*; @SuppressWarnings("serial") public class Desktop extends JFrame implements ActionListener { @SuppressWarnings("unused") private class WindowCloser extends WindowAdapter { public void windowClosing(WindowEvent we) { System.exit(0); } } private Socket cs = null; private JPanel p = new JPanel(); private JTextArea output = new JTextArea(); private JTextField input = new JTextField(); private DataOutputStream dos; private DataInputStream dis; private JButton b1 = new JButton("进入"); private JButton b2 = new JButton("退出"); private JLabel fuwuqis = new JLabel("服务器:"); private JTextField fuwuqi = new JTextField("127.0.0.1"); private JLabel duankous = new JLabel("端口:"); private JTextField duankou = new JTextField("8888"); private JLabel nichengs = new JLabel("昵称:"); private JTextField nicheng = new JTextField("游客1"); private JButton b3 = new JButton("发送"); private String talking; private boolean started = false; private boolean bConnected = false; //UI界面(不需要再修改) Desktop() { p.setLayout(new BorderLayout()); JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); p1.add(b1); b1.addActionListener(this); p1.add(b2); b2.addActionListener(this); p1.add(fuwuqis); p1.add(fuwuqi); p1.add(duankous); p1.add(duankou); p1.add(nichengs); p1.add(nicheng); p2.setLayout(new BorderLayout()); p2.add(input, BorderLayout.CENTER); p2.add(b3, BorderLayout.EAST); b3.addActionListener(this); p.add(p1, BorderLayout.NORTH); p.add(p2, BorderLayout.SOUTH); p.add(output, BorderLayout.CENTER); buttonclose(); this.setTitle("聊天室for客户端"); this.add(p); this.setSize(500, 300); this.setVisible(true); } public void buttonclose() { b1.setEnabled(true); b2.setEnabled(false); b3.setEnabled(false); input.setEditable(false); fuwuqi.setEditable(true); duankou.setEditable(true); nicheng.setEditable(true); } public void buttonopen() { b1.setEnabled(false); b2.setEnabled(true); b3.setEnabled(true); input.setEditable(true); fuwuqi.setEditable(false); duankou.setEditable(false); nicheng.setEditable(false); } //连接函数,流与Socket所在 public void connect() { try { cs = new Socket(fuwuqi.getText(), Integer.parseInt(duankou.getText())); System.out.print("加入连接"); dos = new DataOutputStream(cs.getOutputStream()); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //断开函数,流与Socket所在 public void disconnect() { try { bConnected = false; dos.writeUTF("$%$"); dis.close(); dos.close(); System.out.println("disdos.close"); cs.close(); System.out.println("cs.close"); output.append("退出成功\n"); buttonclose(); } catch (IOException e) { e.printStackTrace(); } } //发送流函数 public void send() { try { if(talking == null) { dos.writeUTF(""); }else { dos.writeUTF(talking); } dos.flush(); } catch (IOException e1) { e1.printStackTrace(); } } //接收流函数 public void receive() { try { started = true; bConnected = true; dis = new DataInputStream(cs.getInputStream()); new Thread() { public void run() { System.out.println("开始接收"); while (bConnected) { String talking = ""; try { talking = dis.readUTF(); output.append("\n\r" + "主机" + " : " + talking); if("$%$".equalsIgnoreCase(talking)){ disconnect(); } } catch (IOException e) { e.printStackTrace(); } } // try { // dis.close(); // } catch (IOException e) { // e.printStackTrace(); // } } }.start(); } catch (IOException e1) { e1.printStackTrace(); } } public void actionPerformed(ActionEvent e) { String S = e.getActionCommand(); if ("发送".equalsIgnoreCase(S)) { talking = input.getText().trim(); String snicheng = nicheng.getText().trim(); output.append("\n\r" + snicheng + " : " + talking); input.setText(""); try { dos.writeUTF(snicheng); } catch (IOException e1) { e1.printStackTrace(); } send(); } else if ("进入".equalsIgnoreCase(S)) { connect(); receive(); output.append("进入成功\n 服务器:" + fuwuqi.getText() + "\t端口:" + duankou.getText() + "\t昵称:" + nicheng.getText() + "\n"); buttonopen(); } else if ("退出".equalsIgnoreCase(S)) { disconnect(); } } public static void main(String args[]) { new Desktop(); } } ***********服务器******************************** import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import javax.swing.*; @SuppressWarnings("serial") public class Servicer extends JFrame implements ActionListener { @SuppressWarnings("unused") private class WindowCloser extends WindowAdapter { public void windowClosing(WindowEvent we) { System.exit(0); } } private ServerSocket ss = null; private Socket s; private JPanel p = new JPanel(); private JTextArea output = new JTextArea(); private JTextField input = new JTextField(); private DataOutputStream dos; private DataInputStream dis; private JButton b1 = new JButton("启动"); private JButton b2 = new JButton("退出"); private JButton b3 = new JButton("发送"); private String talking, nicheng; private boolean started = true; private boolean bConnected = false; // UI界面(不需要再修改) Servicer() { p.setLayout(new BorderLayout()); JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); p1.add(b1); b1.addActionListener(this); p1.add(b2); b2.addActionListener(this); b3.addActionListener(this); p2.setLayout(new BorderLayout()); p2.add(input, BorderLayout.CENTER); p2.add(b3, BorderLayout.EAST); p.add(p1, BorderLayout.NORTH); p.add(p2, BorderLayout.SOUTH); p.add(output, BorderLayout.CENTER); b2.setEnabled(false); b1.setEnabled(true); b3.setEnabled(false); input.setEditable(false); output.setEditable(false); this.setTitle("聊天室for服务端"); this.add(p); this.setSize(500, 300); this.setVisible(true); } public void buttonclose() { b1.setEnabled(true); b2.setEnabled(false); b3.setEnabled(false); input.setEditable(false); } public void buttonopen() { b1.setEnabled(false); b2.setEnabled(true); b3.setEnabled(true); input.setEditable(true); } public void disconnect() { started = false; bConnected = false; try { dos.writeUTF("$%$"); dos.close(); dis.close(); s.close(); System.out.println("Servicer dos.close"); ss.close(); System.out.println("Servicer cs.close"); } catch (IOException e) { e.printStackTrace(); } } public void start() { try { ss = new ServerSocket(8888); } catch (IOException e) { e.printStackTrace(); } try { started = true; //while(started){ s = ss.accept(); output.append("新加入,已连接"); buttonopen(); bConnected = true; dos = new DataOutputStream(s.getOutputStream()); dis = new DataInputStream(s.getInputStream()); link(); //} } catch (IOException e1) { e1.printStackTrace(); } } public void send() { talking = input.getText().trim(); try { if(talking == null) { dos.writeUTF(""); } else { dos.writeUTF(talking); } dos.flush(); } catch (IOException e1) { e1.printStackTrace(); } } public void link() { new Thread(){ public void run() { String nicheng = null; try { nicheng = dis.readUTF(); } catch (IOException e1) { output.append("\n\r用户名获取异常"); e1.printStackTrace(); } while (bConnected) { String talking = ""; try { talking = dis.readUTF(); } catch (IOException e) { e.printStackTrace(); } if("$%$".equalsIgnoreCase(talking)){ disconnect(); } output.append("\n\r" + nicheng + " : " + talking); } // try { // dis.close(); // } catch (IOException e) { // e.printStackTrace(); // } } }.start(); } public void actionPerformed(ActionEvent e) { String S = e.getActionCommand(); String takeing = input.getText().toString(); if ("启动".equalsIgnoreCase(S)) { start(); } else if ("退出".equalsIgnoreCase(S)) { disconnect(); output.append("退出成功"); } else if ("发送".equalsIgnoreCase(S)) { send(); output.append("\n\r" + "主机" + " : " + takeing); input.setText(""); } } public static void main(String args[]) { new Servicer(); } }
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方
致 Python 初学者
文章目录1. 前言2. 明确学习目标,不急于求成,不好高骛远3. 在开始学习 Python 之前,你需要做一些准备2.1 Python 的各种发行版2.2 安装 Python2.3 选择一款趁手的开发工具3. 习惯使用IDLE,这是学习python最好的方式4. 严格遵从编码规范5. 代码的运行、调试5. 模块管理5.1 同时安装了py2/py35.2 使用Anaconda,或者通过IDE来安装模
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
日均350000亿接入量,腾讯TubeMQ性能超过Kafka
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100) 【导读】近日,腾讯开源动作不断,相继开源了分布式消息中间件TubeMQ,基于最主流的 OpenJDK8开发的
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
相关热词 基于c#波形控件 c# 十进制转十六进制 对文件aes加密vc# c#读取栈中所有的值 c# rsa256加密 好 学c# 还是c++ c# 和java的差距 c# curl网络框架 c# https证书请求 c# 中崎
立即提问