java中按钮是点击事件和Enter事件如何一起用?

比如我有一个按钮nextButton,我给他nextButton.addActionListener(new MyButtonListener());于是我需要写一个内部类MyButtonListener implements
ActionListener,在这个类中的actionPerformed方法中写点击按钮后的操作!
但是现在我还想让按键盘上的回车来代替点击操作。
于是我又给按钮加了一个事件绑定nextButton.addKeylistener(new MyEnterListener);于是我又需要写一个内部类MyEnterListner implements KeyListener,在这个类中的keyPressed方法中又写一遍点击上按钮之后应该的操作~~~
这样就使我的程序很墨迹~谢了两段重复的代码,请问各位前辈,如果想让按钮实现既可以点击触发又可以按Enter触发应该怎么办?我觉我这种方法很笨,一定不是最好的办法!在此请教各位前辈,谢谢啦!!!

3个回答

先说一下我遇到类似的问题

我设置了一个文本框,同时,我设置了几个按钮。
我想要的是:我可以点击按钮来把按钮上的字符传给文本框,同时我还可以用键盘来输入
问题是:我点了按钮之后,键盘没用了,注意,是点了按钮之后

解决办法:先说出现这种情况的原因,因为我打开界面的时候是默认键盘控制文本框的输入的,也就是说焦点在文本框上,在我用了鼠标产生了鼠标事件之后,焦点转移到了按钮上
所以,解决方案就是:让文本框重新获得焦点,根据你导入的包来决定用哪个办法,我用的SWT就采用了.setFouces(),swing好像有.requestFocus()吧。
问题不太一样,希望能给你点灵感!

qq_30991045
一栗虾 回复还得注册好麻烦: 用的多的应该QT跟MFC吧
3 年多之前 回复
qq_30991045
一栗虾 回复还得注册好麻烦:据我所知主流界面设计不是用java的,因为java写桌面程序太...你懂
3 年多之前 回复
u011569741
还得注册好麻烦 回复一栗虾: 我也是刚开始学java~~~书上讲了一点界面~~java设计界面确实好像不太擅长~~但是是不是传统软件行业还是得用java来设计界面~~作为小白,,真的有好多问题~~~O(∩_∩)O哈哈~
3 年多之前 回复
qq_30991045
一栗虾 回复还得注册好麻烦: 这个不太清楚,我也初学水平有限,不过你可以考虑一下多线程,讲道理,这界面设计真的好烦人
3 年多之前 回复
u011569741
还得注册好麻烦 有了点灵感~~嘿嘿!java可不可以这样!比如无论焦点在哪里我按下enter键之后他就可以触发某个按钮的事件而不是焦点锁定按钮后才触发按键的事件~~~要写两遍感觉很不规范~一定有聪明的办法~~~
3 年多之前 回复

楼主我也需要你的方法 你现在知道了吗

