2012-05-05 11 views

Respuesta

10

Aquí probar este pequeño programa, intenta hacer clic en el inicio del estudiante: //, que aparecerá un mensaje de diálogo

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class TextAreaExample extends JFrame 
{ 
    private JTextArea tarea = new JTextArea(10, 10); 
    private JTextField tfield = new JTextField(10); 

    private void createAndDisplayGUI() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     tarea.setText("Hello there\n"); 
     tarea.append("Hello student://"); 
     JScrollPane scroll = new JScrollPane(tarea); 

     tfield.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       tarea.append(tfield.getText() + "\n"); 
      } 
     }); 

     tarea.addMouseListener(new MouseAdapter() 
     { 
      public void mouseClicked(MouseEvent me) 
      { 
       int x = me.getX(); 
       int y = me.getY(); 
       System.out.println("X : " + x); 
       System.out.println("Y : " + y); 
       int startOffset = tarea.viewToModel(new Point(x, y)); 
       System.out.println("Start Offset : " + startOffset); 
       String text = tarea.getText(); 
       int searchLocation = text.indexOf("student://", startOffset); 
       System.out.println("Search Location : " + searchLocation); 
       if (searchLocation == startOffset) 
        JOptionPane.showMessageDialog(TextAreaExample.this, "BINGO you found me."); 
      } 
     }); 

     getContentPane().add(scroll, BorderLayout.CENTER); 
     getContentPane().add(tfield, BorderLayout.PAGE_END); 
     pack(); 
     setLocationByPlatform(true); 
     setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new TextAreaExample().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 
+0

@ user1266039: Pruebe este pequeño programa, simplemente haga clic antes de student: //, y aparecerá un mensaje emergente :-) –

+0

gracias, parece muy bien. Lo intentaré. –

+0

jeje, usted es la MÁS BIENVENIDA y MANTENTE SONRIENTE :-) –

2

No, ni siquiera consideres esto ya que los ActionListeners son para JButtons o cualquier otra cosa derivada de AbstractButton pero no para JTextComponents (excepto para JTextFields). Tal vez quieras un MouseListener.

Habiendo dicho esto, tal vez sea mejor con dos componentes de texto, un JTextArea para mostrar todas las respuestas, incluida la del usuario, y justo debajo de esta en un tipo de posición BorderLayout.SOUTH, un JTextField para permitir al usuario para ingresar texto en el chat Luego, dale a JTextField un ActionListener (esto es legal) para que "enter" active al oyente.

Editar 1
usted Estado:

Bueno, yo he JTextField que, en el texto se envía al servidor y el servidor envía el mensaje a todos los clientes que aparece en el JTextArea. Pero mi problema está aquí: quiero abrir una ventana emergente cuando alguien hace clic en un alumno: // id text.

Sí, mirando sus comentarios, mi voto es para que usted no muestre los chats en un JTextArea sino en un JList, uno con un SelectionListener. Luego puede responder fácilmente a los eventos de clic del mouse y obtendrá más fácilmente información útil de la "línea" en la que se hizo clic (si llena la Lista J con objetos inteligentes). Tendrá que escribir un procesador de celdas personalizado que permita que se muestren varias líneas de texto, probablemente una que muestre un JTextArea, pero el tutorial de JLists lo ayudará a comenzar con esto.

+0

Si usted es MouseListener derecho podría funcionar, pero ¿cómo puedo realizar una acción con él cuando hago clic en un texto que se ve como student: // id? –

+0

@ user1266039: ¿por qué quieres este comportamiento? ¿Cuál es el objetivo general de esto? No estoy diciendo que lo que solicite no se pueda hacer, pero requerirá un poco de trabajo, y el comportamiento suena un poco gracioso ya que la mayoría de las aplicaciones de chat con las que estoy familiarizado no tienen esta funcionalidad. –

+1

Sospecho que OP quiere que el chat sea algo así como un hipervínculo :-) – COD3BOY

1

Está presionando ENTER en lugar de hacer clic con el botón del mouse, ¿está bien?

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class StudentID extends JFrame implements ActionListener 
{ 
    private static final String progname = "StudentID 0.1"; 

    private JTextField student; 
    private JTextArea feedback; 
    private JButton exit; 

    public StudentID() 
    { 
     super (progname); 
     JPanel mainpanel = new JPanel(); 
     mainpanel.setLayout (new BorderLayout()); 
     this.getContentPane().add (mainpanel); 

     student = new JTextField ("student://"); 
     exit = new JButton ("exit"); 
     student.addActionListener (this); 
     exit.addActionListener (this); 
     feedback = new JTextArea(); 
     mainpanel.add (student, BorderLayout.NORTH); 
     mainpanel.add (feedback, BorderLayout.CENTER); 
     mainpanel.add (exit, BorderLayout.SOUTH); 

     setSize (400, 400); 
     setLocation (100, 100); 
     setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     setVisible (true); 
    } 

    public void actionPerformed (final ActionEvent e) 
    { 
     SwingWorker worker = new SwingWorker() 
     { 
      protected String doInBackground() throws InterruptedException 
      { 
       String cmd = e.getActionCommand(); 
       if (cmd.equals ("exit")) 
       { 
        System.exit (0); 
       } 
       else if (cmd.matches ("student://[0-9]+")) 
       { 
        feedback.setText ("student found: " + cmd.replaceAll ("student://([0-9]+)", "$1")); 
       } 
       else 
       { 
        feedback.setText ("cmd: " + cmd); 
       } 
       return "done"; 
      } 
      protected void done() 
      { 
       feedback.setText (feedback.getText() + "\ndone"); 
      } 
     }; 
     worker.execute(); 
    } 

    public static void main (final String args[]) 
    { 
     Runnable runner = new Runnable() 
     { 
      public void run() 
      { 
       new StudentID(); 
      } 
     }; 
     EventQueue.invokeLater (runner); 
    } 
} 
Cuestiones relacionadas