java 多个JPanel添加到一个JPanel里面出现的问题

我在主窗口类里面添加了JPanel 希望通过点击添加3个已经写好的Panel
if(e.getActionCommand().equals("DES"))
{
desPan = new DesPanel();
jp.add(desPan.desPanel1, BorderLayout.WEST);
jp.add(desPan.desPanel2, BorderLayout.CENTER);
jp.add(desPan.desPanel3, BorderLayout.SOUTH);
jp.validate();
}
图片说明
结果如上 东西都被扭曲了,原本3个Panel添加到JFrame里面是这样的
图片说明

    三个Panel的代码着这么写的,我调试了半天 也没能调整好 怎么解决啊
    desPanel1 = new JPanel();
    desPanel2 = new JPanel();
    desPanel3 = new JPanel();
    jl_des1 = new JLabel("Secret key:");
    jl_des2 = new JLabel("Plain text:");
    jl_des3 = new JLabel("Cipher text");
    jtf_des1 = new JTextField();
//  jtf_des1.setText(null);
    jtf_des2 = new JTextField();
//  jtf_des2.setText(null);
    jtf_des3 = new JTextField();
//  jtf_des3.setText(null);
    button_des1 = new JButton("Encipher");
    button_des2 = new JButton("Decipher");


    desPanel1.setLayout(new GridLayout(3,1));
    desPanel2.setLayout(new GridLayout(3,1));
    desPanel3.setLayout(new GridLayout(1,2));

    desPanel1.add(jl_des1);
    desPanel1.add(jl_des2);
    desPanel1.add(jl_des3);
    desPanel2.add(jtf_des1);
    desPanel2.add(jtf_des2);
    desPanel2.add(jtf_des3);
    desPanel3.add(button_des1);
    desPanel3.add(button_des2);

    desPanel1.setLayout(new GridLayout(3,1));
    desPanel2.setLayout(new GridLayout(3,1));
    desPanel3.setLayout(new GridLayout(1,2));

2个回答

你应该把三个panel加到一个大容器里面 然后在设置布局

