Solved

i have a problem with methods

Posted on 2003-11-12
18
423 Views
Last Modified: 2012-08-13
i cant set the nickname of the user in this program can anybody help me please


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.net.*;

class Client extends JFrame implements ActionListener
{
    JButton send=new JButton("Send");
    JLabel beyekteb=new JLabel(" ");
    JTextArea itext=new JTextArea(4, 20);
    JTextArea dtext=new JTextArea(15, 20);
    JTextField bob=new JTextField(10);
    Nick nickName=new Nick();
    JMenuBar bar=new JMenuBar();
    JMenu file=new JMenu("File");
    JMenu help=new JMenu("Help");
    JMenuItem nick=new JMenuItem("Change Nick");
    JMenuItem about=new JMenuItem("About");
    Socket socket=null;
    PrintWriter out=null;
    BufferedReader in=null;
    String line;
    String n;
    Date now = new Date();
    JScrollPane scroll= new JScrollPane(dtext);
       
   
   
    Client()
    {
        super("Client");
        bar.add(file);
        bar.add(help);
        file.add(nick);
        dtext.setEditable(false);
        send.addActionListener(this);
        nick.addActionListener(this);
        itext.setBorder(BorderFactory.createEtchedBorder());
        dtext.setBorder(BorderFactory.createEtchedBorder());
        BorderLayout bord=new BorderLayout();
        BorderLayout bord1=new BorderLayout();
        BorderLayout bord2=new BorderLayout();
        JPanel pane2=new JPanel();
        pane2.setLayout(bord);
        pane2.add(itext);
        pane2.add("East", send);
        JPanel pane1=new JPanel();
        pane1.setLayout(bord1);
        pane1.add("North",scroll);
        pane1.add(pane2);
        pane1.add("South", beyekteb);
        JPanel pane=new JPanel();
        pane.setLayout(bord2);
        pane.add("North", bar);
        pane.add(pane1);
        setContentPane(pane);
    }
     
     public void listenSocket(){  
       
        try
        {
            socket=new Socket("localhost",1348);
            in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out=new PrintWriter(socket.getOutputStream(), true);
           
         
           for(int i=0;i<5000;i++)
           {  line=in.readLine();
              dtext.append("\nAshraf:"+line);
        }
               
           
           
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
     
    public static void main(String [] args)
    {
        Client client=new Client();
        client.setTitle("Client Program");
        WindowListener l = new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                        System.exit(0);
                }
        };

        client.addWindowListener(l);
        client.pack();
        client.setVisible(true);
      client.listenSocket();
    }
   
    public void setNick(String n)
     {
         this.n=n;
     }
    public void actionPerformed(ActionEvent e)
    {
        Object source=e.getSource();
        if(source==send)
        {  
            String input=itext.getText();
            out.println(input);
            dtext.append("\n"+n+":"+input);
            itext.setText("");
            beyekteb.setText("Your Chat Started at "+now);
        }
        if(source==nick)
        {
            nickName.setVisible(true);
        }
       
       
    }
   
}

class Nick extends JFrame implements ActionListener
{
    JButton set=new JButton("Set");
    JLabel label=new JLabel("New Nick");
    JTextField text=new JTextField(10);
    String n;
    Client client;
   
    Nick()
    {
        super("Change Nick");
        set.addActionListener(this);
        BorderLayout bord=new BorderLayout();
        FlowLayout flow=new FlowLayout();
        JPanel pane1=new JPanel();
        pane1.setLayout(flow);
        pane1.add(label);
        pane1.add(text);
        JPanel pane=new JPanel();
        pane.setLayout(bord);
        pane.add(pane1);
        pane.add("South", set);
        setContentPane(pane);
        pack();
        setVisible(false);
    }
   
   public void actionPerformed(ActionEvent e) {
        client=new Client();
        Object source=e.getSource();
        if(source==set)
        {
            n=text.getText();
            client.setNick(n);
            setVisible(false);
        }
    }
}
       
       
0
Comment
Question by:omashhour
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 5
  • 4
  • +2
18 Comments
 
LVL 86

Expert Comment

by:CEHJ
ID: 9733652
As far as I can see on a quick look through:

>> 
     public void setNick(String n)
     {
         this.n=n;
     }

>>

does not alter the actual menu item
0
 
LVL 1

Expert Comment

by:MistahMilla
ID: 9733712
Change the variable name that you are passing in to something like newn or tempn, so that the name of the temporary variable is not the same as the name of the variable in the class. As in:

public void setNick(String tempn)
     {
         this.n=tempn;
     }
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 9733743
How will that help?

Certainly though, your code should be self-documenting. A variable name of 'n', (including yourself later) anything.

Sometimes you *may* see this sort of thing, but usually it'll be a method one, perhaps used only once.
0
Online Training Solution