同问楼主,可以把你的代码贴出来吗?我也需要

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java 为什么Dialog中的Label不显示?
为什么 在Dialog中add 一个Lable,但运行的时候并没有显示? 求大神 import java.awt.Button; import java.awt.Dialog; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.Label; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; public class MyFrame { private Frame frame ; private Button butCount; private Button butClear; private TextField tf ; private TextArea ta ; private TextField answer; public void init() { //定义组建 frame = new Frame("统计代码行数软件--by Owen"); butCount = new Button("统计"); butClear = new Button("结果清零"); tf = new TextField("请输入要计算的文件夹路径" , 60); tf.selectAll(); //设置将初始的"请输入要计算的文件夹路径"全选 ta = new TextArea(25 , 75); answer = new TextField(40); //向面板添加组建 frame.add(tf); frame.add(butCount); frame.add(butClear); frame.add(ta); frame.add(answer); //设置面板 frame.setVisible(true); frame.setBounds(300,100,630,500); frame.setLayout(new FlowLayout()); //引入事件 eventFrame(); eventButton(); eventText(); } //窗体事件 public void eventFrame() { //添加面板监听器 frame.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.exit(0); } }); } //按钮事件 public void eventButton() { //添加butCount监听器 butCount.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { action(); } }); //添加butClear监听器 butClear.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { Print.count = 0; ta.setText(""); tf.setText(""); answer.setText(""); } }); } //文本事件 public void eventText() { tf.addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_ENTER) action(); } }); } //操作部分 private void action() { String address = tf.getText(); //健壮性检验 File check = new File(address); if( !(check.exists() && check.isDirectory() )) popDialog(address); String[] files = Print.traDir(address); for(int i=0 ; i<files.length ; i++) { ta.append(files[i]); } ta.append("\r\n"); ta.append("\r\n"); ta.append("----------------------------------------------"); ta.append("\r\n"); ta.append("\r\n"); int count = Print.count; answer.setText("结果: "+count+" 行代码"); } //弹出对话框------------------这里没有弹出------------------????????????????????? private void popDialog(String address) { //定义弹出窗口口 Dialog wrongDialog = new Dialog(frame,"地址错误提示", false); Label wrongLabel = new Label(); Button wrongButton = new Button("确定"); wrongDialog.add(wrongLabel); wrongDialog.add(wrongButton); wrongDialog.setBounds(320 , 250 , 600 , 150); wrongDialog.setLayout(new FlowLayout()); wrongDialog.setVisible(true); String info = "输入地址 \" "+address+" \"有误,请重新输入"; wrongLabel.setText(info); popEvent(wrongDialog ,wrongLabel ,wrongButton); } //弹出对话框 --监听器 private void popEvent(Dialog wrongDialog ,Label wrongLabel ,Button wrongButton) { wrongDialog.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { wrongDialog.setVisible(false); } }); wrongButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { wrongDialog.setVisible(false); } }); } }
java 窗口登陆程序 麻烦帮我完善下几个很简单问题 本人刚开始学Java?
代码如下: 问题我备注 import javax.swing.*; import java.awt.*; import java.awt.event.*; class My extends JFrame implements ActionListener{ JLabel a4,a5,a6,a8; JTextField a3; JButton a1,a2; JPasswordField a7; My(){ a5=new JLabel("用户名"); a3=new JTextField(6); a3.addActionListener(this); a6=new JLabel("密码"); a7=new JPasswordField(6); a7.addActionListener(this); a1=new JButton("登录"); a1.addActionListener(this); a2=new JButton("取消"); a2.addActionListener(this); a8=new JLabel("欢迎进入信息录入系统"); a4=new JLabel(new ImageIcon("a.jpg")); a8.setFont(new Font("楷体",Font.BOLD,28)); this.setLayout(new FlowLayout()); this.add(a8);this.add(a4); this.add(a5);this.add(a3); this.add(a6);this.add(a7); this.add(a1);this.add(a2); add(a8,BorderLayout.SOUTH); add(a4,BorderLayout.CENTER); add(a5,BorderLayout.NORTH);add(a3,BorderLayout.NORTH); add(a6,BorderLayout.NORTH);add(a7,BorderLayout.NORTH); add(a1,BorderLayout.NORTH);add(a2,BorderLayout.NORTH); this.setVisible(true); this.setSize(400,340); this.setLocationRelativeTo(null); this.setTitle("登陆界面"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.getRootPane().setDefaultButton(a1); } private void registerKeyListener(){ a7.addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent event){ if (KeyEvent.getKeyText(event.getKeyCode()).compareToIgnoreCase("Enter")==0){ a1.doClick(); } } });//我想键盘按回车实现登陆不用点击登陆按钮 } public void actionPerformed(ActionEvent ae) { if(ae.getSource()==a1) { String s=a3.getText(); if(s.trim().equals("")) { JOptionPane.showMessageDialog(null, "输入内容不能为空","不合法提示",JOptionPane.INFORMATION_MESSAGE); }//内容为空的时候他会有俩个弹窗麻烦让他内容为空的时候只弹出一个 } if(ae.getSource()==a2){ } if(ae.getSource()==a1) { String q=a3.getText(); String w= String.valueOf(a7.getPassword()); if((q.equals("123")) && (w.equals("123"))) { JOptionPane.showMessageDialog(null, "登陆成功","确认登陆",JOptionPane.INFORMATION_MESSAGE); this.dispose(); new My1(); } else { JOptionPane.showMessageDialog(null, "用户名或密码错误","不合法提示",JOptionPane.INFORMATION_MESSAGE); } } } } public class Test1 { public static void main(String[] args) { new My(); } }
各位大神,为什么java界面无法显示?
import java.awt.BorderLayout; import java.awt.Button; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.UIManager; public class kiujh extends JFrame{ /** * @param args */ public kiujh(String title) throws Exception{ super(title); //设置基本设置 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); this.setSize(300, 150); this.setLocation(300, 200); this.setLayout(new BorderLayout()); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置用户名和密码框 JPanel jp1=new JPanel(); JTextField jt=new JTextField("Please enter the User's name"); JPasswordField pa=new JPasswordField("Please enter the Password"); jp1.setLayout(new BorderLayout()); jp1.add(jt, BorderLayout.NORTH); jp1.add(pa, BorderLayout.SOUTH); //设置登录按钮 JPanel jp2=new JPanel(); Button bt1=new Button("登录"); Button bt2=new Button("退出"); jp2.setLayout(new BorderLayout()); jp2.add(bt1, BorderLayout.WEST); jp2.add(bt2, BorderLayout.EAST); //设置标题 JLabel jl=new JLabel("登录界面"); //添加到界面里 this.add(jl, BorderLayout.NORTH); this.add(jp1, BorderLayout.CENTER); this.add(jp2,BorderLayout.SOUTH); } public static void main(String[] args) throws Exception { // TODO Auto-generated method stub kiujh j=new kiujh("登录"); } }
如何初始化JTextField以及如何使用JTextField中的selectAll方法
先列出代码 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class JTextFieldGui{ JTextField textField; JLabel labelInput; JLabel labelOutput; public static void main(String[] args) { JTextFieldGui gui = new JTextFieldGui(); gui.go(); } public void go(){ JFrame frame = new JFrame(); JPanel panelInput = new JPanel(); JPanel panelOutput = new JPanel(); labelInput = new JLabel("Your first name: "); labelOutput = new JLabel("Enter your name, and you will see it here."); textField = new JTextField(20);//<---问题1 JButton enter = new JButton("Enter"); JButton selectAll = new JButton("Select all text"); frame.setSize(300,200); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panelInput.setLayout(new BoxLayout(panelInput, BoxLayout.X_AXIS)); textField.addActionListener(new LabelActionListener()); enter.addActionListener(new LabelActionListener()); selectAll.addActionListener(new TextFieldActionlistener()); frame.getContentPane().add(BorderLayout.NORTH, panelInput); panelInput.add(labelInput); panelInput.add(textField); panelInput.add(enter); panelInput.add(selectAll); frame.getContentPane().add(BorderLayout.CENTER, panelOutput); panelOutput.add(labelOutput); } class LabelActionListener implements ActionListener{ public void actionPerformed(ActionEvent event){ labelOutput.setText(textField.getText()); } } class TextFieldActionlistener implements ActionListener{ public void actionPerformed(ActionEvent event){ textField.selectAll();//<---问题2 } } } 问题1:已经定义了textfield的大小为20列,但是,结果还是会占满整行 问题2:创建并监听了一个按钮selectall,用于全选textfield中的字符,但是并没有反应,是什么原因呢 问题3:另外之前还有个莫名其妙的错误,现在又没有了,无法将类 JTextField中的构造器 JTextField应用到给定类型,下面还有几行,写的是,需要:没有参数,总之就是说JTextField(int)是错误的 求指教!!!
OpenCV将某个方法添加进JButton.ActionListener()中无法正常使用?
`createImagePane()`方法是创建一个窗口显示一幅图像,等待sec秒后自动关闭或者按Enter关闭,正常效果如下所示: ![图片说明](https://img-ask.csdn.net/upload/201909/13/1568382591_887491.png) 现在是把这个方法放进了JButton组件的`addActionListener()`中,想法是点击然后出现上面的内容,但是却出现了下图这种情况: ![图片说明](https://img-ask.csdn.net/upload/201909/13/1568382576_752094.png) 而且点击窗口的关闭按钮也没有反应。 如果将此方法放进Timer中没有问题,直接在其他类中调用也没有反应,就是在JButton中出现了问题。 createImagePane()方法如下: ``` public class ConfirmPane extends JFrame { public static void createImagePane(int sec, String[] imgPath) { new ConfirmPane().showImageResult(sec, imgPath); } showImageResult(int seconds, String[] path) { // 省略实现代码 setSize(1280, 720); setTitle("出错警示"); setResizable(false); setLayout(null); centerWindow(this); Image logo = Toolkit.getDefaultToolkit().getImage(resFolderPath + "image\\logo.png"); setIconImage(logo); JButton confirm = new JButton("确认"); ImageGui imageGui = new ImageGui(result, null); imageGui.setBounds(0, 0, 1280, 720); confirm.setBounds(1180, 600, 80, 40); confirm.setVisible(true); add(imageGui); add(confirm); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); confirm.addActionListener(evt -> { keyCode = 0; dispose(); }); confirm.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { keyCode = e.getKeyCode(); } @Override public void keyReleased(KeyEvent e) { if (e.getKeyCode() == 10 && keyCode == 10) { dispose(); } else { dispose(); } } }); setVisible(true); while (keyCode == -1 && i < seconds) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } i++; } dispose(); } } ``` 调用代码如下: ``` public class Test extends JFrame { public Test() { String[] path = {"over~D:/Images/0902/20190831175455-3-Miss.jpg", "right~D:/Images/0902/20190831175455-3-Miss.jpg", "over~D:/Images/0902/20190831175455-3-Miss.jpg", "right~D:/Images/0902/20190831175455-3-Miss.jpg"}; setSize(300, 300); JButton jButton = new JButton("显示"); jButton.addActionListener(e -> createImagePane(10, path)); add(jButton); setVisible(true); } public static void main(String[] args) { System.load(System.getProperty("user.dir") + "\\lib\\opencv_java320.dll"); new Test(); } } ``` 注:ImageGui是其他人写的类,功能是显示一幅图像窗体
新人一枚,求大神们帮助,不胜感激
import java.util.*; import java.awt.*; import java.io.*; import java.net.*; import java.sql.*; import java.awt.event.*; import javax.swing.*; class Loginfrm extends Dialog implements ActionListener { JLabel l_name,l_pass,l_error; JTextField t_name; JButton b_enter,b_cancle,b_clear; JPanel pan1,pan2,pan3,pan4; JPasswordField t_pass; String sname,spass; int sunit; NetConn sql; Statement sqll; ResultSet rs; Librarybox lbox; int until=0; Loginfrm(Frame f,String s) { //界面布局 super(f,s); l_name=new JLabel("名字:"); l_pass=new JLabel("密码:"); l_error=new JLabel("请输入用户名和密码登录"); t_name=new JTextField("",10); t_pass=new JPasswordField("",10); t_pass.setEchoChar('*'); b_enter=new JButton("确定"); b_enter.addActionListener(this); b_cancle=new JButton("取消"); b_cancle.addActionListener(this); b_clear=new JButton("清除"); b_clear.addActionListener(this); pan1=new JPanel(); pan2=new JPanel(); pan3=new JPanel(); pan4=new JPanel(); pan1.add(l_name);pan1.add(t_name); pan2.add(l_pass);pan2.add(t_pass); pan3.add(l_error); pan4.add(b_enter);pan4.add(b_cancle);pan4.add(b_clear); setLayout(new GridLayout(4,1)); add(pan1);add(pan2);add(pan3);add(pan4); //建立数据库连接 sql=new NetConn(); //设置窗口大小 setBounds(400,200,300,300); setVisible(false); } public void actionPerformed(ActionEvent e) { //单击确定按钮的事件处理程序 if(e.getSource()==b_enter) { //如果连续登录次数小于4 if(until<=4) { //如果用户名或者密码为空,将显示提示信息 if(t_name.getText().equals("")||t_pass.getText().equals("")) { l_error.setText("用户名和密码不能为空"); } else { try { sqll=sql.connect(); //根据用户名查询 rs=sqll.executeQuery("SELECT * FROM users where username="+"'"+t_name.getText()+"'"); //遍历查询得到的结果集 while(rs.next()) { sname=rs.getString(2); spass=rs.getString(3); //得到登录用户的级别 sunit=Integer.parseInt(rs.getString(4)); //如果密码正确 if(t_pass.getText().equals(spass)) { //判断用户的级别,根据不同的级别,显示不同的菜单 switch(sunit) { case 1: { l_error.setText("登录成功"); t_name.setText(""); t_pass.setText(""); lbox=new Librarybox(); lbox.bookfi.setEnabled(true); lbox.bookse.setEnabled(true); lbox.bookth.setEnabled(true); lbox.bookfo.setEnabled(true); lbox.mi_system_manger.setEnabled(true); lbox.setVisible(true); this.dispose(); break; } case 2: { l_error.setText("登录成功"); t_name.setText(""); t_pass.setText(""); lbox=new Librarybox(); lbox.bookfi.setEnabled(false); lbox.bookse.setEnabled(false); lbox.bookth.setEnabled(true); lbox.bookfo.setEnabled(false); lbox.mi_system_manger.setEnabled(false); lbox.setVisible(true); this.dispose(); break; } case 3: { l_error.setText("登录成功"); t_name.setText(""); t_pass.setText(""); lbox=new Librarybox(); lbox.bookfi.setEnabled(true); lbox.bookse.setEnabled(false); lbox.bookth.setEnabled(false); lbox.bookfo.setEnabled(true); lbox.mi_system_manger.setEnabled(false); lbox.fi_msglabel_user.setEnabled(false); lbox.setVisible(true); this.dispose(); break; } } } else { l_error.setText("用户名或密码错误!"); until++; } } } catch(SQLException e2) {} } } //超出登录次数 else { l_error.setText("你已经超出登录次数"); t_name.setEnabled(false); t_pass.setEnabled(false); b_enter.setEnabled(false); b_clear.setEnabled(false); } } //单击清除按钮的事件处理程序 else if(e.getSource()==b_clear) { t_name.setText(""); t_pass.setText(""); l_error.setText("请输入用户名和密码登录"); } //单击取消按钮的事件处理程序 else if(e.getSource()==b_cancle) { dispose(); } } } 但运行时,有错,怎么也改不来 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at Loginfrm.actionPerformed(Loginfrm.java:79) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
java swing 一个窗口打开新创口 加上go()程序就死掉了
import javax.swing.*; import java.awt.Rectangle; import java.awt.event.*; public class Swing7 extends JFrame implements ActionListener { JButton jb = new JButton(); public Swing7() { this.setTitle("Java——"); jb.setText("确定"); jb.setMnemonic('a'); this.add(jb); this.setBounds(200, 300, 250, 300); this.setVisible(true); jb.addActionListener(this); //由于Swing7实现了ActionListener接口,所以给jb添加的ActionListener就是Swing7实例。 } public void actionPerformed(ActionEvent e) {// 实现ActionListener接口的actionPerformed接口。 yidengjiang frame=new yidengjiang(); frame.setVisible(true); } public static void main(String args[]) { Swing7 s = new Swing7(); } } import java.awt.*; import java.awt.event.*; import java.util.Random; import javax.swing.*; public class yidengjiang extends JFrame implements ActionListener { /** * */ private static final long serialVersionUID = -8560277451929244119L; JTextField tf = new JTextField(); JButton b1 = new JButton("开始"); JButton b2 = new JButton("停止"); boolean isGo = false; String path = "223.jpg"; ImageIcon background = new ImageIcon(path); JTextArea jiang1= new JTextArea(); int choujiangcishu=1; public yidengjiang() { this.getContentPane().setLayout(null); Dimension srcDim = Toolkit.getDefaultToolkit().getScreenSize(); System.out.println(srcDim.width+" "+srcDim.height); this.setExtendedState(JFrame.MAXIMIZED_BOTH); this.getContentPane().add(tf); this.getContentPane().add(b1); ImageIcon background = new ImageIcon(path);// 背景图片 JLabel jlbg = new JLabel(background);// 把背景图片显示在一个标签里面 jlbg.setBounds(0, 0, srcDim.width, srcDim.height);// 把标签的大小位置设置为图片刚好填充整个面板 JPanel imagePanel = (JPanel) this.getContentPane(); imagePanel.setOpaque(false); this.getLayeredPane().add(jlbg, new Integer(Integer.MIN_VALUE)); tf.setFont(new Font("Courier", Font.PLAIN, 110)); tf.setHorizontalAlignment(JLabel.CENTER); tf.setOpaque(false); //tf.setBackground(Color.red);// 按钮红色背景 tf.setEditable(false);//不可编辑 tf.setBorder(BorderFactory.createEmptyBorder());//无边框 tf.setBounds(srcDim.width/2-srcDim.width/3/2, srcDim.height/2+srcDim.height/10/2, srcDim.width/3, srcDim.height/10); b1.setBounds(0,0,0,0); b2.setBounds(0,0,0,0); jiang1.setBounds(srcDim.width/30, srcDim.height/20,800,800); jiang1.setOpaque(false); jiang1.setFont(new Font("Courier",Font.PLAIN,22)); jiang1.setEditable(false); this.getContentPane().add(tf); this.getContentPane().add(b1); this.getContentPane().add(b2); this.getContentPane().add(jiang1); b1.setActionCommand("start"); b1.addActionListener(this); b2.addActionListener(this); SymListener sy = new SymListener(); b1.registerKeyboardAction(sy,KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW); b2.registerKeyboardAction(sy,KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW); //jButton.setMnemonic(KeyEvent.VK_ENTER); b2.setEnabled(false); super.setUndecorated(true);// 无标题栏 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocation(0, 0); Cursor cu = new Cursor(Cursor.HAND_CURSOR); this.setCursor(cu); this.setVisible(true); tf.setText("888888"); go(); } public void go() { while (true) { if (isGo == true) { String s = ""; Random rand = new Random(); for (int j = 1; j <= 1; j++) { int i = (int) (Math.random()*260000+1);//设定奖项总数 if (i < 10) { s = s + "00000" + i; } else if(i<100 & i>=10) { s = s + "0000" + i; }else if(i<1000 & i>=100) { s = s + "000" + i; }else if(i<10000 & i>=1000) { s = s + "00" + i; }else if(i<100000 & i>=10000) { s = s + "0" + i; }else { s = s + i; } } tf.setText(s); } try { Thread.sleep(10); } catch (java.lang.InterruptedException e) { e.printStackTrace(); } } } public void actionPerformed(ActionEvent e) { String s = e.getActionCommand(); if (s.equals("start")) { isGo = true; b1.setEnabled(false); b2.setEnabled(true); } else { isGo = false; jiang1.setText(jiang1.getText()+"\n"+tf.getText()); b2.setEnabled(false); b1.setEnabled(true); } } /*public static void main(String[] args) { Dimension srcDim = Toolkit.getDefaultToolkit().getScreenSize(); ImgUtil image =new ImgUtil(); image.createThumb("3.png", "223.jpg",(int)srcDim.getWidth(), (int)srcDim.getHeight()); new yidengjiang(); } */ class SymListener implements ActionListener { public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); if (obj == b1) { isGo = true; b1.setEnabled(false); b2.setEnabled(true); } else if (obj == b2) { isGo = false; operdata aaa =new operdata(); String bb= aaa.getuserdata(tf.getText()); jiang1.setText(jiang1.getText()+"\n"+""+(choujiangcishu++)+": "+tf.getText()+bb); b2.setEnabled(false); b1.setEnabled(true); } } } }
html文件调用到jsp的时候不显示jsp的内容反而显示jsp里面的代码
html文件如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> </head> <body bgcolor="white"><font size=1> <form action="in.jsp" method="post" name="form"> <input type="text" name="boy" /> <input type="submit" value="Enter" name="submit" /> </form> </font> </body> </html> jsp文件如下: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <p>获取文本: <%String str=request.getParameter("boy"); %> <%=str %> <p>获取按钮: <%String strButton=request.getParameter("submit"); %> <%=strButton %> </body> </html>
用Mina开发Socket服务器总有一些不可预知的奇怪现象?程序结束不了?!
最近在用 Java的Socket框架mina开发一个服务器端程序,服务器写完后,用mina的客户端API写了程序去连接服务器端,也连接成功了,但是发现每次客户端连接完成运行后 过1分钟客户端程序才结束! 经过调试发现代码已经执行了客户端代码的最后一行! 真是奇怪,客户端代码如下: <br /><pre name="code" class="java">public class Client { private static final String HOSTNAME = "localhost"; private static final int PORT = 20000; public static void main( String[] args ) throws Throwable { SocketConnector connector = new SocketConnector(); // Configure the service. SocketConnectorConfig cfg = new SocketConnectorConfig(); cfg.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) ); cfg.getFilterChain().addLast( "logger", new LoggingFilter() ); IoSession session; try { ConnectFuture future = connector.connect(new InetSocketAddress( HOSTNAME, PORT), new ClientSessionHandler("Hi hi :("), cfg); future.join(); session = future.getSession(); } catch (RuntimeIOException e) { System.err.println("Failed to connect."); e.printStackTrace(); } // wait until the summation is done session.getCloseFuture().join(); System.out.println(session,"### all done! !"); } </pre> <br /> <br />"### all done!  !" 明明都已经打印出来了! 但是发现进程中还是有一个 javaw.exe! 而且用进程管理工具无法结束!,过了1分钟后,这个javaw.exe就没有了,发现eclipse的控制台红色结束按钮也变灰色了. 这些居然都是在最后一行代码执行完发生的? 感觉Java真是一个不稳定的东西~~<img src="/images/smiles/icon_confused.gif" /> <br /><strong>问题补充</strong><br />多谢回复,我看2.0是M版本,好像下载上面写着 unstable,所以没有用,你用这个版本感觉稳定吗?  我刚才又试验了一下 quickServer,试验socket连接到达100个居然就Connnectin refused了? 好像根本没有使用 非阻塞队列. mina虽然有我刚才说的问题,但是他却能坚持到 1000个连接没有发生 Connnectin refused的错误,说明他还是利用了线程池重用了很多连接,我现在马上试试 mina2.0! 我用的是1.1.7,connector没有dispose方法,那个例子我也看到了<br /><strong>问题补充</strong><br />还有你知道他的 httpserver怎么用吗? asyWeb合到mina里面了,我看了例子"httpserver",但是里面居然没有客户端调用示例.客户端怎么传递参数到http服务器也没有说明<br /><strong>问题补充</strong><br />我试了一下2.0M果然可以. 但是服务器端好像不能自己设置连接池了? 下面的代码在2.0不能用,你们怎么用连接池的? 我的性能是要求一台服务器机器需要有1000个并发连接. 我现在服务器这样写不知道有没有问题: <br /><pre name="code" class="java">ExecutorService executor = Executors.newFixedThreadPool(1000); IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.setHandler( new TimeServerHandler() ); acceptor.getSessionConfig().setReadBufferSize( 2048 ); acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 ); acceptor.getFilterChain().addLast("executor", new ExecutorFilter(executor)); acceptor.getFilterChain().addLast( "logger", new LoggingFilter() ); acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) ); acceptor.bind( new InetSocketAddress(PORT) );</pre> <br /> <br />客户端很简单,就是模拟1000个并发连接: <br /><pre name="code" class="java"> public static void main( String[] args ) throws Throwable { for(int i=0;i&lt;1000;i++){ log.info("Enter run l..."+i); new Thread(new ClientThread(i)).start(); } } </pre> <br />每个客户端代码是: <br /><pre name="code" class="java">public void run() { // TODO Auto-generated method stub log.info("#### thread :"+this.num+" Running..."); NioSocketConnector connector = new NioSocketConnector(); // Configure the service. connector.setConnectTimeoutMillis(CONNECT_TIMEOUT); connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) ); connector.getFilterChain().addLast( "logger", new LoggingFilter() ); connector.setHandler(new ClientSessionHandler(" hihi new!")); IoSession session; for (;;) { try { ConnectFuture future = connector.connect(new InetSocketAddress( HOSTNAME, PORT)); future.awaitUninterruptibly(); session = future.getSession(); break; } catch (Exception e) { System.err.println("Failed to connect."); e.printStackTrace(); } } // wait until the summation is done session.getCloseFuture().awaitUninterruptibly(); connector.dispose(); log.info("#### thread :"+this.num+" over ..."); }</pre> <br />不知道这样写是不是已经用了NIO特性和数量是1000的连接池了. 而且我发现客户端如果不用mina的API,直接用Socket API连接,服务器撑不到1000个,200多个就Connection refused了.<br /><strong>问题补充</strong><br />刚才试验了一下,模拟1000个客户端连接,成功了931个,异常是: <br /><pre name="code" class="java">2008-12-28 02:18:06,968 ERROR (LoggingFilter.java:127) - EXCEPTION : java.io.IOException: 您的主机中的软件放弃了一个已建立的连接。 at sun.nio.ch.SocketDispatcher.read0(Native Method) at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25) at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:233) at sun.nio.ch.IOUtil.read(IOUtil.java:206) at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:207) at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:180) at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:42) at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:568) at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:547) at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:539) at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400(AbstractPollingIoProcessor.java:57) at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:867) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:65) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675) at java.lang.Thread.run(Thread.java:595)</pre> <br />不知道调整哪些参数可以不发生这个错误? 就是说调整什么可以使1000个连接都能连上<br /><strong>问题补充</strong><br />windows需要修改OS的一个设置,但是设置了也不起作用,我再试试吧! java的NIO的目的是使服务器端打开尽量少的Socket连接,能处理尽可能多的客户端请求(不知道主要是非阻塞队列起作用还是那个concurrent线程池在发挥作用,应该是前者),这样理解没错吧?
用netbeans做一个网页浏览器,
要实现的功能很简单,要有历史记录显示和数钱的添加,可是一直出现问题,求各位大神帮帮忙。 private void File_exitActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); // TODO add your handling code here: } private void HTMLActionPerformed(java.awt.event.ActionEvent evt) { InputStream ins = null; BufferedInputStream bins = null; try { URL u = new URL(URLDecoder.decode(URL.getText(), "utf-8")); ins = u.openStream(); bins = new BufferedInputStream(ins); byte[] b = new byte[32]; int count; StringBuffer sb = new StringBuffer(); while ((count = bins.read(b, 0, b.length)) != -1) { sb.append(new String(b, 0, count)); } try { File file = new File("src/WebBrowser/源文件.txt "); BufferedWriter writer = new BufferedWriter(new FileWriter(file)); writer.write(sb.toString()); writer.close(); } catch (Exception e) { System.out.println(e); } JOptionPane.showMessageDialog(this, "源文件已下载到源文件.txt,请自行查看!"); } catch (MalformedURLException me) { System.out.println(me); } catch (IOException ie) { System.out.println(ie); } finally { if (bins != null) { try { bins.close(); } catch (IOException ioe) { System.out.println("缓冲输入流关闭异常"); } } if (ins != null) { try { ins.close(); } catch (IOException ioe) { System.out.println("输入流关闭异常"); } } } // TODO add your handling code here: } private void AboutActionPerformed(java.awt.event.ActionEvent evt) { JOptionPane.showMessageDialog(this, "这是一个简单的浏览器" + '\n' + "姓名:梁丽丽" + '\n' + "学号:110604404152" + '\n' + "班级:计科1141" + '\n' + "时间:2013年12月15日" + '\n' + "O(∩_∩)O~", "关于浏览器", WIDTH); // TODO add your handling code here: } private void GroundColorActionPerformed(java.awt.event.ActionEvent evt) { Color newColor = JColorChooser.showDialog(this, "选择背景颜色", Windows.getBackground()); if (newColor != null) { Windows.setBackground(newColor); } // TODO add your handling code here: } private void BackActionPerformed(java.awt.event.ActionEvent evt) { URL currentUrl = Windows.getPage(); int pageIndex = historyList.indexOf(currentUrl.toString()); try { display(new URL((String) historyList.get(pageIndex -1)), false); } catch (Exception e) { JOptionPane.showMessageDialog(this, "错误!" + e.getMessage()); } // TODO add your handling code here: } private void ForwardActionPerformed(java.awt.event.ActionEvent evt) { URL currentUrl = Windows.getPage(); int pageIndex = historyList.indexOf(currentUrl.toString()); try { display(new URL((String) historyList.get(pageIndex +1)), false); } catch (Exception e) { JOptionPane.showMessageDialog(this, "错误!" + e.getMessage()); } // TODO add your handling code here: } private void RefreshActionPerformed(java.awt.event.ActionEvent evt) { try { display(Windows.getPage(), false);//刷新按钮不会增加历史记录! } catch (Exception e) { JOptionPane.showMessageDialog(this, "错误!" + e.getMessage()); } // TODO add your handling code here: } private void HomePageActionPerformed(java.awt.event.ActionEvent evt) { try { URL url = new URL("http://www.baidu.com"); display(url, true); } catch (Exception e) { JOptionPane.showMessageDialog(this, "错误" + e.getMessage()); } // TODO add your handling code here: } private void GoActionPerformed(java.awt.event.ActionEvent evt) { go(); // TODO add your handling code here: } private void History_DelActionPerformed(java.awt.event.ActionEvent evt) { historyListDel = !historyListDel; // TODO add your handling code here: } private void BookMark_DelActionPerformed(java.awt.event.ActionEvent evt) { bookmarkListDel = !bookmarkListDel; // TODO add your handling code here: } private void History_ShowActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void BookMark_AddActionPerformed(java.awt.event.ActionEvent evt) { boolean isIn = bookmarkList.contains(URL.getText()); if (!isIn) { bookmarkList.add(URL.getText()); JMenuItem newItem = new JMenuItem(URL.getText()); BookMark.add(newItem); JOptionPane.showMessageDialog(this, "书签添加成功!(*^__^*) "); } else { JOptionPane.showMessageDialog(this, "书签已存在,无需重复加入!⊙﹏⊙"); } // TODO add your handling code here: } private void BookMarkActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void URLKeyPressed(java.awt.event.KeyEvent evt) { if ((evt.getKeyCode()) == (KeyEvent.VK_ENTER)) { go(); } // TODO add your handling code here: } private void WindowsHyperlinkUpdate(javax.swing.event.HyperlinkEvent evt) { if (evt.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { display(evt.getURL(), true); } // TODO add your handling code here: } private void WindowsMousePressed(java.awt.event.MouseEvent evt) { if (isVisible) { JPopupMenu1.show(evt.getComponent(), evt.getX(), evt.getY()); } else { JPopupMenu1.setVisible(false); } isVisible = !isVisible; // TODO add your handling code here: } private void BookMarkAddActionPerformed(java.awt.event.ActionEvent evt) { JPopupMenu1.setVisible(false); BookMark_AddActionPerformed(evt); // TODO add your handling code here: } private void HTML2ActionPerformed(java.awt.event.ActionEvent evt) { JPopupMenu1.setVisible(false); HomePageActionPerformed(evt); // TODO add your handling code here: } private void ReloadActionPerformed(java.awt.event.ActionEvent evt) { JPopupMenu1.setVisible(false); RefreshActionPerformed(evt); // TODO add your handling code here: } private void ExitActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); // TODO add your handling code here: } private void go() { try { String url = URLDecoder.decode(URL.getText(), "utf-8"); if (!url.toLowerCase().startsWith("http://")) { url = "http://" + url;//确保url格式正确 } URL currentURL = new URL(url); if (currentURL!=null) { display(currentURL, true); } else { JOptionPane.showMessageDialog(this, "有些小错误,去不了你想要去的地方%>_<%"); } } catch (Exception ex) { JOptionPane.showMessageDialog(this, "错误!非法的URL"); } } private ArrayList<String> historyList = new ArrayList<String>(); private void display(URL pageUrl, boolean addToList) { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { Windows.setPage(pageUrl); URL newUrl = Windows.getPage(); URL.setText(newUrl.toString()); Label.setText(newUrl.getHost()); if (addToList) { boolean isIn = historyList.contains(newUrl.toString()); if (isIn) { historyList.remove(newUrl.toString()); } historyList.add(newUrl.toString()); if (isIn) { History.removeAll(); History.add("历史记录[10]"); History.insertSeparator(1); if (historyList.size() > 10) { for (int i = historyList.size() - 10; i < historyList.size() - 1; i++) { JMenuItem historyItemR = new JMenuItem(historyList.get(i)); historyItemR.addActionListener((ActionListener) this); History.add(historyItemR); } } else { for (int i = 0; i < historyList.size(); i++) { JMenuItem historyItem = new JMenuItem(historyList.get(i)); historyItem.addActionListener((ActionListener) this); History.add(historyItem); } } } else { JMenuItem historyItem = new JMenuItem(URL.getText()); historyItem.addActionListener((ActionListener) this); History.add(historyItem); } if (historyList.size() > 10) { History.remove(2); } } updateButtons(); } catch (Exception e) { JOptionPane.showMessageDialog(this, "不能载入该页面!" + e.getMessage()); } finally { setCursor(Cursor.getDefaultCursor()); } } private void updateButtons() { if (historyList.size() < 2) { Back.setEnabled(false); Forward.setEnabled(false); } else { String currentUrl = Windows.getPage().toString(); int pageIndex = historyList.indexOf(currentUrl.toString()); Back.setEnabled(pageIndex > 0); Forward.setEnabled(pageIndex < (historyList.size() - 1)); } } private boolean historyListDel = false; private boolean bookmarkListDel = false; private boolean bookmarkListUp = false; private boolean bookmarkListDown = false; public void actionPerformed(ActionEvent e) { if ((bookmarkListDel == true) && (historyListDel == false)) { BookMark.remove((JMenuItem) e.getSource()); bookmarkList.remove(e.getActionCommand()); bookmarkListDel = false; } else if ((bookmarkListDel == false) && (historyListDel == true) ) { History.remove((JMenuItem) e.getSource()); historyList.remove(e.getActionCommand()); historyListDel = false; } else { JMenuItem newItem = (JMenuItem) (e.getSource()); try { URL itemURL = new URL(newItem.getText()); display(itemURL, true); } catch (MalformedURLException ex) { Logger.getLogger(Browser.class.getName()).log(Level.SEVERE, null, ex); } } } private ArrayList<String> bookmarkList = new ArrayList<String>();
新手求解全双工--互相发信息不能显示
服务器: /* * 服务器端,全双工 */ import javax.swing.*; import com.sun.java.swing.plaf.windows.resources.windows; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.*; import java.net.*; public class MyServer3 extends JFrame implements ActionListener,KeyListener{ JTextArea jta= null; JTextField jtf= null; JButton jb= null; JScrollPane jsp=null; JPanel jp1= null; //把信息发送给客户端的对象 PrintWriter pw= null; public static void main(String[] args) { // TODO Auto-generated method stub MyServer3 ms3= new MyServer3(); } public MyServer3(){ jta= new JTextArea(); jsp= new JScrollPane(jta); jtf= new JTextField(15); jb= new JButton("发送"); jb.addActionListener(this); jp1= new JPanel(); jp1.add(jtf); jp1.add(jb); this.add(jsp, "Center"); this.add(jp1, "South"); this.setTitle("QQ聊天-服务器"); this.setSize(320, 240); this.setVisible(true); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); try { //服务器监听 ServerSocket ss= new ServerSocket(9988); //等待客户端连接 Socket s= ss.accept(); InputStreamReader isr= new InputStreamReader(s.getInputStream()); BufferedReader br= new BufferedReader(isr); pw= new PrintWriter(s.getOutputStream(),true); //读取从客户端发来的消息 while(true){ //读取从客户端发来的消息 String info= br.readLine(); jta.append("客户端说:"+info+"\r\n"); } } catch (Exception e) { e.printStackTrace(); } } @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub //如果用户按下按发送信的按钮 if(arg0.getSource()==jb){ //把服务器在jtf写的内容发送给客户端 String info= jtf.getText(); jta.append("服务器说:"+info+"\r\n"); pw.print(info); //清空输入框内容 jtf.setText(""); } } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub if(e.getSource()==jtf){ //System.out.println(e.getKeyCode()); if(e.getKeyCode()==KeyEvent.VK_ENTER){ String info=jtf.getText(); jta.append("服务器说:"+info+"\r\n"); pw.println(info); //清空内存 jtf.setText(""); } } } @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } } ``` 客户端 ``` import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.*; import java.net.*; import javax.swing.*; public class MyClient3 extends JFrame implements ActionListener,KeyListener{ JTextArea jta= null; JTextField jtf= null; JButton jb= null; JScrollPane jsp=null; JPanel jp1= null; //把信息发送给客户端的对象 PrintWriter pw= null; public static void main(String[] args) { MyClient3 mc3= new MyClient3(); } public MyClient3(){ jta= new JTextArea(); jsp= new JScrollPane(jta); jtf= new JTextField(15); jb= new JButton("发送"); jb.addActionListener(this); jp1= new JPanel(); jp1.add(jtf); jp1.add(jb); this.add(jsp, "Center"); this.add(jp1, "South"); this.setTitle("QQ聊天-客户端"); this.setSize(320, 240); this.setVisible(true); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); try { Socket s= new Socket("127.0.0.1", 9988); InputStreamReader isr= new InputStreamReader(s.getInputStream()); BufferedReader br= new BufferedReader(isr); pw= new PrintWriter(s.getOutputStream(),true); while(true){ //不停的读取从服务器端发来的信息 String info= br.readLine(); jta.append("服务器说:"+info+"\r\n"); } } catch (Exception e) { e.printStackTrace(); } } @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub //如果用户按下按发送信的按钮 if(arg0.getSource()==jb){ String info= jtf.getText(); //把客户端发送的信息显示在jta jta.append("客户端说:"+info+"\r\n"); pw.print(info); //清空输入框内容 jtf.setText(""); } } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub if(e.getSource()==jtf){ //System.out.println(e.getKeyCode()); if(e.getKeyCode()==KeyEvent.VK_ENTER){ String info=jtf.getText(); jta.append("客户端说:"+info+"\r\n"); pw.println(info); //清空内存 jtf.setText(""); } } } @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } } ``` ```
关于提交页面(即提交表单)的问题?
1.login.jsp:代码片段 [code="java"]<td align="left"><input type="image" src="/images/btn_enter.gif" name="image"></td> //说明:这里是一个图片,点击图片之后提交页面(具体点说是会员登陆)————但是对这段代码有点不清楚,一般情况下,提交页面应该是提交按钮(<input type="submit"/>);即使要设置按钮的背景图片也可以这样<input type="submit" src="url";当然还可以用js/jquery对它进行处理然后提交页面,但问题是没有任何js代码对这个标签进行处理,那么这里到底是如何提交页面的呢,或者说,还有什么其他的方式提交页面么?[/code] 2.用chrome调试的时候,与login.jsp页面相关的js代码是: a.login.jsp里面的js [code="java"]<script type="text/javascript"> <!-- var redirectUrl="<%=session.getAttribute(Constants.C.VAR_REDIRECT_URL)%>"; jQuery(function() { jQuery("#txt_uid").focus(); }); //--> </script>[/code] b.login.js [code="java"]/** * 登录处理 */ jQuery(function($){ $("#uid").val("Uid").mouseover(function (){ //1.这里设置断点,会执行到该断点! if(!$(this).attr("changed")){ $(this).val(""); } }).mouseout(function(){ if(!$(this).attr("changed")){ $(this).val("Uid"); } }).keypress(function(){ $(this).attr("changed",true); }); $("#pwd").val("Password").mouseover(function (){ if(!$(this).attr("changed")){ $(this).val(""); } }).mouseout(function(){ if(!$(this).attr("changed")){ $(this).val("Password"); } }).keypress(function(){ $(this).attr("changed",true); }); }); function doLogin(form){ var param=jQuery(form).serialize()+"&json=true"; //2.这里设置断点,不会被执行————因为我搜索的时候,也确实没有看到有哪个地方调用了doLogin函数 var x=$("#span_loginErrMsg"); x.html("Logging in..."); $.post(form.action,param,function(json){ if(json.success){ if("null"!=redirectUrl){ window.location=redirectUrl; }else{ $("#div_login").load("/inc/login.jsp"); } }else{ var html=""; switch(json.errCode){ case -1: html="Can't Connect to Database"; break; case -2: html="No Related Customer Found!"; break; case -3: html="Invalid Uid / Pwd, or account is locked"; break; case -10: html="Signin attemps too many times!"; break; case -99: html="Signin attemps too many times!"; break; } x.html("<span style='color:red'>"+html+"</span>"); } },"json"); return false; }[/code]
一个按键的响应
用ext做了一个后台的界面,如下 [img][/img] 在其中的右边的相关部分是采用html 做个一个静态的页面。 其中有个按钮是这样实现的 [code="java"] <INPUT class=submit onclick="saveNews()" id=submit_button type=submit value=提交 name=commit> [/code] [code="java"] <SCRIPT type=text/javascript> function saveNews() { alert("Enter to the saveNews"); //获取接受返回信息层 var msg = document.getElementById("message"); //获取表单对象和用户信息值 var f = document.news_form; var title = f.title.value; title = encodeURI(title); title = encodeURI(title); alert("title :"+title); var content = f.content.value; var type = f.type.value; //接收表单的URL地址 var url = "commit_news.jsp"; //需要POST的值,把每个变量都通过&来联接 var postStr = "title="+ title +"&content="+ content +"&type="+ type; //实例化Ajax var ajax = null; if(window.XMLHttpRequest){ ajax = new XMLHttpRequest(); } else if(window.ActiveXObject){ ajax = new ActiveXObject("Microsoft.XMLHTTP"); } else{ alert("error"); return; } //通过Post方式打开连接 ajax.open("POST", url, true); //定义传输的文件HTTP头信息 ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //发送POST数据 ajax.send(postStr); //返回数据的处理函数 ajax.onreadystatechange = function(){ if (ajax.readyState == 4 && ajax.status == 200){ msg.innerHTML = ajax.responseText; } } window.location.href = "../../adminmain.jsp"; alert("文章发表成功"); } </SCRIPT> [/code] 如果单纯的建立以个html文件,以上代码不存在任何的问题,但是把它 Ext.TabPane 的子类中,上面的代码 出了那个跳转成功以外,其他好像没有 相应,firefox提示有错误,但是调试不成功,请问,能告诉我错误在什么地方
tf.setBounds(80, 200,200,200); 竖座标超过80 程序不运行
import java.awt.*; import java.awt.event.*; import java.util.Random; import javax.swing.*; public class Three extends JFrame implements ActionListener, Runnable { /** * */ private static final long serialVersionUID = -8560277451929244119L; JTextField tf = new JTextField(); JButton b1 = new JButton("开始"); JButton b2 = new JButton("停止"); JButton b3 = new JButton("END"); boolean isGo = false; String path = "three.jpg"; ImageIcon background = new ImageIcon(path); JTextArea jiang1= new JTextArea(); int choujiangcishu=1; public Three() { this.getContentPane().setLayout(null); Dimension srcDim = Toolkit.getDefaultToolkit().getScreenSize(); this.setExtendedState(JFrame.MAXIMIZED_BOTH); this.getContentPane().add(tf); ImageIcon background = new ImageIcon(path);// 背景图片 JLabel jlbg = new JLabel(background);// 把背景图片显示在一个标签里面 jlbg.setBounds(0, 0, srcDim.width, srcDim.height);// 把标签的大小位置设置为图片刚好填充整个面板 JPanel imagePanel = (JPanel) this.getContentPane(); imagePanel.setOpaque(false);//设置透明 this.getLayeredPane().add(jlbg, new Integer(Integer.MIN_VALUE)); /*tf.setFont(new Font("Courier", Font.PLAIN, 35)); tf.setHorizontalAlignment(JLabel.LEFT); tf.setOpaque(false); tf.setBackground(Color.red);// 按钮红色背景 tf.setEditable(false);//不可编辑 //tf.setBorder(BorderFactory.createEmptyBorder());//无边框 tf.setBounds(80, 80, srcDim.width/6, srcDim.height/22); */ tf.setFont(new Font("Courier", Font.PLAIN, 35)); tf.setHorizontalAlignment(JLabel.LEFT); tf.setOpaque(false); tf.setBackground(Color.red);// 按钮红色背景 tf.setEditable(false);//不可编辑 //tf.setBorder(BorderFactory.createEmptyBorder());//无边框 *************** tf.setBounds(80, 200,200,200); b1.setBounds(1,100,10,10); b2.setBounds(1,200,10,10); b3.setBounds(1,300,10,10); this.getContentPane().add(tf); this.getContentPane().add(b1); this.getContentPane().add(b2); this.getContentPane().add(b3); b1.setActionCommand("start"); b2.setActionCommand("end"); b3.setActionCommand("over"); b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); SymListener sy = new SymListener(); b1.registerKeyboardAction(sy,KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW); b2.registerKeyboardAction(sy,KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW); b3.registerKeyboardAction(sy,KeyStroke.getKeyStroke(KeyEvent.VK_Q, 0), JComponent.WHEN_IN_FOCUSED_WINDOW); //jButton.setMnemonic(KeyEvent.VK_ENTER); b2.setEnabled(false); super.setUndecorated(true);// 无标题栏 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocation(0, 0); Cursor cu = new Cursor(Cursor.HAND_CURSOR); this.setCursor(cu); this.setVisible(true); tf.setText("888888"); operdata geshu=new operdata(); go(geshu.getCount()); } public void go(int p) { while (true) { if (isGo == true) { String s = ""; for (int j = 1; j <= 1; j++) { int i = (int) (Math.random()*p+1);//设定奖项总数 if (i < 10) { s = s + "00000" + i; } else if(i<100 & i>=10) { s = s + "0000" + i; }else if(i<1000 & i>=100) { s = s + "000" + i; }else if(i<10000 & i>=1000) { s = s + "00" + i; }else if(i<100000 & i>=10000) { s = s + "0" + i; }else { s = s + i; } } tf.setText(s); } try { Thread.sleep(10); } catch (java.lang.InterruptedException e) { e.printStackTrace(); } } } public void actionPerformed(ActionEvent e) { /* String s = e.getActionCommand(); if (s.equals("start")) { isGo = true; b1.setEnabled(false); b2.setEnabled(true); } if (s.equals("end")){ isGo = false; operdata aaa =new operdata(); String bb= aaa.getuserdata(tf.getText()); jiang1.setText(jiang1.getText()+"\n"+""+(choujiangcishu++)+": "+tf.getText()+bb); b2.setEnabled(false); b1.setEnabled(true); }*/ } public static void main(String[] args) { //Dimension srcDim = Toolkit.getDefaultToolkit().getScreenSize(); // ImgUtil image =new ImgUtil(); //image.createThumb("3.png", "223.jpg",(int)srcDim.getWidth(), (int)srcDim.getHeight()); new Three(); } class SymListener implements ActionListener { public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); if (obj == b1) { isGo = true; b1.setEnabled(false); b2.setEnabled(true); } else if (obj == b2) { isGo=false; b2.setEnabled(false); b1.setEnabled(true); }else if (obj == b3) { dispose(); } } } @Override public void run() { // TODO Auto-generated method stub } //@Override /*public void run() { this.yunyingzhongxingo(); }*/ }
PDFJS加载流预览PDF不展示问题
![问题页面](https://img-ask.csdn.net/upload/201905/20/1558347609_598483.png) ![图片说明](https://img-ask.csdn.net/upload/201905/20/1558347749_672343.png) 如图一所示,数据流已经传入,各项按钮都可以用,但就是主页面无法展示;图二演示模式等其余都可用,请教各位大佬这是怎么回事啊? 版本(PDFJS-1.9.426) 页面代码 ``` <%@ page pageEncoding="utf-8" contentType="text/html; charset=utf-8"%> <link rel="stylesheet" href="<%=request.getContextPath()%>/skin/js/pdfjs/web/viewer.css"> <link rel="resource" type="application/l10n" href="<%=request.getContextPath()%>/skin/js/pdfjs/web/locale/locale.properties"> <script type="text/javascript"> var DEFAULT_URL = "";//注意,删除的变量在这里重新定义 var PDFData = ""; $.ajax({ type:"post", async:false, // mimeType: 'text/plain; charset=x-user-defined', url:'publicworkindex.cmd?method=getPdfOutputStream', data:{'doc_id':${htmldata.STORE_ID}}, success:function(data){ PDFData = data; } }); var rawLength = PDFData.length; //转换成pdf.js能直接解析的Uint8Array类型,见pdf.js-4068 var array = new Uint8Array(new ArrayBuffer(rawLength)); for(i = 0; i < rawLength; i++) { array[i] = PDFData.charCodeAt(i) & 0xff; } DEFAULT_URL = array; </script> <script src="<%=request.getContextPath()%>/skin/js/pdfjs/build/pdf.js"></script> <script src="<%=request.getContextPath()%>/skin/js/pdfjs/web/viewer.js"></script> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="google" content="notranslate"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>PDF.js viewer</title> </head> <body tabindex="1" class="loadingInProgress"> <div id="outerContainer"> <div id="sidebarContainer"> <div id="toolbarSidebar"> <div class="splitToolbarButton toggled"> <button id="viewThumbnail" class="toolbarButton toggled" title="Show Thumbnails" tabindex="2" data-l10n-id="thumbs"> <span data-l10n-id="thumbs_label">Thumbnails</span> </button> <button id="viewOutline" class="toolbarButton" title="Show Document Outline (double-click to expand/collapse all items)" tabindex="3" data-l10n-id="document_outline"> <span data-l10n-id="document_outline_label">Document Outline</span> </button> <button id="viewAttachments" class="toolbarButton" title="Show Attachments" tabindex="4" data-l10n-id="attachments"> <span data-l10n-id="attachments_label">Attachments</span> </button> </div> </div> <div id="sidebarContent"> <div id="thumbnailView"> </div> <div id="outlineView" class="hidden"> </div> <div id="attachmentsView" class="hidden"> </div> </div> </div> <!-- sidebarContainer --> <div id="mainContainer"> <div class="findbar hidden doorHanger" id="findbar"> <div id="findbarInputContainer"> <input id="findInput" class="toolbarField" title="Find" placeholder="Find in document…" tabindex="91" data-l10n-id="find_input"> <div class="splitToolbarButton"> <button id="findPrevious" class="toolbarButton findPrevious" title="Find the previous occurrence of the phrase" tabindex="92" data-l10n-id="find_previous"> <span data-l10n-id="find_previous_label">Previous</span> </button> <div class="splitToolbarButtonSeparator"></div> <button id="findNext" class="toolbarButton findNext" title="Find the next occurrence of the phrase" tabindex="93" data-l10n-id="find_next"> <span data-l10n-id="find_next_label">Next</span> </button> </div> </div> <div id="findbarOptionsContainer"> <input type="checkbox" id="findHighlightAll" class="toolbarField" tabindex="94"> <label for="findHighlightAll" class="toolbarLabel" data-l10n-id="find_highlight">Highlight all</label> <input type="checkbox" id="findMatchCase" class="toolbarField" tabindex="95"> <label for="findMatchCase" class="toolbarLabel" data-l10n-id="find_match_case_label">Match case</label> <span id="findResultsCount" class="toolbarLabel hidden"></span> </div> <div id="findbarMessageContainer"> <span id="findMsg" class="toolbarLabel"></span> </div> </div> <!-- findbar --> <div id="secondaryToolbar" class="secondaryToolbar hidden doorHangerRight"> <div id="secondaryToolbarButtonContainer"> <button id="secondaryPresentationMode" class="secondaryToolbarButton presentationMode visibleLargeView" title="Switch to Presentation Mode" tabindex="51" data-l10n-id="presentation_mode"> <span data-l10n-id="presentation_mode_label">Presentation Mode</span> </button> <button id="secondaryOpenFile" class="secondaryToolbarButton openFile visibleLargeView" title="Open File" tabindex="52" data-l10n-id="open_file"> <span data-l10n-id="open_file_label">Open</span> </button> <button id="secondaryPrint" class="secondaryToolbarButton print visibleMediumView" title="Print" tabindex="53" data-l10n-id="print"> <span data-l10n-id="print_label">Print</span> </button> <button id="secondaryDownload" class="secondaryToolbarButton download visibleMediumView" title="Download" tabindex="54" data-l10n-id="download"> <span data-l10n-id="download_label">Download</span> </button> <a href="#" id="secondaryViewBookmark" class="secondaryToolbarButton bookmark visibleSmallView" title="Current view (copy or open in new window)" tabindex="55" data-l10n-id="bookmark"> <span data-l10n-id="bookmark_label">Current View</span> </a> <div class="horizontalToolbarSeparator visibleLargeView"></div> <button id="firstPage" class="secondaryToolbarButton firstPage" title="Go to First Page" tabindex="56" data-l10n-id="first_page"> <span data-l10n-id="first_page_label">Go to First Page</span> </button> <button id="lastPage" class="secondaryToolbarButton lastPage" title="Go to Last Page" tabindex="57" data-l10n-id="last_page"> <span data-l10n-id="last_page_label">Go to Last Page</span> </button> <div class="horizontalToolbarSeparator"></div> <button id="pageRotateCw" class="secondaryToolbarButton rotateCw" title="Rotate Clockwise" tabindex="58" data-l10n-id="page_rotate_cw"> <span data-l10n-id="page_rotate_cw_label">Rotate Clockwise</span> </button> <button id="pageRotateCcw" class="secondaryToolbarButton rotateCcw" title="Rotate Counterclockwise" tabindex="59" data-l10n-id="page_rotate_ccw"> <span data-l10n-id="page_rotate_ccw_label">Rotate Counterclockwise</span> </button> <div class="horizontalToolbarSeparator"></div> <button id="cursorSelectTool" class="secondaryToolbarButton selectTool toggled" title="Enable Text Selection Tool" tabindex="60" data-l10n-id="cursor_text_select_tool"> <span data-l10n-id="cursor_text_select_tool_label">Text Selection Tool</span> </button> <button id="cursorHandTool" class="secondaryToolbarButton handTool" title="Enable Hand Tool" tabindex="61" data-l10n-id="cursor_hand_tool"> <span data-l10n-id="cursor_hand_tool_label">Hand Tool</span> </button> <div class="horizontalToolbarSeparator"></div> <button id="documentProperties" class="secondaryToolbarButton documentProperties" title="Document Properties…" tabindex="62" data-l10n-id="document_properties"> <span data-l10n-id="document_properties_label">Document Properties…</span> </button> </div> </div> <!-- secondaryToolbar --> <div class="toolbar"> <div id="toolbarContainer"> <div id="toolbarViewer"> <div id="toolbarViewerLeft"> <button id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar" tabindex="11" data-l10n-id="toggle_sidebar"> <span data-l10n-id="toggle_sidebar_label">Toggle Sidebar</span> </button> <div class="toolbarButtonSpacer"></div> <button id="viewFind" class="toolbarButton" title="Find in Document" tabindex="12" data-l10n-id="findbar"> <span data-l10n-id="findbar_label">Find</span> </button> <div class="splitToolbarButton hiddenSmallView"> <button class="toolbarButton pageUp" title="Previous Page" id="previous" tabindex="13" data-l10n-id="previous"> <span data-l10n-id="previous_label">Previous</span> </button> <div class="splitToolbarButtonSeparator"></div> <button class="toolbarButton pageDown" title="Next Page" id="next" tabindex="14" data-l10n-id="next"> <span data-l10n-id="next_label">Next</span> </button> </div> <input type="number" id="pageNumber" class="toolbarField pageNumber" title="Page" value="1" size="4" min="1" tabindex="15" data-l10n-id="page"> <span id="numPages" class="toolbarLabel"></span> </div> <div id="toolbarViewerRight"> <button id="presentationMode" class="toolbarButton presentationMode hiddenLargeView" title="Switch to Presentation Mode" tabindex="31" data-l10n-id="presentation_mode"> <span data-l10n-id="presentation_mode_label">Presentation Mode</span> </button> <button id="openFile" class="toolbarButton openFile hiddenLargeView" title="Open File" tabindex="32" data-l10n-id="open_file"> <span data-l10n-id="open_file_label">Open</span> </button> <button id="print" class="toolbarButton print hiddenMediumView" title="Print" tabindex="33" data-l10n-id="print"> <span data-l10n-id="print_label">Print</span> </button> <button id="download" class="toolbarButton download hiddenMediumView" title="Download" tabindex="34" data-l10n-id="download"> <span data-l10n-id="download_label">Download</span> </button> <a href="#" id="viewBookmark" class="toolbarButton bookmark hiddenSmallView" title="Current view (copy or open in new window)" tabindex="35" data-l10n-id="bookmark"> <span data-l10n-id="bookmark_label">Current View</span> </a> <div class="verticalToolbarSeparator hiddenSmallView"></div> <button id="secondaryToolbarToggle" class="toolbarButton" title="Tools" tabindex="36" data-l10n-id="tools"> <span data-l10n-id="tools_label">Tools</span> </button> </div> <div id="toolbarViewerMiddle"> <div class="splitToolbarButton"> <button id="zoomOut" class="toolbarButton zoomOut" title="Zoom Out" tabindex="21" data-l10n-id="zoom_out"> <span data-l10n-id="zoom_out_label">Zoom Out</span> </button> <div class="splitToolbarButtonSeparator"></div> <button id="zoomIn" class="toolbarButton zoomIn" title="Zoom In" tabindex="22" data-l10n-id="zoom_in"> <span data-l10n-id="zoom_in_label">Zoom In</span> </button> </div> <span id="scaleSelectContainer" class="dropdownToolbarButton"> <select id="scaleSelect" title="Zoom" tabindex="23" data-l10n-id="zoom"> <option id="pageAutoOption" title="" value="auto" selected="selected" data-l10n-id="page_scale_auto">Automatic Zoom</option> <option id="pageActualOption" title="" value="page-actual" data-l10n-id="page_scale_actual">Actual Size</option> <option id="pageFitOption" title="" value="page-fit" data-l10n-id="page_scale_fit">Page Fit</option> <option id="pageWidthOption" title="" value="page-width" data-l10n-id="page_scale_width">Page Width</option> <option id="customScaleOption" title="" value="custom" disabled="disabled" hidden="true"></option> <option title="" value="0.5" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 50 }'>50%</option> <option title="" value="0.75" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 75 }'>75%</option> <option title="" value="1" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 100 }'>100%</option> <option title="" value="1.25" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 125 }'>125%</option> <option title="" value="1.5" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 150 }'>150%</option> <option title="" value="2" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 200 }'>200%</option> <option title="" value="3" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 300 }'>300%</option> <option title="" value="4" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 400 }'>400%</option> </select> </span> </div> </div> <div id="loadingBar"> <div class="progress"> <div class="glimmer"> </div> </div> </div> </div> </div> <menu type="context" id="viewerContextMenu"> <menuitem id="contextFirstPage" label="First Page" data-l10n-id="first_page"></menuitem> <menuitem id="contextLastPage" label="Last Page" data-l10n-id="last_page"></menuitem> <menuitem id="contextPageRotateCw" label="Rotate Clockwise" data-l10n-id="page_rotate_cw"></menuitem> <menuitem id="contextPageRotateCcw" label="Rotate Counter-Clockwise" data-l10n-id="page_rotate_ccw"></menuitem> </menu> <div id="viewerContainer" tabindex="0"> <div id="viewer" class="pdfViewer"></div> </div> <div id="errorWrapper" hidden='true'> <div id="errorMessageLeft"> <span id="errorMessage"></span> <button id="errorShowMore" data-l10n-id="error_more_info"> More Information </button> <button id="errorShowLess" data-l10n-id="error_less_info" hidden='true'> Less Information </button> </div> <div id="errorMessageRight"> <button id="errorClose" data-l10n-id="error_close"> Close </button> </div> <div class="clearBoth"></div> <textarea id="errorMoreInfo" hidden='true' readonly="readonly"></textarea> </div> </div> <!-- mainContainer --> <div id="overlayContainer" class="hidden"> <div id="passwordOverlay" class="container hidden"> <div class="dialog"> <div class="row"> <p id="passwordText" data-l10n-id="password_label">Enter the password to open this PDF file:</p> </div> <div class="row"> <input type="password" id="password" class="toolbarField"> </div> <div class="buttonRow"> <button id="passwordCancel" class="overlayButton"><span data-l10n-id="password_cancel">Cancel</span></button> <button id="passwordSubmit" class="overlayButton"><span data-l10n-id="password_ok">OK</span></button> </div> </div> </div> <div id="documentPropertiesOverlay" class="container hidden"> <div class="dialog"> <div class="row"> <span data-l10n-id="document_properties_file_name">File name:</span> <p id="fileNameField">-</p> </div> <div class="row"> <span data-l10n-id="document_properties_file_size">File size:</span> <p id="fileSizeField">-</p> </div> <div class="separator"></div> <div class="row"> <span data-l10n-id="document_properties_title">Title:</span> <p id="titleField">-</p> </div> <div class="row"> <span data-l10n-id="document_properties_author">Author:</span> <p id="authorField">-</p> </div> <div class="row"> <span data-l10n-id="document_properties_subject">Subject:</span> <p id="subjectField">-</p> </div> <div class="row"> <span data-l10n-id="document_properties_keywords">Keywords:</span> <p id="keywordsField">-</p> </div> <div class="row"> <span data-l10n-id="document_properties_creation_date">Creation Date:</span> <p id="creationDateField">-</p> </div> <div class="row"> <span data-l10n-id="document_properties_modification_date">Modification Date:</span> <p id="modificationDateField">-</p> </div> <div class="row"> <span data-l10n-id="document_properties_creator">Creator:</span> <p id="creatorField">-</p> </div> <div class="separator"></div> <div class="row"> <span data-l10n-id="document_properties_producer">PDF Producer:</span> <p id="producerField">-</p> </div> <div class="row"> <span data-l10n-id="document_properties_version">PDF Version:</span> <p id="versionField">-</p> </div> <div class="row"> <span data-l10n-id="document_properties_page_count">Page Count:</span> <p id="pageCountField">-</p> </div> <div class="buttonRow"> <button id="documentPropertiesClose" class="overlayButton"><span data-l10n-id="document_properties_close">Close</span></button> </div> </div> </div> <div id="printServiceOverlay" class="container hidden"> <div class="dialog"> <div class="row"> <span data-l10n-id="print_progress_message">Preparing document for printing…</span> </div> <div class="row"> <progress value="0" max="100"></progress> <span data-l10n-id="print_progress_percent" data-l10n-args='{ "progress": 0 }' class="relative-progress">0%</span> </div> <div class="buttonRow"> <button id="printCancel" class="overlayButton"><span data-l10n-id="print_progress_close">Cancel</span></button> </div> </div> </div> </div> <!-- overlayContainer --> </div> <!-- outerContainer --> <div id="printContainer"></div> </body> ```
store参数的传递
<p><br><img src="/upload/attachment/127723/69047bb4-7133-3ff8-9256-0a12b3a6e382.png" alt=""><br>现在我已经把tbar加到window上了,</p> <p>window主要代码如下:</p> <p>tbar:['-',text_search,'-',btn_search],<br>items :[add_form]</p> <p> ------------------------------------------------------------</p> <p>var text_search= new Ext.form.TextField({<br>                name : 'textsearch',<br>                width : 200,<br>                emptyText : '请输入客户编号或名称!',<br>                listeners : {<br>                        'specialkey' : function(field, e) {<br>                            if (e.getKey() == Ext.EventObject.ENTER) {<br>                                        search();<br>                             }<br>                      }<br>                 }<br> });</p> <p>var search = function() {<br>    var conditional = text_search.getValue();<br>    taskCustomerStore.load({<br>            params : {<br>                 conditional : conditional       <br>            }<br>    });<br>};</p> <p>var btn_search= new Ext.Button({<br>    text : '查询',<br>    iconCls : 'icon-search',<br>    handler : search<br>});</p> <p>---------------------------------------------------</p> <p>var taskCustomerStore = new Ext.data.Store({<br>                    url : 'xxxx.action',<br>                    reader : new Ext.data.JsonReader({<br>                        root : 'root'<br>                    }, [{<br>                        name : 'CUSTOMERID',<br>                        type : 'string'<br>                    }, {<br>                        name : 'CUSTOMERNAME',<br>                        type : 'string'<br>                    }])<br>           });</p> <p>-------------------------------------------------------</p> <p>add_form上的多选下拉控件,我想用文本输入框模糊查询的结果集来做这里面的store,</p> <p>但是在后台取数据的时候,点击查询能得到文本框输入的内容conditional,但是在单击</p> <p>下拉列表框的时候后台的conditional为空,我想问的是怎么把查询的结果集</p> <p>(包含模糊查询的conditional)作为新的store,即store是随时更新的</p> <p>xtype : 'multicombo',<br>   width : 150,<br>   store : taskCustomerStore,<br>   fieldLabel : '包含客户',<br>   // valueField : 'CUSTOMERID',<br>   // displayField : 'CUSTOMERNAME',<br>   valueField : 'BRANCH_ID',<br>   displayField : 'BRANCH_NAME',<br>   allowBlank : false,<br>   editable : true,<br>   labelSeparator : ':',<br>   displaySeparator : ';',<br>   valueSeparator : ',',<br>   hiddenName : 'multicomboMapCust',<br>   mode : 'remote',<br>   triggerAction : 'all',<br>   allowBlank : true,<br>   loadingText : '加载中...',<br>   emptyText : '请选择',<br>   listeners : {<br>    'select' : function(multicombo, record, index) {<br>     multicomboMapCust = Ext.get('multicomboMapCust').getValue();<br>    }<br>   }<br>  }</p><br /><strong>问题补充:</strong><br />tbar的文本框输入的内容作为查询条件,单击查询按钮之后执行查询和store的更新,使多选下拉框的store是查询出来的结果<br /><strong>问题补充:</strong><br />------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ <br />一共就有一个store,这个store是下拉框的store <br /> <br />我想用文本框输入的内容作为查询条件,点击查询后,会查询出来一个结果集,查询按钮执行的是store的load方法,我想把这个结果集作为新的store<br /><strong>问题补充:</strong><br />qq911110 <br />现在问题不出在search方法上 <br />现在的问题是怎么把查询按钮的结果作为新的store <br />或者说是把文本框输入的内容传递给form里面下拉框的stor<br /><strong>问题补充:</strong><br />调用reload了,可是在form里面还是取不到文本框输入的值<br /><strong>问题补充:</strong><br />在window、的tbar上查询按钮单击的时候能取到值,但是在form里面的下拉俩表中取不到<br /><strong>问题补充:</strong><br />我要把查询的结果展示在 包含客户的下拉列表里面 <br /> <br /> <br />可是下拉列表里面是空的<br /><strong>问题补充:</strong><br /> <br /><img src="/upload/attachment/128076/d943910b-a24f-3c54-9193-ec53ad376cda.png" /> <br />现在的情况: <br /><pre name="code" class="java"> Connection - {conn-100019} Connection Connection - {conn-100019} Preparing Statement: SELECT * FROM TB_CUSTOMER_INFO where CUSTOMERNAME LIKE '%' || ? || '%' PreparedStatement - {pstm-100020} Executing Statement: SELECT * FROM TB_CUSTOMER_INFO where CUSTOMERNAME LIKE '%' || ? || '%' PreparedStatement - {pstm-100020} Parameters: [周村李] PreparedStatement - {pstm-100020} Types: [java.lang.String] ResultSet - {rset-100021} ResultSet ResultSet - {rset-100021} Header: [CUSTOMERID, CUSTOMERNAME, SHORT_CODE, CUSTOMERADD, CUSTOMERTEL, CUSTOMEROPERATOR, CUSTOMERTYPE, MANAGER_ID, CUSTOMERREGION, STATUS, BRANCH_ID, MARKET_ID, HIGH_BRANCH_ID] ResultSet - {rset-100021} Result: [1037030200624, 周村李娟商店, 1037030200624, 周村区萌水镇东李村, 13573341904, 李娟, 01024, 103703020003, 周村淄川大车04上午, 02, 03020100, null, null] ResultSet - {rset-100021} Result: [1037030200367, 周村李继德商店, 1037030200367, 周村区东门路87号, h13678634711, 李继德, 0501101, 103703020001, 周村淄川大车01上午, 02, 03020100, null, null] ResultSet - {rset-100021} Result: [1037030201076, 周村李执学百货店, 1037030201076, 周村区萌水镇官三村41号, 13455325428, 李执学, 01023, 103703020003, 周村淄川大车05上午, 02, 03020100, null, null] ResultSet - {rset-100021} Result: [1037030200682, 周村李贤珍商店, 1037030200682, 周村区辛街8号楼前, 2615673, 李贤珍, 0101101, 103703020001, 周村淄川大车09上午, 02, 03020100, null, null] ResultSet - {rset-100021} Result: [1037030201380, 周村李纪云百货店, 1037030201380, 周村区周隆路莫家庄16号, 6820444, 李纪云, 01023, 103703020001, 周村淄川大车02上午, 02, 03020100, null, null] ResultSet - {rset-100021} Result: [1037030201844, 周村李彬商店, 1037030201844, 萌水镇西衣村116号, 13864354663, 李彬, 01024, 103703020003, 周村淄川大车10上午, 02, 03020100, null, null] ResultSet - {rset-100021} Result: [1037030201176, 周村李家村英保综合商店, 1037030201176, 周村区南郊镇李家村, 15315231751, 侯英保, 01023, null, null, 03, 03020100, null, null] ResultSet - {rset-100021} Result: [1037030201701, 周村李庄代销店, 1037030201701, 萌水镇三衣大街中段, 6885026, 李庄, 01023, 103703020003, 周村淄川大车10上午, 02, 03020100, null, null] ResultSet - {rset-100021} Result: [1037030201935, 周村李卫百货店, 1037030201935, 周村青年路办事处东马村1-74号, 13953374622, 李卫, 0102301, 103703010008, 周村淄川大车05上午, 02, 03020100, null, null] ResultSet - {rset-100021} Result: [1037030201856, 周村李蒙百货店, 1037030201856, 周村南郊镇张楼村7号, 13884629332, 韩美, 01023, 103703020003, 周村淄川大车05上午, 02, 03020100, null, null] I18nInterceptor - after Locale=zh_CN I18nInterceptor - intercept } </pre> <br />这是我在点多选下拉列表的时候后台输出的值,可是在前台下拉列表里面没有数据 <br /><br /><strong>问题补充:</strong><br />我按照你说的,检查了 后台输出没错吧,前台的store里面也指定了josn格式 <br />配置也没错
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
开源一个功能完整的SpringBoot项目框架
福利来了,给大家带来一个福利。 最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户模块,权限模块,菜单模块,功能模块也齐全了,每一个功能都是完整的。 打算把这个框架分享出来,供大家使用和学习。 为什么用框架? 框架可以学习整体
源码阅读(19):Java中主要的Map结构——HashMap容器(下1)
(接上文《源码阅读(18):Java中主要的Map结构——HashMap容器(中)》) 3.4.4、HashMap添加K-V键值对(红黑树方式) 上文我们介绍了在HashMap中table数组的某个索引位上,基于单向链表添加新的K-V键值对对象(HashMap.Node&lt;K, V&gt;类的实例),但是我们同时知道在某些的场景下,HashMap中table数据的某个索引位上,数据是按照红黑树
c++制作的植物大战僵尸,开源,一代二代结合游戏
    此游戏全部由本人自己制作完成。游戏大部分的素材来源于原版游戏素材,少部分搜集于网络,以及自己制作。 此游戏为同人游戏而且仅供学习交流使用,任何人未经授权,不得对本游戏进行更改、盗用等,否则后果自负。 目前有六种僵尸和六种植物,植物和僵尸的动画都是本人做的。qq:2117610943 开源代码下载 提取码:3vzm 点击下载--&gt; 11月28日 新增四种植物 统一植物画风,全部修
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
深度学习图像算法在内容安全领域的应用
互联网给人们生活带来便利的同时也隐含了大量不良信息,防范互联网平台有害内容传播引起了多方面的高度关注。本次演讲从技术层面分享网易易盾在内容安全领域的算法实践经验,包括深度学习图
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 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孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程实用技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法,并会持续更新。
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
"狗屁不通文章生成器"登顶GitHub热榜,分分钟写出万字形式主义大作
前言 GitHub 被誉为全球最大的同性交友网站,……,陪伴我们已经走过 10+ 年时间,它托管了大量的软件代码,同时也承载了程序员无尽的欢乐。 上周给大家分享了一篇10个让你笑的合不拢嘴的Github项目,而且还拿了7万+个Star哦,有兴趣的朋友,可以看看, 印象最深刻的是 “ 呼吸不止,码字不停 ”: 老实交代,你是不是经常准备写个技术博客,打开word后瞬间灵感便秘,码不出字? 有什么
推荐几款比较实用的工具,网站
1.盘百度PanDownload 这个云盘工具是免费的,可以进行资源搜索,提速(偶尔会抽风????) 不要去某站买付费的???? PanDownload下载地址 2.BeJSON 这是一款拥有各种在线工具的网站,推荐它的主要原因是网站简洁,功能齐全,广告相比其他广告好太多了 bejson网站 3.二维码美化 这个网站的二维码美化很好看,网站界面也很...
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
Spring Security 实战干货:基于注解的接口角色访问控制
1. 前言 欢迎阅读 Spring Security 实战干货[1] 系列文章 。在上一篇 基于配置的接口角色访问控制[2] 我们讲解了如何通过 javaConfig 的方式配置接口的角色访问控制。其实还有一种更加灵活的配置方式 基于注解 。今天我们就来探讨一下。DEMO 获取方式在文末。 2. Spring Security 方法安全 Spring Security 基于注解的安全...
相关热词 c#处理浮点数 c# 生成字母数字随机数 c# 动态曲线 控件 c# oracle 开发 c#选择字体大小的控件 c# usb 批量传输 c#10进制转8进制 c#转base64 c# 科学计算 c#下拉列表获取串口
立即提问