谢谢我已经成功了 我本来就是把3个Panel放到两一个Panel里面 这样布局管理器调整很费劲 直接直接设置布局管理为NULL

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java关于JFrame中添加多个JPanel?
如果创建一个JPanel数组,但是每个JPanel都画了一个图形,但是添加到面板容器上,只显示容器最后一个图形,为什么其它都没有显示?
java开发中我设置了一个JPanel里面装了图片作为背景 但是为什么没有显示出来背景图片
此段代码中什么地方出错了?为什么我的ip,h还有rs,drgl这三个地方的背景图片 无法显示或者切换? p4=new JPanel(new BorderLayout()); p2=new JPanel(new CardLayout()); //处理p2,p3,p4 p2_lab1=new JLabel(new ImageIcon("image/21.jpg")); p2_lab2=new JLabel(new ImageIcon("image/22.jpg")); //把以上俩加入到P2中 p2.add(p2_lab1,"0"); p2.add(p2_lab2,"1"); this.cardp3=new CardLayout(); p3=new JPanel(this.cardp3); //先给P3加入一个主界面的卡片 Image zhu_image=null; try { zhu_image = ImageIO.read(new File("image/11.jpg")); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } ImagePanel ip=new ImagePanel(zhu_image); p3.add(ip,"0"); //对P3添加几个JLabel JLabel rs=new JLabel(new ImageIcon("image/renshi.jpg")); p3.add(rs,"1"); JLabel drgl=new JLabel(new ImageIcon("image/dengru.jpg")); p3.add(drgl,"2"); //把p2 p3装入P4中 p4.add(p2,"West"); p4.add(p3,"Center"); //做一个拆分窗口分别存放P1 P4 jsp1=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,p1,p4); //指定左边的面板占多大像素 jsp1.setDividerLocation(120); //把边界线设为没有 jsp1.setDividerSize(0);
java在JPanel面板上画多条直线
A(1,1),B(2,2),C(3,3),D(4,4), 请问,如何能将四个点连接按顺序连接起来。也就是画3条线,我用了JPanel,但是面板上不显示画出的直线,不明白原因。请高手赐教。
JPanel继承问题... 写了一个类,继承自JPanel,但是控件不显示,跪求求各位大牛...
在做一个世界各个国家的时间的一个Demo。写了一个继承自JPanel类的panel,里面简单的设置了一个Logo,国家名字,还有一个按秒跳动时间,现在的问题就是在这个panel上的控件都不显示了,调了好久了也没有找到原因,所以没办法了,特来求助各位大牛们..... 话不多说,直接贴代码: package timerDemo; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.Image; import java.awt.Panel; import java.util.Date; import java.util.GregorianCalendar; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; public class ClockDemo extends Panel implements Runnable{ private JLabel imageLabel; private JLabel localeLabel; private JLabel dataLabel; private JPanel panel; private Thread t; private GregorianCalendar calendar; public ClockDemo(String city,String time){ super(); panel=new JPanel(); imageLabel=new JLabel(); imageLabel.setLabelFor(imageLabel); ImageIcon imageL=new ImageIcon("Z:\\study\\JAVA\\JAVATimer\\watchgif.gif"); imageL.setImage(imageL.getImage().getScaledInstance(50, 50, Image.SCALE_DEFAULT)); imageLabel.setIcon(imageL); imageLabel.setHorizontalAlignment(SwingConstants.CENTER); localeLabel=new JLabel(city,JLabel.CENTER);//城市名 dataLabel=new JLabel(); panel.setLayout(new GridLayout(3,1)); panel.add(imageLabel); panel.add(localeLabel); panel.add(dataLabel); JFrame jf=new JFrame(); jf.getContentPane().add(panel); t=new Thread(this); t.start(); } public void showTime(){ String str=""; str=str+new Date(); dataLabel.setText(str); dataLabel.setHorizontalAlignment(SwingConstants.CENTER); } @Override public void run() { // TODO Auto-generated method stub try { Thread.sleep(1000); showTime(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ``` ```
(swing)用一个JPanel显示本地文件夹下多个图片的问题
现要用swing实现显示出制定文件夹下所有图片 <br /> <br />利用 JButton 触发 在JPanel中显示某一文件夹下的所有图片文件,但是每一次点击JButton时显示的总是第一次输入文件夹目录后点击显示的那些图片(除非此后选择一图片更多的文件夹),总之前一个目录下的图片总是要盖住以后的。 <br /> <br />请问是怎么回事? <br /> <br />public class first extends JFrame implements ActionListener { <br />        Image image; <br />        int new_w; <br />        int new_h; <br />        int framex=400; <br />        int framey=300; <br />        JPanel top = new JPanel(); <br />        JPanel center = new JPanel(); <br />        JTextField name = new JTextField(15); <br />        Container cp = new Container(); <br />        public first() { <br />                super("perfect"); <br />                setDefaultCloseOperation(EXIT_ON_CLOSE); <br />                init(); <br />                setVisible(true); <br />        } <br />        public static void main(String[] args) { <br />                new first(); <br />        } <br />        private void init() { <br />                JPanel top = new JPanel(); <br />          top.add(new JLabel("File :")); <br />          top.add(name); <br />          JButton b = new JButton("Show"); <br />          top.add(b); <br />          cp = getContentPane(); <br />          cp.add(BorderLayout.NORTH, top); <br />          <br />          name.setText("C:\\"); <br />          setSize(new Dimension(framex, framey)); <br />          b.addActionListener(this); <br />          } <br /> <br />        <br />        public void actionPerformed(ActionEvent e) { <br />        <br />         String pURL = "C:\\"; <br />        try { <br />        pURL = name.getDocument().getText(0, name.getDocument().getLength()); <br /> } catch (BadLocationException e1) { <br /> e1.printStackTrace(); <br /> } <br />                                    //得到该制定文件夹下所有图片文件的名称 <br /> ArrayList&lt;string&gt; imga = imgFiles(pURL); <br /> name.setText(pURL); <br />        image = Toolkit.getDefaultToolkit().getImage("C:\\Winter.JPG"); <br />        for(int dd = 0;dd&lt;imga.size();dd++){ &lt;br=""&gt;        } <br /> <br />        center = new Mypanel(pURL,imga); <br />                cp.add(BorderLayout.CENTER,center); <br />                center.validate(); <br /> <br />                getContentPane().validate(); <br />        } <br /> <br />} <br /> <br />class Mypanel extends javax.swing.JPanel { <br /> <br /> private static final long serialVersionUID = 1L; <br /> private Image image; <br /> private Image[] images; <br /> private ArrayList&lt;string&gt; name; <br /> <br /> Mypanel() { <br /> //this.image = Toolkit.getDefaultToolkit().getImage("C:\\Winter.JPG"); <br /> } <br /> <br /> Mypanel(String parentURL,ArrayList&lt;string&gt; imgarray){ <br /> name = imgarray; <br /> images = new Image[imgarray.size()]; <br /> for(int i=0;i&lt;imgarray.size();i++){ &lt;br=""&gt; <br /> System.out.println("imgs "+i+": "+imgarray.get(i)); <br /> if(imgarray.get(i)!=null){ <br /> images[i] = Toolkit.getDefaultToolkit().getImage(parentURL+"\\"+imgarray.get(i)); <br /> System.out.println("URL::"+parentURL+"\\"+imgarray.get(i)); <br /> } <br /> <br /> } <br /> <br /> } <br /> <br /> public void paintComponent(Graphics g) { <br /> <br /> System.out.println("################### Enter paintComponent : "+this.getToolTipText()); <br /> int x = 0; <br /> int y = 0; <br /> for(int i=0;i&lt;images.length;i++){ &lt;br=""&gt; //imgs[i] = Toolkit.getDefaultToolkit().getImage("C:\\"+); <br /> //if(images[]) <br /> //this.paintComponent(g); <br /> if(name.get(i)!=null){ <br /> if(x==0) x=20; <br /> else if(x+90+80&lt;400) x=x+90; <br /> else { <br /> x=20; <br /> y=y+70; <br /> } <br /> System.out.println("@@@@@@@ x:"+x+",y:"+y+"  name = "+name.get(i)+" "); <br /> <br /> g.drawImage(images[i], x, y,80,60, this); <br /> } <br /> } <br /> } <br />} <br /><strong>问题补充:</strong><br />firefly.li <br /> <br />不是因为没有刷新, <br /> <br />怀疑貌似是用了原来的JPanel对象, <br /> <br />可是从代码中找不出点儿头绪 <br /> <br />请指点下吧<br /><strong>问题补充:</strong><br />加上这些,代码就是全的了 <br /> <br />import java.awt.BorderLayout; <br />import java.awt.Container; <br />import java.awt.Dimension; <br />import java.awt.Graphics; <br />import java.awt.Image; <br />import java.awt.Rectangle; <br />import java.awt.Toolkit; <br />import java.awt.event.ActionEvent; <br />import java.awt.event.ActionListener; <br />import java.io.File; <br />import java.util.ArrayList; <br /> <br />import javax.swing.ImageIcon; <br />import javax.swing.JButton; <br />import javax.swing.JFrame; <br />import javax.swing.JLabel; <br />import javax.swing.JPanel; <br />import javax.swing.JTextField; <br />import javax.swing.text.BadLocationException; <br /> <br />谢谢!<br /><strong>问题补充:</strong><br />package nimgs; <br /> <br />import java.awt.BorderLayout; <br />import java.awt.Container; <br />import java.awt.Dimension; <br />import java.awt.Graphics; <br />import java.awt.Image; <br />import java.awt.Rectangle; <br />import java.awt.Toolkit; <br />import java.awt.event.ActionEvent; <br />import java.awt.event.ActionListener; <br />import java.io.File; <br />import java.util.ArrayList; <br /> <br />import javax.swing.ImageIcon; <br />import javax.swing.JButton; <br />import javax.swing.JFrame; <br />import javax.swing.JLabel; <br />import javax.swing.JPanel; <br />import javax.swing.JTextField; <br />import javax.swing.text.BadLocationException; <br />public class first extends JFrame implements ActionListener { <br />        Image image; <br />        int new_w; <br />        int new_h; <br />        int framex=400; <br />        int framey=700; <br />        //ssJButton hh = new JButton(); <br />        <br />        JPanel top = new JPanel(); <br />        <br />        JPanel center = new JPanel(); <br />        <br />        JTextField name = new JTextField(15); <br />        <br />        Container cp = new Container(); <br />  <br />      <br />        public first() { <br />                super("perfect"); <br />                setDefaultCloseOperation(EXIT_ON_CLOSE); <br />                init(); <br />                setVisible(true); <br />        } <br />        public static void main(String[] args) { <br />                new first(); <br />        } <br />        private void init() { <br />                //hh.setBounds(new Rectangle(165, 225, 91, 37)); <br />                //hh.setText("picture "); <br />                JPanel top = new JPanel(); <br />          top.add(new JLabel("File :")); <br />          top.add(name); <br />          JButton b = new JButton("Show"); <br />          top.add(b); <br />          //b.addActionListener(nameListener); <br />          <br />          <br />          if(center!=null) <br />  cp.remove(center); <br />          cp = getContentPane(); <br />          cp.add(BorderLayout.NORTH, top); <br />          <br /> <br />          <br />          //cp.add(BorderLayout.CENTER,center); <br />          //cp.add(new JScrollPane()); <br />          <br />          name.setText("C:\\"); <br />          System.out.println("init before ActionListioned!!!!!!!!!!!!!!"); <br />          b.addActionListener(this); <br />          System.out.println("init after  ActionListioned!!!!!!!!!!!!!!"); <br />          <br />          //center = new Mypanel(pURL,imga); <br /> cp.add(BorderLayout.CENTER,center); <br /> //center.validate(); <br /> cp.validate(); <br />             <br />               <br />                //getContentPane().setLayout(null); <br />                setSize(new Dimension(framex, framey)); <br /> <br />                //  getContentPane().add(hh); <br />                //cp.add(BorderLayout.SOUTH, panel); <br />                //cp.setVisible(true); <br />                //top.add(new JLabel("File :")); <br />                //getContentPane().BorderLayout(top); <br />        } <br /> <br />        <br />        public void actionPerformed(ActionEvent e) { <br />        <br />        center.removeAll(); <br /> <br />        String pURL = "C:\\"; <br />        try { <br />        pURL = name.getDocument().getText(0, name.getDocument().getLength()); <br />System.out.println(pURL); <br /> } catch (BadLocationException e1) { <br /> e1.printStackTrace(); <br /> } <br /> ArrayList&lt;string&gt; imga = imgFiles(pURL); <br /> name.setText(pURL); <br />                //ImageIcon img = new ImageIcon("Winter.jpg"); <br />                //Toolkit.getDefaultToolkit().getImage("C:\\Winter.JPG"); <br />                //image = img.getImage(); <br />        image = Toolkit.getDefaultToolkit().getImage("C:\\Winter.JPG"); <br />        for(int dd = 0;dd&lt;imga.size();dd++){ &lt;br=""&gt;System.out.println("imagename~~~:"+imga.get(dd)); <br />        } <br /> <br />                //Mypanel panel = new Mypanel(pURL,imga); <br />        center = new Mypanel(pURL,imga); <br />                <br />                //**************************** <br />                //center = null; <br />                //center = panel; <br /> <br />                //panel.setBounds(new Rectangle(1, 50, 300, 700)); <br />                //getContentPane().add(panel); <br />                <br />                //center.repaint(); <br />                <br />                //cp.add(BorderLayout.CENTER,null); <br />        //        cp.add(BorderLayout.CENTER,center); <br />        //        center.validate(); <br /> <br />         //       getContentPane().validate(); <br />        if(center!=null) <br />        cp.remove(center); <br />        center = new Mypanel(pURL,imga); <br />        cp.add(BorderLayout.CENTER,center); <br />        //center.validate(); <br />        cp.validate(); <br />                //getContentPane().repaint(); <br />                //getContentPane().setVisible(true); <br />                //panel.setVisible(true); <br />//        try { <br />//        Thread.sleep(1000); <br />//        } catch (InterruptedException e1) { <br />//        System.out.println(e1); <br />//        } <br />                //getContentPane().repaint(); <br />        } <br /> <br />        <br />    @SuppressWarnings("unchecked") <br /> private ArrayList&lt;string&gt; imgFiles(String parentURL){ <br />    String houzhui = new String(); <br />    File file = new File(parentURL); <br />    //File file = new File("C:\\"); <br />    int o = 0; <br />    ArrayList&lt;string&gt; imgarr = new ArrayList(); <br />    //String imgs[] = new String[5]; <br />    String ss[] = file.list(); <br />    //int o=0; <br />System.out.println("ss.length = "+ss.length); <br />    for(int i=0;i&lt;ss.length;i++){ &lt;br=""&gt;    //System.out.println("file:"+ss[i]+" @@ is File:"+(new File("C:\\"+ss[i])).isFile()); <br />    <br />    if(ss[i].indexOf(".")&gt;0 &amp;&amp; (new File(file,ss[i])).isFile()){ <br />    houzhui = ss[i].substring(ss[i].lastIndexOf(".")+1,ss[i].length()).toLowerCase(); <br />    //System.out.println(houzhui); <br />    if(houzhui.equals("jpg") <br />    ||houzhui.equals("gif") <br />    ||houzhui.equals("png") <br />    //||houzhui.equals("bmp") <br />    ||houzhui.equals("jpeg") <br />    ){ <br />    o++; <br />//System.out.println("imgarr:"+o+"  "+ss[i]); <br />    //imgs[o] = ss[i]; <br /> imgarr.add(ss[i]); <br />    //System.out.println("imgs:"+imgs[o]); <br />    //o++; <br />    //deitel = getImage(getDocumentBase(), ss[i]); <br />    //int width = deitel.getWidth(this); <br />    //int heigh = deitel.getHeight(this); <br />    //System.out.println("----------------------"+ss[i]+"  "+o+" width:"+width+" heigh:"+heigh); <br />    //g.drawImage(deitel, 1+(100*o), 30, 80, 60, this); <br />    //g.setPaintMode(); <br />    //g.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer) <br />    //g.drawImage(deitel, 150, 30, width / 8, heigh / 8, this); <br />    } <br />    } <br />    } <br />    <br />    return imgarr; <br />    } <br />        <br />} <br /> <br />class Mypanel extends javax.swing.JPanel { <br /> <br /> private static final long serialVersionUID = 1L; <br /> private Image image; <br /> private Image[] images; <br /> private ArrayList&lt;string&gt; name; <br /> <br /> Mypanel() { <br /> //this.image = Toolkit.getDefaultToolkit().getImage("C:\\Winter.JPG"); <br /> } <br /> <br /> Mypanel(String parentURL,ArrayList&lt;string&gt; imgarray){ <br /> //System.out.println("$$$$$$$$$$$$$"); <br /> name = imgarray; <br /> images = new Image[imgarray.size()]; <br /> //System.out.println("imgarray.size(): "+imgarray.size()); <br /> for(int i=0;i&lt;imgarray.size();i++){ &lt;br=""&gt; <br /> System.out.println("imgs "+i+": "+imgarray.get(i)); <br /> if(imgarray.get(i)!=null){ <br /> images[i] = Toolkit.getDefaultToolkit().getImage(parentURL+"\\"+imgarray.get(i)); <br /> System.out.println("URL::"+parentURL+"\\"+imgarray.get(i)); <br /> } <br /> <br /> } <br /> <br /> } <br /> <br /> public void paintComponent(Graphics g1) { <br /> <br /> System.out.println("################### Enter paintComponent : "+this.getToolTipText()); <br /> int x = 0; <br /> int y = 0; <br /> Graphics g = (Graphics)g1; <br /> for(int i=0;i&lt;images.length;i++){ &lt;br=""&gt; //imgs[i] = Toolkit.getDefaultToolkit().getImage("C:\\"+); <br /> //if(images[]) <br /> //this.paintComponent(g); <br /> if(name.get(i)!=null){ <br /> if(x==0) x=20; <br /> else if(x+90+80&lt;400) x=x+90; <br /> else { <br /> x=20; <br /> y=y+70; <br /> } <br /> System.out.println("@@@@@@@ x:"+x+",y:"+y+"  name = "+name.get(i)+" "); <br /> <br /> g.drawImage(images[i], x, y,80,60, this); <br /> } <br /> } <br /> <br /> g=null; <br /> <br /> } <br />} <br /> <br /><br /><strong>问题补充:</strong><br />上面才是全部代码   谢谢!
java swing 多个JLabel和多个JTextField的对齐
java swing 多个JLabel和多个JTextField的对齐,如下图所示,把JLabel都放在一个垂直的box1中,把JTextField放在另一个垂直的box2中,然后把box1和box2放在一个水平的boxA中。可是就如下图所示,文字和文本框对不齐。“初始信息素”、“迭代次数”、“蚂蚁数量”都太下了,“期望因子beta”和“信息素残留参数rho”都太上了。 [img]http://dl2.iteye.com/upload/attachment/0099/3919/69f853cd-e296-34f5-b627-2e8aa7ecf201.png[/img] 可是如果把一行中的JLabel和JTextField添加在一个JPanel,然后再把所有的JPanel再添加在一个垂直的Box中的话,这样文本框JTextField之间就会对不齐,文字也对不齐。该怎么样处理呢?
关于Jpanel, JScrollPane ,Jtable嵌套使用的问题
如题,我先建了一个继承了JPanel的 ListAddMainPanel。在这个ListAddMainPanel中,我嵌套了一个JScrollPane类的panel_1,在这个JScrollPane里,我放置了一个Jtable,Jtable 使用了DefaultTableModel。(可能看着有点晕,其实很简单,就是下面的那个图片) 使用时,我是在JFrame里的contentPane里先新建一个底层Panel,然后调用这个ListAddMainPanel的构造函数。想要给Table里加数据时,调用这个ListAddMainPanel里之前写好的fulfillTable函数 菜鸟觉得这个架构理论上应该行得通,但是问题来了,无论我使用什么样的方法,比如addRow();addColumn();setColumnIdentifiers(); 测试显示没有问题,数据也传进去了,程序也没报错,可他的界面就是没有出现表格_(:зゝ∠)_ 换了很多种方法,都没奏效,于是默默来求大佬帮助_(:зゝ∠)_ ![图片说明](https://img-ask.csdn.net/upload/2 ``` package w.teacher; import java.awt.Dimension; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JButton; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; import javax.swing.JTextField; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JComboBox; public class ListAddMainPanel extends JPanel { // private JTable table1,table2,table3,table4,table5; public JLabel timeLabel; public JTable table; public DefaultTableModel tableModel; public JTextField textField; public JComboBox<String> gradeBox; public JButton addButton,importButton; /** * Create the panel. */ public ListAddMainPanel() { setLayout(null); setPreferredSize(new Dimension(856, 417)); setOpaque(false); JScrollPane panel_1 = new JScrollPane(table); panel_1.setBounds(14, 72, 493, 319); panel_1.setLayout(null); panel_1.setVisible(true); add(panel_1); //Table table = new JTable(tableModel); // tableModel = (DefaultTableModel)table.getModel(); // table.setPreferredScrollableViewportSize(new Dimension(493,319));//设置table大小 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//关闭表格列自动调整,此时水平滚动条可见 // table.setBounds(0, 0, 493, 319); panel_1.add(table);//原位置Table代码 table.setVisible(true); // tableModel.setColumnIdentifiers(name1111); panel_1.setViewportView(table);//原位置Table代码 } public void fulfillTable(String[] title,String[][] data) { // for(int i = 0;i<100;i++){ // for(int j = 0;j<7;j++) // System.out.println(data[i][j]); // } // tableModel = new DefaultTableModel(data, name); // table = new JTable(tableModel); if(title!=null) { for(int i = 0;i<title.length;i++) { tableModel.addColumn(title[i]); } } for(int i = 0;data[i+1][0]!=null;i++) { String[] mString = new String[data[i].length]; for(int y = 0;y<7;y++) { mString[y] = data[i][y]; System.out.println(mString[y]); } tableModel.addRow(mString); // System.out.println(mString); } } ```
Java中用Socket和多线程制作聊天窗口中遇到的问题
最近在学习Socket网络连接,在制作聊天服务器时采用了多线程的方式。下面是代码: 服务器 ``` package socketConnect; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.Iterator; public class SimpleChatServer { ArrayList<PrintWriter> clientOutputStreams; public class ClientHandler implements Runnable { BufferedReader reader; Socket sock; public ClientHandler(Socket clientSocket) { // TODO Auto-generated constructor stub sock = clientSocket; try { InputStreamReader isReader = new InputStreamReader(clientSocket.getInputStream()); reader = new BufferedReader(isReader); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void run() { // TODO Auto-generated method stub String message; System.out.println("服务端线程在跑"); try { while ((message = reader.readLine()) != null) { System.out.println("Sread: " + message); tellEveryone(message); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void go() { clientOutputStreams = new ArrayList<>(); try { ServerSocket serverSock = new ServerSocket(8080); while (true) { Socket clientSocket = serverSock.accept(); PrintWriter writer = new PrintWriter(clientSocket.getOutputStream()); clientOutputStreams.add(writer); Thread t = new Thread(new ClientHandler(clientSocket)); t.start(); System.out.println("got a connection"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void tellEveryone(String message) { Iterator<PrintWriter> it = clientOutputStreams.iterator(); while (it.hasNext()) { PrintWriter writer = (PrintWriter)it.next(); writer.println(message); writer.flush(); } } public static void main(String[] args) { new SimpleChatServer().go(); } } ``` 客户端 ``` package socketConnect; import java.awt.BorderLayout; 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.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class ClientA { JTextField outgoing; JTextArea incoming = new JTextArea(15, 50); PrintWriter pw; BufferedReader br; Socket socket; public void go() { JFrame frame = new JFrame("Chat Client"); JPanel panel = new JPanel(); incoming.setLineWrap(true); incoming.setWrapStyleWord(true); incoming.setEditable(false); JScrollPane scrollPane = new JScrollPane(incoming); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); outgoing = new JTextField(20); JButton button = new JButton("Send"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub String text = getClass().getEnclosingClass().getSimpleName() + ": " + outgoing.getText(); try { pw.println(text); pw.flush(); } catch (Exception e2) { // TODO: handle exception } outgoing.setText(""); outgoing.requestFocus(); } }); panel.add(outgoing); panel.add(button); setUpNetWorking(); Thread readerThread = new Thread(new IncomingReader()); readerThread.start(); frame.getContentPane().add(BorderLayout.NORTH, scrollPane); frame.getContentPane().add(BorderLayout.CENTER, panel); frame.setSize(400, 500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true);; } private void setUpNetWorking() { try { socket = new Socket("127.0.0.1", 8080); pw = new PrintWriter(socket.getOutputStream()); InputStreamReader isReader = new InputStreamReader(socket.getInputStream()); br = new BufferedReader(isReader); System.out.println("networking established"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { System.out.println("程序运行开始"); new ClientA().go(); } public class IncomingReader implements Runnable { @Override public void run() { // TODO Auto-generated method stub System.out.println("线程开始跑了"); String message; try { while ((message = br.readLine()) != null) { System.out.println("Aread: " + message); incoming.append(message + "\n"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("线程跑完了"); } } } ``` 以上是代码,运行不报错,可以正常实现聊天。 但是想知道一些细节的原理: 1. 先运行服务端,跑起来后控制台无输出。然后运行客户端,控制台首先会闪现一下以下的输出(是闪现的,特别快,所以我截不了图,手打的): 程序运行开始 networking established 线程开始跑了。 这应该是是客户端运行时的输出,然后是这样的输出: ![图片说明](https://img-ask.csdn.net/upload/202002/02/1580646630_513143.jpg) 所以当服务端建立接口之后等待客户端的请求,客户端请求该端口之后,是整个客户端程序运行了一遍,然后服务器的代码才会接着往下运行吗?但是如果整个客户端程序运行了一遍,为什么控制台不输出“线程跑完了”?还是说客户端监听服务器信息的那个线程一直在独立空间中运行着? 请大神帮我解答一下服务器和客户端运行时代码的运行过程以及客户端子线程为什么跑不完? 2. 当我向聊天框中输入信息时: ![图片说明](https://img-ask.csdn.net/upload/202002/02/1580647157_870751.jpg) 点击send,会出现以下结果: ![图片说明](https://img-ask.csdn.net/upload/202002/02/1580647257_332283.jpg) 所以为什么整个客户端又重新运行了一次????我只是点击了send触发了监听器监听的事件,事件中flush了输出流的内容,为啥整个客户端好像重新run了一次??另外,这个子线程是一直监听服务器的信息吗?服务器没有新的消息它也不结束,就一直等待吗? 请大神解答一下,我对多线程也是刚刚接触,而且有点强迫症,想搞清楚一切不理解的东西。。
java实现实验室教师远程学生桌面把jframe改成jpanel
网上找的代码如下 现在是一个一个窗口显示一个桌面 我想把他变成panel然后放在主界面那里(主界面需要监控多个学生的桌面)。。。可是渣渣不会改 package ServerWhat; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Toolkit; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.zip.ZipInputStream; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; public class RemoteMonitored extends JFrame { private static final long serialVersionUID = 1L; Dimension screenSize; public RemoteMonitored () { super(); screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setSize(800, 640); Screen p = new Screen(); Container c = this.getContentPane(); c.setLayout(new BorderLayout()); c.add(p, SwingConstants.CENTER); new Thread(p).start(); SwingUtilities.invokeLater(new Runnable(){ public void run() { setVisible(true); }}); } public static void main(String[] args) { new RemoteMonitored (); } class Screen extends JPanel implements Runnable { private static final long serialVersionUID = 1L; private Image cimage; public void run() { ServerSocket ss = null; try { ss = new ServerSocket(5001);// 探听5001端口的连接 while (true) { Socket s = null; try { s = ss.accept(); ZipInputStream zis = new ZipInputStream(s .getInputStream()); zis.getNextEntry(); cimage = ImageIO.read(zis);// 把ZIP流转换为图片 repaint(); } catch (Exception e) { e.printStackTrace(); } finally { if (s != null) { try { s.close(); } catch (IOException e) { e.printStackTrace(); } } } } } catch (Exception e) { } finally { if (ss != null) { try { ss.close(); } catch (IOException e) { e.printStackTrace(); } } } } public Screen() { super(); this.setLayout(null); } public void paint(Graphics g) { super.paint(g); Graphics2D g2 = (Graphics2D) g; g2.drawImage(cimage, 0, 0, null); } } }
java 的swing的一个问题,有关滚动条的 jscrollpane
我在一个面板上面放上了许多jpanel,多到屏幕放不下,就是多余的部分显示不了, jframe和jpanel都试过了,然后我想到用一个滚动条可以使所有的内容都可以看到, 但是我使用了jscrollpane和jscrollbar都没有做好,结果是窗体的内容全部都看不见了, ,那这个滚动条该怎么加入,用哪个,
java的swing程序设计,为窗体添加多个复选框组件
本人在练习java的swing程序设计,想为窗体添加多个复选框组件,目标是达到下面图片的效果 ![CSDN移动问答][1] 我的源代码是这样的: import java.awt.BorderLayout; import java.awt.Container; 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.JScrollPane; import javax.swing.JTextArea; import javax.swing.WindowConstants; public class CheckBoxTest extends JFrame { private static final long serialVersionUID = -5028523145642314067L; public static void main(String[] args) { new CheckBoxTest(); } public CheckBoxTest() { Container c = getContentPane(); JPanel panel1 = new JPanel(); JPanel panel2 = new JPanel(); final JTextArea jt = new JTextArea(20, 50); c.setLayout(new BorderLayout()); c.add(panel1, BorderLayout.NORTH); JScrollPane scrollPane = new JScrollPane(jt); panel1.add(scrollPane); c.add(panel2, BorderLayout.SOUTH); for (int i = 0; i < 3; i++) { final JButton jb = new JButton("button" + i); jb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根 if (jb.isSelected()) jt.append("复选框i被选中\n"); } }); panel2.add(jb); } setSize(200, 200); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } } 可是我运行后的结果却是这样的: ![CSDN移动问答][2] [1]: http://img.my.csdn.net/uploads/201408/07/1407341831_8466.PNG [2]: http://img.my.csdn.net/uploads/201408/07/1407342169_9151.PNG 怎么点击按钮都没有反应。。。 本人自学java,希望有大神能帮帮忙。。。
JAVA中的paint()方法和paintComponent(), paintBorder(), paintChildren()怎么用
现在在学习JAVA swing(虽然别人都说过时了),我想做一个小游戏。JAVA中的paint()方法和paintComponent(), paintBorder(), paintChildren()改怎么用?我看很多介绍都说不要直接重写paint( )方法。现在要在JPanel 上绘图,是用某个类继承JPanel再重写paint方法还是怎么?
JAVA组件重画问题,怎样让特定的组件重画而不影响其他的组件
![图片说明](https://img-ask.csdn.net/upload/201612/18/1482070741_147092.png) 我的窗口组件大致是这样构成的,现在的情况是JPanel2-2所重画的动画显示完全,但是JButton同时也在不停的重画,导致JButton按下的效果显示不出来(一按下就重画恢复),想问一下怎么改变就能让多个组件分别重画各自组件互不影响?
java多线程的程序设计
阅读和修改一个球的代码程序,完成多球的功能: Write a program that bounces balls inside a panel.The ball should begin moving with a mousePressed event. When user clocks the mouse, a ball should be added. When balls hits the edge of the panel,it should bounde off the edge and continue in the opposite direction. The ball location should be updated using Runnable. GUI as follows:![图片说明](https://img-ask.csdn.net/upload/201805/22/1526957953_416827.png) 程序如下: import java.util.Random; public class Ball implements Runnable { private int x; // horizontal position of ball private int y; // vertical position of ball private int dx; // change in horizontal position of ball private int dy; // change in vertical position of ball private final int MAX_X = 200; // horizontal edge of JPanel private final int MAX_Y = 200; // vertical edge of JPanel private static final Random generator = new Random(); public Ball(int xPos, int yPos) { dx = generator.nextInt(5) + 1; // change in x (1-5 pixels) dy = generator.nextInt(5) + 1; // change in y (1-5 pixels) x = xPos; // set ball to horizontal position of mouse press y = yPos; // set ball to vertical position of mouse press } // bounces ball perpetually until window is closed public void run() { while (true) {// infinite loop { try { Thread.sleep(20); // sleep for 20 milliseconds } // process InterruptedException during sleep catch (InterruptedException exception) { exception.printStackTrace(); } x += dx; // determine new x-position y += dy; // determine new y-position // if bounce off top or bottom of JPanel if (y <= 0 || y >= MAX_Y - 10) { dy = -dy; // reverse velocity in y direction } // if bounce off left or right of JPanel if (x <= 0 || x >= MAX_X - 10) { dx = -dx; // reverse velocity in x direction } } } // get horizontal position of ball public int getX() { return x; // return x value } // get vertical position of ball public int getY() { return y; // return y value } } import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseAdapter; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.JPanel; import javax.swing.JFrame; public class BallPanel extends JPanel { private Ball blueBall; // bouncing ball private ExecutorService threadExecutor; // for running Ball runnable private JFrame parentWindow; // parent window of JPanel private final int MAX_X = 200; // horizontal edge of JPanel private final int MAX_Y = 200; // vertical edge of JPanel public BallPanel(JFrame window) { parentWindow = window; // set parent window of JPanel // create ExecutorService for running ball runnable threadExecutor = Executors.newCachedThreadPool(); // anonymous inner class handles mouse events this.addMouseListener( new MouseAdapter() { public void mousePressed(MouseEvent event) { createBall(event); // delegate call to ball starter RepaintTimer timer = new RepaintTimer(parentWindow); threadExecutor.execute(timer); } } ); } // create a ball if no ball exists and set it in motion private void createBall(MouseEvent event) { if (blueBall == null) {// if no ball exists { int x = event.getX(); // get x position of mouse press int y = event.getY(); // get y position of mouse press blueBall = new Ball(x, y); // create new ball threadExecutor.execute(blueBall); // set ball in motion } } // return minimum size of animation public Dimension getMinimumSize() { return getPreferredSize(); } // return preferred size of animation public Dimension getPreferredSize() { return new Dimension(MAX_X, MAX_Y); } // draw ball at current position public void paintComponent(Graphics g) { super.paintComponent(g); if (blueBall != null) {// if ball exists { g.setColor(Color.blue); // set color to blue g.fillOval(blueBall.getX(), blueBall.getY(), 10, 10); // draws } } } import javax.swing.JFrame; public class BouncingBall extends JFrame { private final BallPanel ballCanvas; // JPanel in which ball bounces public BouncingBall() { ballCanvas = new BallPanel(this); // create new BallPanel add(ballCanvas); // add BallPanel to JFrame pack(); // make window just large enough for its GUI setVisible(true); // show window } public static void main(String args[]) { BouncingBall application = new BouncingBall(); application.setDefaultCloseOperation(EXIT_ON_CLOSE); } } import javax.swing.JFrame; public class RepaintTimer implements Runnable { private final JFrame repaintComponent; public RepaintTimer(JFrame frame) { // specify component to be repainted repaintComponent = frame; } public void run() { while (true) { try { Thread.sleep(20); } catch (InterruptedException ex) { ex.printStackTrace(); } repaintComponent.repaint(); // repaint the component } } }
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网络编程服务器多线程接受套接字,如何能使服务器的静态常量,与客户端的数据进行同步?
服务器Server 客户端CLient Server静态常量num 创建服务器,ServerSocket的端口号为8000,连接套接字。 每创建一个客户端,客户端就创建一个Socket,端口号为8000,与服务器进行连接,与此同时,客户端新建ServerSocket,端口号为3000+Server.num,连接套接字。 服务器与客户端连接后,服务器新建子线程Handler。 子线程Handler,新建ServerSocket,端口号为2000+Server.num,连接套接字。 每当有一个子线程创建,主线程都会加入一个子线程创建的对话界面(显示框,输入框,发送按钮)的选项卡 每当创建一个客户端,客户端都会创建一个对话界面 点击发送时,Hanlder会创建Socket,端口号为3000+Server.num。客户端会创建Socket,端口号为2000+Server.num 这是前提,现在我运行程序,但是当我每当创建一个客户端时,Server.num都不会改变,不知道怎么回事,急求大神解答,感激不尽! 以下是源代码,这里我讲Server.num抽离出去单独做成一个类NUM,每次Handler创建后,调用该类的增加函数numAdd(): 服务器代码: package NewPackage; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; public class Server { private ServerSocket serverSocket; private int PORT = 8000; private Thread workThread; private static MyServer server; public static ArrayList<Socket> solist = new ArrayList<Socket>(); public static ArrayList<MyClient> ctlist = new ArrayList<MyClient>(); public Server() throws Exception { serverSocket = new ServerSocket(PORT); } public void service() { while (true) { Socket socket = null; try { String s; int num = NUM.num; NUM.numadd(); socket = serverSocket.accept(); System.out.println(num + 2000); workThread = new Thread(new Handler(num + 2000, MyServer.jp)); workThread.start(); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String args[]) throws Exception { server = new MyServer(); server.CreateGUI(); new Server().service(); } } 服务器的界面代码: package NewPackage; import java.awt.BorderLayout; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.OutputStream; import java.io.PrintStream; import java.net.Socket; import java.util.ArrayList; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; public class MyServer extends JFrame { private static final long serialVersionUID = 1L; static JTextArea contentjta; static JScrollPane contentscroll; static JTextArea inputjta; static JScrollPane inputscroll; static JButton button; static JPanel jpanel; static JTabbedPane jp; MyServer() { super("Server Window"); } void CreateGUI() { jp = new JTabbedPane(); this.add(jp, BorderLayout.CENTER); // 将选项卡窗体添加到 主窗体上去 this.setSize(400, 400); this.setLocation(400, 200); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } 子线程Handler package NewPackage; import java.awt.BorderLayout; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JButton; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; public class Handler implements Runnable, ActionListener { private Socket socket; private PrintWriter pw; private int order; private ServerSocket svs; private MyClient client; static JTextArea contentjta; static JScrollPane contentscroll; static JTextArea inputjta; static JScrollPane inputscroll; static JButton button; static JPanel jpanel; static JTabbedPane jp; private BufferedReader br; public Handler(int n, JTabbedPane jp) { try { this.jp = jp; // this.socket = socket; // System.out.println("handler" + socket.getLocalPort()); order = n ; // JOptionPane.showInputDialog(this, order); System.out.println("Handler" + order); svs = new ServerSocket(order + 1000); createTab(); } catch (Exception e) { e.printStackTrace(); } } private PrintWriter getWriter(Socket socket) throws IOException { OutputStream socketOut = socket.getOutputStream(); return new PrintWriter(socketOut, true); } private BufferedReader getReader(Socket socket) throws IOException { InputStream socketln = socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketln)); } void createTab() { JPanel chat = new JPanel(new BorderLayout()); contentjta = new JTextArea(10, 30); contentjta.setTabSize(4); contentjta.setFont(new Font("楷体", Font.BOLD, 16)); contentjta.setEditable(false); inputjta = new JTextArea(10, 30); inputjta.setTabSize(4); inputjta.setFont(new Font("楷体", Font.BOLD, 16)); inputjta.setEditable(true); contentscroll = new JScrollPane(contentjta); contentscroll .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); contentscroll .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); inputscroll = new JScrollPane(inputjta); inputscroll .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); inputscroll .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); jpanel = new JPanel(); button = new JButton("发送"); button.addActionListener(this); jpanel.setLayout(new GridLayout(1, 1)); jpanel.add(button); chat.add(contentscroll, BorderLayout.NORTH); chat.add(inputscroll, BorderLayout.CENTER); chat.add(jpanel, BorderLayout.SOUTH); jp.add("aa", chat); jp.setFont(new Font("宋体", Font.BOLD, 20)); } public void run() { try { // 接受信息 while (true) { Socket socket = svs.accept(); br = getReader(socket); pw = getWriter(socket); String msg = null; String s = ""; while ((msg = br.readLine()) != null) { s += msg; if ((msg.equals("bye"))) break; } contentjta.setText(s); } } catch (Exception e) { e.printStackTrace(); } } @Override public void actionPerformed(ActionEvent e) { Object o = e.getSource(); if (o == button) { try { Socket so = new Socket("localhost", order); OutputStream out = so.getOutputStream(); PrintStream pout = new PrintStream(out); pout.print(inputjta.getText()); inputjta.setText(""); out.flush(); out.close(); } catch (Exception ex) { ex.printStackTrace(); } } } }
java如何停止当前正在运行的线程,新手求解答
最近想做一个无线数据监控服务端,用java做的,面板Jframe设置了一个Jpanel,我称这个为Jpanel 1 ,在Jpanel 1中我定义了一个多选JCheckbox,有四种监控方式可选:Bluetooth,Wifi,GPRS,Zigbee。还定义了一个JButton,分为开始ON,结束OFF,然后在JPanel 1中定义了JPanel 2,JPanel 2 中我定义了JScrollPane,scrollAndSetCursor用于实现滚动以及光标相关效果,程序运行的大致过程是这样的,我先选择监控方法,(方法是多选的,我想能够同步实现这几个方法),然后点击ON按钮就开始运行服务器程序了, **重点来了** , **我现在的问题是** ,停止按钮OFF不知道怎么设置方法能够让程序停止当前的线程,我想实现的是点击OFF后,当前的监控方式运行全部停止,(就跟刚开始巡行这个程序一样,可以重新开始选择监控方式,在重新点击ON又可以重新运行),现在就是不知道怎么在jbArray[1](ON按钮的监控事件)中定义,感觉自己写的jbArray[0](ON按钮)也有问题。(我其实是想实现这四种方法可以同步运行,互不干扰,多线程运行)希望各位哥哥姐姐帮帮忙,帮我改一改jbArray[0](按钮的监听事件)以及实现jbArray[1](OFF结束当前监控方式线程事件),谢谢各位了,代码稍微有点长,我全贴上来了,辛苦各位了 package SystemTray; import java.awt.AWTException; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Menu; import java.awt.MenuItem; import java.awt.PopupMenu; import java.awt.Rectangle; import java.awt.SystemTray; import java.awt.Toolkit; import java.awt.TrayIcon; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.Timer; import java.util.TimerTask; import javax.microedition.io.StreamConnection; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextArea; import BluetoothChatServer.*; import GPRSChatServer.*; import WifiChatServer.*; import ZigbeeChatServer.*; public class SystemTrayDemo extends JFrame { protected JTextArea ta = new JTextArea(20,42); protected Timer timer = new Timer(); protected boolean jbarry = false; protected TrayIcon trayIcon = null; protected SystemTrayDemo(){ this.setTitle("Data monitoring server"); TrayInit(); WinInit(); //取得当前屏幕的宽度和高度 int width=Toolkit.getDefaultToolkit().getScreenSize().width; int height=Toolkit.getDefaultToolkit().getScreenSize().height; //设置窗体大小 this.setSize(610, 470); //设置窗体初始显示的位置 this.setLocation((width-610)/2, (height-470)/2); this.setResizable(false);//设置窗体不可调整大小 //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭方式,关闭窗体时同时结束程序 final JPanel jp1 = new JPanel(); jp1.setLayout(null);//不设置的话是无法设置jp2的大小。等同于窗口的大小。 JPanel jp2=new JPanel(); jp2.setBounds(110,20,480,390); //jp2.setBounds(new Rectangle(110,15,450,350));//设置jp2的左边距、上边距、长度、高度,在jp1没设置setLayout(null);是无效的 //jp2.setBackground(Color.gray);//设置框体的背景色 //jp2.setBorder(BorderFactory.createEtchedBorder(Color.black, Color.BLUE)); //设置框体的边框 final JScrollPane jsp = new JScrollPane(ta); jp2.add(jsp,BorderLayout.CENTER); jp1.add(jp2); /*ta.setText("Start.....\n"); TimerTask task = new TimerTask(){ public void run(){ ta.append("Time: " + (System.currentTimeMillis() / 1000) + "\n"); scrollAndSetCursor(); } }; time.schedule(task, 0, 1000);*/ //super(); //enableEvents(AWTEvent.WINDOW_EVENT_MASK); //创建标签数组 JLabel[] jlArray = {new JLabel("Switch"),new JLabel("Mode")}; //创建复选框数组 final JCheckBox[] jcbArray = {new JCheckBox("Bluetooth",true),new JCheckBox("Wifi"),new JCheckBox("GPRS"), new JCheckBox("Zigbee")}; //创建按钮数组 final JButton[] jbArray = {new JButton("ON"),new JButton("OFF")}; //设置布局管理器 for(int i=0;i<4;i++){ //设置复选按钮的大小位置 jcbArray[i].setBounds(10,185+i*30,80,30); //将复选按钮添加到JPanel中 jp1.add(jcbArray[i]); //设置标签与普通按钮的大小位置 if(i>1){ continue; } //continue后的语句不在执行。。 jlArray[i].setBounds(30,20+i*140,80,30); jbArray[i].setBounds(10,50+i*45,80,30); //将标签与普通按钮添加到JPanel中 jp1.add(jlArray[i]); jp1.add(jbArray[i]); } this.add(jp1); //为普通按钮注册动作事件监听器。 //开始按钮 **感觉这地方有问题,如何修改?????** jbArray[0].addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { jbArray[0].setEnabled(jbarry); int result= JOptionPane.showConfirmDialog(null,"Start monitoring program now?","Message",JOptionPane.YES_NO_OPTION); if(result==0){ //是 StringBuffer temp0 = new StringBuffer(); for(int i = 0;i<4;i++){ if(jcbArray[i].isSelected()){ String tmpstr; tmpstr = jcbArray[i].getText()+" monitoring method "; ta.append(tmpstr + "\n"); temp0.append(tmpstr); } } if(temp0.length()==0){ JOptionPane.showMessageDialog(null,"The monitoring method can't be empty!","Message",JOptionPane.WARNING_MESSAGE); jbArray[0].setEnabled(!jbarry); } //蓝牙线程 Thread Bluetooth = new Thread(){ public void run() { if(jcbArray[0].isSelected()){ new BluetoothRemoteServer(); } } }; //Bluetooth.setName("Bluetooth"); //String name0 = Bluetooth.getName(); //ta.append(name0+" start\n"); Bluetooth.start(); //Wifi线程 Thread Wifi = new Thread(){ public void run() { if(jcbArray[1].isSelected()){ new WifiRemoteServer(); } } }; //Wifi.setName("Wifi"); // String name1 = Wifi.getName(); // ta.append(name1+" start\n"); Wifi.start(); //GPRS线程 Thread GPRS = new Thread(){ public void run() { if(jcbArray[2].isSelected()){ new GPRSRemoteServer(); } } }; //GPRS.setName("GPRS"); //String name2 = GPRS.getName(); //ta.append(name2+" start\n"); GPRS.start(); //Zigbee线程 Thread Zigbee = new Thread(){ public void run() { if(jcbArray[3].isSelected()){ new ZigbeeRemoteServer(); } } }; //Zigbee.setName("Zigbee"); //String name3 = Zigbee.getName(); //ta.append(name3+" start\n"); Zigbee.start(); } if(result==1){ //否 jbArray[0].setEnabled(!jbarry); } } }); //结束按钮 **如何实现点击jbArray[1]后能够停止前面jbArray[0]中选择的监控方式的线程?????** jbArray[1].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int result= JOptionPane.showConfirmDialog(null,"End monitoring program now?","Message",JOptionPane.YES_NO_OPTION); if(result==0){ //是 for(int i=0; i<jcbArray.length; i++){ jcbArray[i].setSelected(false); } ta.setText(null); //后续功能完善 jbArray[0].setEnabled(!jbarry); } if(result==1){ //否 } } }); } //托盘的功能选项设置 public void TrayInit(){ if(SystemTray.isSupported()){ //检查当前系统是否支持系统托盘 SystemTray tray = SystemTray.getSystemTray();//获取表示桌面托盘区的 SystemTray 实例。 URL imageUrl=SystemTrayDemo.class.getResource("java.png"); ImageIcon icon = new ImageIcon(imageUrl); //Image image = Toolkit.getDefaultToolkit().getImage("D:\\kissjava.gif"); PopupMenu popupMenu = new PopupMenu(); //为托盘添加右键菜单 MenuItem exitItem = new MenuItem("Exit"); //退出exitItem按钮 exitItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ try{ System.exit(0); }catch(Exception ex) { ex.printStackTrace(); } } }); popupMenu.add(exitItem); //创建带指定图像、工具提示和弹出菜单的 TrayIcon trayIcon = new TrayIcon(icon.getImage(), "System is running", popupMenu); trayIcon.addMouseListener(new java.awt.event.MouseAdapter(){ @Override public void mouseClicked(MouseEvent e) { if(e.getClickCount()==2){ showIT(true); } } }); try{ tray.add(trayIcon); // 将 TrayIcon 添加到 SystemTray。 } catch (AWTException e) { System.err.println(e); } }else{ JOptionPane.showMessageDialog(null,"The operating system does not support tray","Message",JOptionPane.ERROR_MESSAGE); } } //窗体的菜单功能选项设置 public void WinInit(){ JMenuBar menubar = new JMenuBar();//为窗体添加菜单功能 setJMenuBar(menubar); //开关option选项 /*前端添加小图标 * JMenu option = new JMenu("开关"); * Icon startIcon = new ImageIcon("image/bluetooth.png"); JMenuItem start = new JMenuItem("开始",startIcon); */ //设置setting选项 JMenu setting = new JMenu("Setting"); JMenu language = new JMenu("Language"); setting.add(language); JMenuItem language1 = new JMenuItem("中文"); language.add(language1); JMenuItem language2 = new JMenuItem("English"); language.addSeparator(); language.add(language2); JMenu update = new JMenu("Update"); setting.addSeparator(); setting.add(update); JMenuItem update1 = new JMenuItem("Version update"); update.add(update1); update1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null,"please send the mail to zhouwenquan2012552061@Gmail.com","Message",JOptionPane.PLAIN_MESSAGE); } }); //关于help选项 JMenu help = new JMenu("Help"); JMenuItem about = new JMenuItem("About"); help.add(about); //后续功能完善 about.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null," Copyright @2013 popcorn\n All Right Reserved\n author popcorn\n version 1.0","Message",JOptionPane.PLAIN_MESSAGE); } }); menubar.add(setting); menubar.add(help); } /** 该方法用于实现滚动以及光标相关效果 */ public void scrollAndSetCursor(){ // ta.requestFocus(); ta.setSelectionStart(ta.getText().length()); } public void showIT(boolean visable){ if(this.isVisible() != visable) this.setVisible(visable); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable(){ public void run(){ new SystemTrayDemo().setVisible(true);//设置窗体显示 } }); } }
对于JAVA双缓冲的三个问题
import java.awt.*; import javax.swing.JPanel; class TetrisPanel extends JPanel implements Runnable//绘图线程类 { public int ypos=-80;//小球左上角的纵坐标 //在类中添加如下两个私有成员 private Image iBuffer; private Graphics gBuffer; public TetrisPanel() { //创建一个新线程 Thread t=new Thread(this); //启动线程 t.start(); } public void paint(Graphics g)//重载绘图方法 { if(iBuffer==null) { iBuffer=createImage(this.getWidth(),this.getHeight()); gBuffer=iBuffer.getGraphics(); } gBuffer.setColor(getBackground()); gBuffer.fillRect(0,0,this.getWidth(),this.getHeight()); gBuffer.setColor(Color.RED); gBuffer.fillOval(90,ypos,80,80); // g.drawImage(iBuffer,0,0,this); } public void update(Graphics g) { paint(g); } public void run()//重载run()方法 { while(true)//线程中的无限循环 { try{ Thread.sleep(30);//线程休眠30ms }catch(InterruptedException e){}//抛出异常 ypos+=5;//修改小球左上角的纵坐标 if(ypos>300)//小球离开窗口后重设左上角的纵坐标 { ypos=-80; } repaint();//窗口重绘 } } } 1、paint()方法能不能实现双缓冲?2、paint()方法中有很多this,每个this都代表什么?3、update()方法中paint(g)画的是什么?
swing如何刷新界面数据
我想的是index不会变,就可以跟原来的界面一样使用,但是为什么会多了 ``` package recite; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTable; import java.util.List; public class fmabtn { public static List<String>list_Array; public static JFrame jframe=new JFrame("日语学习"); public static JPanel Win=new JPanel(); public static JLabel headlabel=new JLabel(); public static JLabel label=new JLabel(); public static JLabel firstlabel=new JLabel("日本语学习软件"); public static String sum1="",sum2="",sum3=""; protected static int index; protected static int n=0; public static setBtnColor begin=new setBtnColor("开始",0); public static setBtnColor last=new setBtnColor("上一个单词",1); public static setBtnColor next=new setBtnColor("下一个单词",1); public static setBtnColor restart=new setBtnColor(); private static String []field= {"日汉","日语","形态","中文"}; public static void main(String []args)throws IOException { Icon ret=new ImageIcon("loop.jpg"); ImageIcon java=new ImageIcon("java.jpg"); restart.setIcon(ret); firstlabel.setFont(new getAllFont().getSomeFont()); Win.setBackground(Color.LIGHT_GRAY); Win.add(begin); Win.add(firstlabel); jframe.add(Win); jframe.setFont(new getAllFont().getHeaderFont()); jframe.setResizable(false);//固定窗口大小 jframe.setVisible(true); jframe.setSize(400,300);//在显示之前加入panel组件 jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); list_Array=new listarray("n3单词").getArray(); for(String page:field) { sum2+=page+"<br>"; } headlabel.setText("<html>"+sum2+"</html>");sum2=""; begin.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { index=8; System.out.println("begin:"+index); Win.repaint(); Win.remove(begin); Win.remove(firstlabel); last.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("last:"+index); if(index>=8) {for(n=index-8;n<index-4;n++) { sum1+=list_Array.get(n)+"<br>";}} index-=4; if(index<3) {label.setText("开头没有更多了,点击下一个单词");} else{label.setText("<html>"+sum1+"</html>");sum1="";}}}); next.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("next:"+index); if(index+4<=list_Array.size()) {for(n=index;n<index+4;n++) { sum1+=list_Array.get(n)+"<br>";}} index+=4; if(index>list_Array.size()){label.setText("结尾没有更多了,点击上一个单词");} else if(index<=list_Array.size()) {label.setText("<html>"+sum1+"</html>");sum1="";}}}); restart.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("restart:"+index); {jframe.dispose(); jframe.setVisible(true); Win.repaint(); Win.removeAll(); Win.add(begin); Win.setVisible(true); jframe.add(Win); begin.setLocation(150,100); begin=begin; last=last; next=next; restart=restart; System.out.println("restart后的:"+index); }}}); {for(int i=4;i<8;i++) { sum2+=list_Array.get(i)+"<br>";}} label.setText("<html>"+sum2+"</html>");sum2=""; Win.setLayout(null); last.setBounds(-10, 200, 100,75); next.setBounds(300,200,100,75); label.setBounds(50,0,400,160); headlabel.setBounds(10,0,400,160); restart.setBounds(300,50,60,60); Win.add(label); Win.add(last); Win.add(next); Win.add(restart); Win.add(headlabel); jframe.setSize(400,300); jframe.setVisible(true); }}); }} ```
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
死磕YOLO系列,YOLOv1 的大脑、躯干和手脚
YOLO 是我非常喜欢的目标检测算法,堪称工业级的目标检测,能够达到实时的要求,它帮我解决了许多实际问题。 这就是 YOLO 的目标检测效果。它定位了图像中物体的位置,当然,也能预测物体的类别。 之前我有写博文介绍过它,但是每次重新读它的论文,我都有新的收获,为此我准备写一个系列的文章来详尽分析它。这是第一篇,从它的起始 YOLOv1 讲起。 YOLOv1 的论文地址:https://www.c...
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的回答,对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalking,作者吴晟、刘浩杨 等等 仓库地址: apache/skywalking 更...
20行Python代码爬取王者荣耀全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片...
简明易理解的@SpringBootApplication注解源码解析(包含面试提问)
欢迎关注文章系列 ,关注我 《提升能力,涨薪可待》 《面试知识,工作可待》 《实战演练,拒绝996》 欢迎关注我博客,原创技术文章第一时间推出 也欢迎关注公 众 号【Ccww笔记】,同时推出 如果此文对你有帮助、喜欢的话,那就点个赞呗,点个关注呗! 《提升能力,涨薪可待篇》- @SpringBootApplication注解源码解析 一、@SpringBootApplication 的作用是什...
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给袈...
Python语言高频重点汇总
Python语言高频重点汇总 GitHub面试宝典仓库 回到首页 目录: Python语言高频重点汇总 目录: 1. 函数-传参 2. 元类 3. @staticmethod和@classmethod两个装饰器 4. 类属性和实例属性 5. Python的自省 6. 列表、集合、字典推导式 7. Python中单下划线和双下划线 8. 格式化字符串中的%和format 9. 迭代器和生成器 10...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
ES6基础-ES6的扩展
进行对字符串扩展,正则扩展,数值扩展,函数扩展,对象扩展,数组扩展。 开发环境准备: 编辑器(VS Code, Atom,Sublime)或者IDE(Webstorm) 浏览器最新的Chrome 字符串的扩展: 模板字符串,部分新的方法,新的unicode表示和遍历方法: 部分新的字符串方法 padStart,padEnd,repeat,startsWith,endsWith,includes 字...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
web前端javascript+jquery知识点总结
Javascript javascript 在前端网页中占有非常重要的地位,可以用于验证表单,制作特效等功能,它是一种描述语言,也是一种基于对象(Object)和事件驱动并具有安全性的脚本语言 ,语法同java类似,是一种解释性语言,边执行边解释。 JavaScript的组成: ECMAScipt 用于描述: 语法,变量和数据类型,运算符,逻辑控制语句,关键字保留字,对象。 浏览器对象模型(Br
Qt实践录:开篇
本系列文章介绍笔者的Qt实践之路。
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
为什么听过很多道理,依然过不好这一生?
记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程,思维模型的建立需要相对完整的学习和思考过程。以下观点是在碎片化阅读后总结的一点心得总结。
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
一条链接即可让黑客跟踪你的位置! | Seeker工具使用
搬运自:冰崖的部落阁(icecliffsnet) 严正声明:本文仅限于技术讨论,严禁用于其他用途。 请遵守相对应法律规则,禁止用作违法途径,出事后果自负! 上次写的防社工文章里边提到的gps定位信息(如何防止自己被社工或人肉) 除了主动收集他人位置信息以外,我们还可以进行被动收集 (没有技术含量) Seeker作为一款高精度地理位置跟踪工具,同时也是社交工程学(社会工程学)爱好者...
作为程序员的我,大学四年一直自学,全靠这些实用工具和学习网站!
我本人因为高中沉迷于爱情,导致学业荒废,后来高考,毫无疑问进入了一所普普通通的大学,实在惭愧...... 我又是那么好强,现在学历不行,没办法改变的事情了,所以,进入大学开始,我就下定决心,一定要让自己掌握更多的技能,尤其选择了计算机这个行业,一定要多学习技术。 在进入大学学习不久后,我就认清了一个现实:我这个大学的整体教学质量和学习风气,真的一言难尽,懂的人自然知道怎么回事? 怎么办?我该如何更好的提升
前端JS初级面试题二 (。•ˇ‸ˇ•。)老铁们!快来瞧瞧自己都会了么
1. 传统事件绑定和符合W3C标准的事件绑定有什么区别? 传统事件绑定 &lt;div onclick=""&gt;123&lt;/div&gt; div1.onclick = function(){}; &lt;button onmouseover=""&gt;&lt;/button&gt; 注意: 如果给同一个元素绑定了两次或多次相同类型的事件,那么后面的绑定会覆盖前面的绑定 (不支持DOM事...
相关热词 c#开发的dll注册 c#的反射 c# grid绑定数据源 c#多线程怎么循环 c# 鼠标左键 c# char占位符 c# 日期比较 c#16进制转换为int c#用递归求顺序表中最大 c#小型erp源代码
立即提问