Drastically shorten your training time with WalkMe's advanced online training solution that Guides your trainees to action. Forget about retraining and skyrocket knowledge retention rates.

 
LVL 1

Expert Comment

by:MistahMilla
ID: 9733778
changing the name of the variable would help because i think that the compiler doesn't know which n to use, because it is in two different scopes at the same time.
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 9733808
>>it is in two different scopes

It isn't. this.n is quite distinct from n. And anyway, where did you get the idea that there are compiling problems?
0
 
LVL 1

Author Comment

by:omashhour
ID: 9733820
i tried what ur saying but its not working
0
 
LVL 1

Author Comment

by:omashhour
ID: 9733833
by the way for your own knowledge when i say this.n it differentiates between the 2 n's
0
 
LVL 1

Author Comment

by:omashhour
ID: 9733853
no there are no compiling problems but when i try the program the nick name remains null
it does not change
do u want me to send the server CEHJ??
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 9733939
What changes have you made to the method in question?
0
 
LVL 15

Expert Comment

by:jimmack
ID: 9734162
The Nick class has it's own reference to a Client.  A new instance is of Client is created every time actionPerformed is called (though I'm not sure how this works, given the ActionListener is applied to the JFrame subclass and not a button or menu item).

Since a new Client object is created each time and not passed to anything else, this would explain why you are not seeing what you expect.

Perhaps when you create the Nick object from the Client, you should pass in the reference to Client in the constructor, eg.

Nick nickName = new Nick(this);

and in the Nick class:

public Nick(Client client)
{
    this.client = client;
    .
    .
}

Then get rid of the client creation in the actionPerformed (in the Nick class).
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 9734288
>>but when i try the program the nick name remains null

I'm now getting confused as to what you mean by 'nick name' ;-) What *do* you mean?
0
 
LVL 1

Author Comment

by:omashhour
ID: 9735799
public void setNick(String n)
     {
         this.n=n;
     }

i want the method above

to have effect in this part

 if(source==send)
        {  
            String input=itext.getText();
            out.println(input);
            dtext.append("\n"+n+":"+input);    <===============the n here is the nickname
            itext.setText("");
            beyekteb.setText("Your Chat Started at "+now);
        }
but the problem is that the n is always null it does not change
0
 
LVL 35

Accepted Solution

by:
TimYates earned 30 total points
ID: 9736085
Pass the Client to the Nick class (in the constructor)

in your action performed:

        if(source==nick)
        {
            if( nickName == null )
              nickName = new Nick( this ) ;
            nickName.setVisible(true);
        }

then, change the Nick constructor (and first line) to:

    Nick( Client client )
    {
        this.client = client ;

And change the actionPerformed for the Nick class to:

   public void actionPerformed(ActionEvent e) {
        Object source=e.getSource();
        if(source==set)
        {
            n=text.getText();
            client.setNick(n);
            setVisible(false);
        }
    }
0
 
LVL 35

Expert Comment

by:TimYates
ID: 9736086
you were creating a new CLient class and setting the nick in that....this was having no effect on the existing Client class...

so it was staying null...

Tim.
0
 
LVL 35

Expert Comment

by:TimYates
ID: 9736091
Oh yeah, and change:

    Nick nickName=new Nick();

to

    Nick nickName = null ;

in the Client class
0
 
LVL 15

Expert Comment

by:jimmack
ID: 9736191
Thanks Tim.  I'm too tired to go into this now.  I'm off to bed 3-)
0
 
LVL 1

Author Comment

by:omashhour
ID: 9736390
thanks tim your the man :)
0
 
LVL 35

Expert Comment

by:TimYates
ID: 9738307
:-)
0

Featured Post

Get 15 Days FREE Full-Featured Trial

Benefit from a mission critical IT monitoring with Monitis Premium or get it FREE for your entry level monitoring needs.
-Over 200,000 users
-More than 300,000 websites monitored
-Used in 197 countries
-Recommended by 98% of users

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

An old method to applying the Singleton pattern in your Java code is to check if a static instance, defined in the same class that needs to be instantiated once and only once, is null and then create a new instance; otherwise, the pre-existing insta…
Java had always been an easily readable and understandable language.  Some relatively recent changes in the language seem to be changing this pretty fast, and anyone that had not seen any Java code for the last 5 years will possibly have issues unde…
Video by: Michael
Viewers learn about how to reduce the potential repetitiveness of coding in main by developing methods to perform specific tasks for their program. Additionally, objects are introduced for the purpose of learning how to call methods in Java. Define …
Viewers will learn about arithmetic and Boolean expressions in Java and the logical operators used to create Boolean expressions. We will cover the symbols used for arithmetic expressions and define each logical operator and how to use them in Boole…

630 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question