2012-08-13 68 views
2

对于如何编程,我有点困惑。我有一个类扩展JFrame与两个文本框。我希望能够从JFrame获得输入。不知何故,只是等待我的mainMaybe类的输入...任何想法?从JFrame获取输入

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 
import javax.swing.JTextField; 


public class mainMaybe extends JFrame{ 
    JTextField login; 
    JTextField pass; 

    public mainMaybe() throws InterruptedException{ 
     login = new JTextField(); 
     pass = new JTextField(); 
     pass.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent arg0) { 
       System.out.println("DO SOMETHING"); 
      }  
     }); 
     add(login,BorderLayout.NORTH); 
     add(pass,BorderLayout.SOUTH); 
     pack(); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void returnEmail(){ 
     //SOME HOW WAIT FOR THE ACTION LISTENER? 
    } 

    public static void main(String[] args) throws InterruptedException { 
     new mainMaybe().returnEmail(); 
     //CONTROL SHOULD STAY WITH mainMaybe until an email is returned   
    } 

} 

回答

8

Java Swing基于event-driven architecture的概念。因此,事件触发行为并基于这些事件执行某种操作。

Using Swing Component将是一个很好的点开始理解,并因此实现你想实现你的UI和它的相应行为。所以我建议你稍微阅读一下,然后尝试解决你想要达到的目标。

我不太确定你想要达到的目标,但如果我是你,我会有两个文本字段,也许有一些标签附加到它和一个“提交”按钮。我会添加一个ActionListener到这个按钮来执行某种操作。

也许SSCCE可能会帮助您开始。所以,看看下面的代码:

package com.test; 

import javax.swing.JOptionPane; 

public class SimpleUI extends javax.swing.JFrame { 

    /** 
    * Creates new form SimpleUI 
    */ 
    public SimpleUI() { 
     initComponents(); 
    } 

    private void initComponents() { 

     mainPanel = new javax.swing.JPanel(); 
     labelName = new javax.swing.JLabel(); 
     textName = new javax.swing.JTextField(); 
     jLabel1 = new javax.swing.JLabel(); 
     textPassword = new javax.swing.JPasswordField(); 
     jButton1 = new javax.swing.JButton(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     mainPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 2, 2, 2)); 

     labelName.setText("Name: "); 

     jLabel1.setText("Password: "); 

     jButton1.setText("Submit"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel); 
     mainPanel.setLayout(mainPanelLayout); 
     mainPanelLayout.setHorizontalGroup(
      mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(mainPanelLayout.createSequentialGroup() 
       .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addComponent(labelName) 
        .addComponent(jLabel1)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) 
        .addComponent(textName) 
        .addComponent(textPassword, javax.swing.GroupLayout.DEFAULT_SIZE, 195, Short.MAX_VALUE)) 
       .addGap(18, 18, 18) 
       .addComponent(jButton1) 
       .addGap(0, 65, Short.MAX_VALUE)) 
     ); 
     mainPanelLayout.setVerticalGroup(
      mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(mainPanelLayout.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(labelName) 
        .addComponent(textName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(jLabel1) 
        .addComponent(textPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(jButton1)) 
       .addContainerGap(15, Short.MAX_VALUE)) 
     ); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(mainPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(mainPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
     ); 

     pack(); 
    } 


    /** 
    * This is the method that is called when an action is performed. 
    * Over here I just simply show an error message if any of the text fields are empty or just show their names. 
    */ 
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
     String name   = textName.getText(); 
     String password  = String.valueOf(textPassword.getPassword()); 

     if("".equals(password) || "".equals(name)){ 
      JOptionPane.showMessageDialog(this, "Name or password is empty!", "Incorrect Input", JOptionPane.ERROR_MESSAGE); 
     }else{ 
      JOptionPane.showMessageDialog(this, "Hello "+name+" with password "+password, "Incorrect Input", JOptionPane.PLAIN_MESSAGE); 
     } 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 

     try { 
      javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(SimpleUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(SimpleUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(SimpleUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(SimpleUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 


     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new SimpleUI().setVisible(true); 
      } 
     }); 
    } 

    private javax.swing.JButton jButton1; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JLabel labelName; 
    private javax.swing.JPanel mainPanel; 
    private javax.swing.JTextField textName; 
    private javax.swing.JPasswordField textPassword; 

} 

注意:我生成使用NetBeans IDE的代码,所以我没有处理很多关于布局或任何东西。如果您想了解布局,这里是一个有趣的教程:"A Visual Guide to Layout Managers"

主要的想法对我来说是向您展示事件是如何引发的。所以我做的是我在我的“提交”按钮中添加了一个actionlistener,当有人点击按钮时,我执行某种操作。希望你得到的照片。

+1

+1理解的问题(和一个不错的答案) – MadProgrammer 2012-08-13 04:00:56

+0

@MadProgrammer - 谢谢! :) – Sujay 2012-08-13 04:04:46

+0

好的,在事件被触发之后......我如何告诉我的“主”,以及如何告诉这个主要等待事件被触发? – user1000232 2012-08-13 04:09:24

4

我认为你的设计方法错了。在Java GUI(以及大多数类似的技术)中,您不会说“等待电子邮件地址”,而是说“当您收到电子邮件地址时告诉我”。

您在将文本框添加侦听程序的过程中会遇到一些问题 - 基本上,您希望侦听程序在texbox中的值发生更改时“触发”。听众的实现会做一些事情 - 例如,将电子邮件地址写入CONSOL然后退出。

+0

+1理解的问题(和一个不错的答案) – MadProgrammer 2012-08-13 04:01:36

3

替代方法,使用模态对话框(或更确切地说,其中两个)。

import javax.swing.*; 

public class LoginPrompt { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       String username = JOptionPane.showInputDialog(null, "User Name"); 
       System.out.println("Username: " + username); 

       JPasswordField passwordField = new JPasswordField(8); 
       // a bit quirky, we need to tab to the field 
       JOptionPane.showMessageDialog(null, passwordField, "Password", 
         JOptionPane.QUESTION_MESSAGE); 
       char[] password = null; 
       password = passwordField.getPassword(); 
       System.out.println("Password: " + String.valueOf(password)); 
      } 
     }); 
    } 
} 
+1

我喜欢这个解决方案。它非常不同而且很短。但出于某种原因,我不喜欢用多个对话框来错误地使用我的用户。我知道这是个人喜好的问题,但我不知何故会让我的用户通过一个简单的用户界面,而不是将多个对话框扔在他身上。你怎么看待这件事? – Sujay 2012-08-13 04:29:53

+0

@Sujay *“不喜欢使用多个对话框来bug我的用户”*完全同意。只是想显示两种不同类型的输入对话框。我喜欢第一个的简单性,但第二个更加开放地显示这两个领域(它可以采用一个面板)。顺便说一下,你的答案是最好的。完全应得的'剔'。 :) – 2012-08-13 04:41:39

+0

@AndrewThomson - 谢谢!我只是想知道别人的想法有关使用对话框:) – Sujay 2012-08-13 04:48:31