I need a different approach - suggestions please

B

bilsch

[...]
You needn't use the same listener for the 7 key as for
the Backspace key ...
The listeners all call a statement in the second file:

public void actionPerformed(ActionEvent event)

so I don't understand how a button listener can be different from
another button listener.

Could you explain please?

In your code there's a class called CrunchQ1, and because it
implements the ActionListener interface you can (and do) tell
your buttons to use an instance of that class as their action
listeners:

CrunchQ1 crunchNu = new CrunchQ1(this);
...
dot.addActionListener(crunchNu);
zro.addActionListener(crunchNu);
one.addActionListener(crunchNu);
...

What I'm suggesting is that you could perfectly have another
class, maybe CrunchQ2, that also implements ActionListener but does
something different in its ActionPerformed method. Then you could
make yourself an instance of the CrunchQ2 class, and use it instead
of the CrunchQ1 instance for some of your buttons:

CrunchQ1 crunchNu = new CrunchQ1(this);
CrunchQ2 dotty = new CrunchQ2(...whatever...);
...
dot.addActionListener(dotty);
zro.addActionListener(crunchNu);
one.addActionListener(crunchNu);
...

If you have other buttons with idiosyncratic behaviors, you
could give them their own ActionListener implementations, too.
There is no reason in the world why every button in your program
should share the same listener!
Thanks for the info.
 
L

Lew

bilsch said:
Lew said:
There are a few mistakes in your code.

You don't need to call 'super()' in the constructor explicitly.
That's what happens by default anyway.

You called the constructor directly from the 'main()' routine. That means
you called it from the primary thread of the program. You don't know this
yet, probably, unless you've already studied concurrency in Java a little bit.

The problem is that the GUI won't work right if you do that. You have to
move GUI actions onto the "Event Dispatch Thread" (EDT), a background
thread that the system creates to handle all GUI actions.

Also, you start all the action from the constructor. That's bad. As its name
implies, a constructor's purpose is to _construct_ an object, not run its logic.
Run the logic after construction completes and the instance is no longer in a
partially-built state.

And make your indentation consistent with the Java coding conventions (available
on line).

So all together, you'd do something like:

public static void main(String[] arguments) {
java.awt.EventQueue.invokeAndWait( new Runnable() {
@Override public void run() {
CalcGUIQ1 calculator = new CalcGUIQ1();
calculator.setVisible(true);
}
});
}

With help I've gotten some errors out of the program but I have reached
a point where something just won't work how it should. Your comments

What doesn't work, and how should it?
here lead me to believe the reason is the basic way I have things laid
out. But I don't know how to:

dont know how to write an EDT, or what specifically are 'GUI actions' as
opposed to other lines that relate to the GUI.

You don't write the EDT. Did you read the tutorial link I provided?

<http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html>

GUI actions are all things that happen on the GUI, such as creating
a 'JFrame', calling 'pack()', playing with 'Graphics', or anything else that
is part of the GUI. Non-GUI actions are things like writing files, calculating
values, updating the logical model, or anything else that is not part of
the GUI.

Do please read the tutorial to which I linked. There's a reason I provided
that link.

Also, I thought the stuff I have in the constructor belonged there.

Not all of it. The program itself must run from a *completely*
constructed object. You start the program from inside the
constructor, therefore it is running on an *incompletely*
constructed object.
I dont know where to call the constructor from if not from 'main'.

You should call the constructor from 'main()', provided you properly
guard it inside the 'invokeAndWait()' call.

Why did you think I recommended otherwise?
I did some reading about threads being unsafe.

It would be very helpful to me if you could show how to rearrange the
code like you say would be better. If you have the time, it would be
very helpful. Thanks.

What was wrong with what I already showed you (and you quoted)?
 
A

Arne Vajhøj

On 6/27/2012 2:09 PM, Gene Wirchenko wrote:
...

I have largely given up on this newsgroup, and only drop in
occasionally, because of the tone of the discussion. In any case, this
newsgroup is dying from lack of new regulars, and I think that is a key
reason. If you get jumped on the first time you ask a question, why come
back? When I first showed up in comp.lang.java as a very experienced
programmer but new to Java, my questions were answered politely and my
mistakes were handled gently.

I don't see it that way.

First.

The participation in most usenet groups is dropping. It is not
specific to cljp.

ISP's are dropping NNTP servers. Most people use various web
fora like stackoverflow.com etc..

Second.

I think newbies that are interested in learning usually get
an acceptable treatment. There may be exceptions. And maybe
it could be improved. But overall I think rudeness against
that group is the exception not the rule.

Who collects plenty of flaming is really another group. It is
the "OOP is just overhead", "patterns are useless", "I don't
want to follow the standard coding convention", "I don't want
to use the Java library because my own is better", "unit tests
are useless", "ORM's are useless", "make is the rigth build
toll for Java" etc. that gets the heat. And
it is not when they first state their opinion they get flamed,
but when they get explained why it is bad often with references
to well known sources and turn out not to be interested in
listening then the flame throwers get turned on.

And I believe that is warranted. cljp should be a group that
steer newbies towards becoming programmers suitable for the
job market with a healthy understanding of what is considered
best practice. cljp should not throw out the last 20 or 30
years of experiences gained often at huge costs.

It is probably not good for cljp's reputation that a huge
portion of posts are really long flame wars between
best practices and excentric ideas.

But I don't think it would be good for cljp's reputation if
half the recommendations was to write Java like poorly written
Cobol and nobody objected against it.

The problem is probably unsolvable.

I don't think we could get that certain group to migrate
to a new c.l.j.excentric group where unusual not recommended
ways of doing things should be the main topic.

Arne
 
G

Gene Wirchenko

[snip]
You calling the conventions a "religion" neither invalidates nor diminishes
the value of the official conventions.

I do not contest the value of the official conventions. I do say
that they are not the only conventions that can be used.

The official conventions (or any others for that matter) are a
religion when they are shoved on people regardless of the situation.

Your disdain for different conventions "neither invalidates nor
diminishes the value of" different conventions.

I think you have misunderstood the purpose of a coding convention.

It is not about what is the best way to write certain things.

It is about having everybody writing things the same way to
make it easier to read other peoples code.

That automatically gives the standard convention more points
than the alternatives.

So unless one has specific knowledge about the OP's context,
then the only plausible advice is to go for the standard.

Arguments over indenting styles are rife. Why? Because there
really is no one answer. I understand that. I wish more did.
So you use the concept invented to make code more readable for other
for yourself.

Hmmm.

Yes. Since I write useful programs, they are in use for
considerable time periods. I am usually the one who maintains them so
it is in my interest to use conventions that assist me in program
maintenance.
The assumption is that people that post here are interested in learning.

One hopes.
That includes naming convention.

That does not mean that I will use such a convention. I do not
expect anyone to use mine either. To each his own.
If they are not, then I don't know why they are here.

It was for programming help on language features, not to be
snarked for not using the coding convention.
Nobody care how you write your code.

Of course you do. If you did not, you would not be posting in
this thread.
If you want to write the entire class in a single line then do it.

Straw man!

My convention tends to more lines than most. For example,
variable and parameter declarations are almost always one per line.
That makes putting a class all on one line nearly impossible.
But do not try to tell other that it is an acceptable way to write code.

It is an acceptable way. It is not the only way.
No. Because you are not interested in learning.

I am interested in learning. I am not interested in being
dictated to.
Your choice.

Of course. And my exercising it seems to really get you upset.
But do not try to lead other that route.

No. There is something called freedom of speech. I like having
it.

Sincerely,

Gene Wirchenko
 
G

Gene Wirchenko

[snip]
But since the rest of the world does not then that is a bad
choice.

Or I am on the bleeding edge.

At one point, presumably only one person (or only a few) was
using the Java coding conventions so highly touted here. Therefore,
by your argument, said conventions were a bad choice.

Sincerely,

Gene Wirchenko
 
D

Devil's Advocate

But I don't think it would be good for cljp's reputation if
half the recommendations was to write Java like poorly written
Cobol and nobody objected against it.

But, but, but ... but I thought you were *for* coding Java with the
usual coding conventions!

;)
 
B

B1ll G4tes

GUI actions are all things that happen on the GUI, such as creating
a 'JFrame', calling 'pack()', playing with 'Graphics', or anything else that
is part of the GUI.

Not all Graphics objects are created equal in that regard. Some are
associated with GUI things, e.g. the one you get calling getGraphics on
a JComponent. Some are not, e.g. if you get one to draw on a BufferedImage.
 
H

Hydrangea

[snip]
But since the rest of the world does not then that is a bad
choice.

Or I am on the bleeding edge.

At one point, presumably only one person (or only a few) was
using the Java coding conventions so highly touted here. Therefore,
by your argument, said conventions were a bad choice.

"...therefore, all progress depends upon the unreasonable man". :)
 
A

Arne Vajhøj

[snip]
But since the rest of the world does not then that is a bad
choice.

Or I am on the bleeding edge.

At one point, presumably only one person (or only a few) was
using the Java coding conventions so highly touted here. Therefore,
by your argument, said conventions were a bad choice.

No.

If there are no standard you invent a standard.

If there are a standard you follow it.

Arne
 
G

Gene Wirchenko

[snip]
But since the rest of the world does not then that is a bad
choice.

Or I am on the bleeding edge.

At one point, presumably only one person (or only a few) was
using the Java coding conventions so highly touted here. Therefore,
by your argument, said conventions were a bad choice.

"...therefore, all progress depends upon the unreasonable man". :)

I am doing my best.

The assymetry of the situation is interesting to me. I do not
like the standard Java coding conventions for <reasons>, but I would
not dream of telling someone not to use them. The other side is very
insistent that I should and must. I do insist that someone have
coding conventions, but it is less important what they are. I can
adapt if I have to, but of course, I prefer my own conventions as they
match my needs.

Sincerely,

Gene Wirchenko
 
G

Gene Wirchenko

[snip]
But since the rest of the world does not then that is a bad
choice.

Or I am on the bleeding edge.

At one point, presumably only one person (or only a few) was
using the Java coding conventions so highly touted here. Therefore,
by your argument, said conventions were a bad choice.

No.

If there are no standard you invent a standard.

If there are a standard you follow it.

Maybe you do that, but I do not. I evaluate a standard for how
well it fits my needs. I make no bones about disregarding a standard
that does not work for me.

Standards for written English work very well for me. There are a
number of errors in your post. Please submit a corrected post, or
quit whining about standards. Or both.

Sincerely,

Gene Wirchenko
 
B

bilsch

bilsch said:
Lew said:
There are a few mistakes in your code.

You don't need to call 'super()' in the constructor explicitly.
That's what happens by default anyway.

You called the constructor directly from the 'main()' routine. That means
you called it from the primary thread of the program. You don't know this
yet, probably, unless you've already studied concurrency in Java a little bit.

The problem is that the GUI won't work right if you do that. You have to
move GUI actions onto the "Event Dispatch Thread" (EDT), a background
thread that the system creates to handle all GUI actions.

Also, you start all the action from the constructor. That's bad. As its name
implies, a constructor's purpose is to _construct_ an object, not run its logic.
Run the logic after construction completes and the instance is no longer in a
partially-built state.

And make your indentation consistent with the Java coding conventions (available
on line).

So all together, you'd do something like:

public static void main(String[] arguments) {
java.awt.EventQueue.invokeAndWait( new Runnable() {
@Override public void run() {
CalcGUIQ1 calculator = new CalcGUIQ1();
calculator.setVisible(true);
}
});
}

With help I've gotten some errors out of the program but I have reached
a point where something just won't work how it should. Your comments

What doesn't work, and how should it?
here lead me to believe the reason is the basic way I have things laid
out. But I don't know how to:

dont know how to write an EDT, or what specifically are 'GUI actions' as
opposed to other lines that relate to the GUI.

You don't write the EDT. Did you read the tutorial link I provided?

<http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html>

GUI actions are all things that happen on the GUI, such as creating
a 'JFrame', calling 'pack()', playing with 'Graphics', or anything else that
is part of the GUI. Non-GUI actions are things like writing files, calculating
values, updating the logical model, or anything else that is not part of
the GUI.

Do please read the tutorial to which I linked. There's a reason I provided
that link.

Also, I thought the stuff I have in the constructor belonged there.

Not all of it. The program itself must run from a *completely*
constructed object. You start the program from inside the
constructor, therefore it is running on an *incompletely*
constructed object.
I dont know where to call the constructor from if not from 'main'.

You should call the constructor from 'main()', provided you properly
guard it inside the 'invokeAndWait()' call.

Why did you think I recommended otherwise?
I did some reading about threads being unsafe.

It would be very helpful to me if you could show how to rearrange the
code like you say would be better. If you have the time, it would be
very helpful. Thanks.

What was wrong with what I already showed you (and you quoted)?

I looked at the link when you provided it. It said dont read this until
you first read the basic stuff about concurrence in previous topics. I
read that stuff.

Here's the code that should work but doesnt. A stripped down version of
my program is in the 2 files copied below. It is a simple calculator
like in Windows accessories. The example below only does addition and
subtraction. It isn't completely written - never writes the answer to
the textbox I haven't got that far yet. The code below is supposed to
work as follows: A number is sent to the textbox using button clicks and
when '+' button is clicked the displayed string is converted to double.
The displayed string remains displayed until the first digit of the next
number is entered then the displayed string is cleared and the second
number begins in the display. When '=' is clicked the second displayed
number (actually a string) is converted to double and added to the first
double number. The operation should be controlled by the 'opFlag' and
'addFlag' settings. It should clear the textbox when the second number
is entered but it does not. Print statements are included to show
variable values.

THE GUI FILE:

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

public class KalcGUI extends JFrame {
Krunch crunchNu = new Krunch(this);

// set up row 1
JPanel row1 = new JPanel();
JTextField number1 = new JTextField(30);
// set up row 2
JPanel row2 = new JPanel();

JButton sev = new JButton("7");
JButton ate = new JButton("8");
JButton nin = new JButton("9");

JButton fou = new JButton("4");
JButton fiv = new JButton("5");
JButton six = new JButton("6");
JButton b04 = new JButton("");

JButton one = new JButton("1");
JButton two = new JButton("2");
JButton tre = new JButton("3");

JButton zro = new JButton("0");
JButton dot = new JButton(".");
JButton equ = new JButton("=");
JButton add = new JButton("+");
JButton sub = new JButton("--");

public KalcGUI() {
super();
setTitle("Calculator");
//setLookAndFeel();

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridLayout layout = new GridLayout(2, 1, 10, 10);
setLayout(layout);

//add listeners
dot.addActionListener(crunchNu);
zro.addActionListener(crunchNu);
one.addActionListener(crunchNu);
two.addActionListener(crunchNu);
tre.addActionListener(crunchNu);
fou.addActionListener(crunchNu);
fiv.addActionListener(crunchNu);
six.addActionListener(crunchNu);
sev.addActionListener(crunchNu);
ate.addActionListener(crunchNu);
nin.addActionListener(crunchNu);
equ.addActionListener(crunchNu);
add.addActionListener(crunchNu);
sub.addActionListener(crunchNu);


FlowLayout layout1 = new FlowLayout(FlowLayout.CENTER, 10, 10);
row1.add(number1);
row1.setLayout(layout1);
add(row1);

GridLayout layout2 = new GridLayout(5, 3, 10, 10);
row2.setLayout(layout2);

row2.add (sev);
row2.add (ate);
row2.add (nin);

row2.add (fou);
row2.add (fiv);
row2.add (six);

row2.add (one);
row2.add (two);
row2.add (tre);


row2.add (zro);
row2.add (dot);
row2.add (equ);
row2.add (add);
row2.add (sub);
add(row2);

pack();
setVisible(true);
}
public static void main(String[] arguments) {
KalcGUI frame = new KalcGUI();

}
}


THE CALCULATION FILE:


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

public class Krunch implements ActionListener{
KalcGUI gui;
String strng1 = "";
boolean invFlag = false;
boolean addFlag = false;
boolean subFlag = false;
boolean opFlag = false;
int neg = 0;
String noChar = "";
Double operand1 = 0.0;
Double operand2 = 0.0;
public Krunch(KalcGUI in) {
gui = in;
}
public void actionPerformed(ActionEvent event){
//String strng1 = "";
String btn = event.getActionCommand();
// opflag clears display
if (opFlag){
System.out.println(opFlag);

// THIS SHOULD CLEAR THE TEXTBOX //
gui.number1.setText(noChar);
opFlag = false;
}
if (btn == "=") {operand2=Double.parseDouble(strng1);
if (addFlag) {
operand1 += operand2;
addFlag = false;
}
if (subFlag) {
operand1 += operand2;
subFlag = false;
}
}
if( btn.equals( "1" ) || btn.equals( "2" ) || btn.equals( "3" )
|| btn.equals( "4" )
|| btn.equals( "5" ) || btn.equals( "6" ) ||
btn.equals( "7" ) || btn.equals( "8" )
|| btn.equals( "9" ) || btn.equals( "0" ) ||
btn.equals( "." )) {

strng1 += btn;
}
gui.number1.setText(strng1);

if (btn == "+") {
addFlag = true;
opFlag = true;
System.out.println(addFlag);
System.out.println(opFlag);
operand1=Double.parseDouble(strng1);}

if (btn == "--") {
subFlag = true;
opFlag = true;
operand1=Double.parseDouble(strng1);}

}
}
 
M

Mike Winter

Here's the code that should work but doesnt. [snip]

I did outline why it doesn't in your other thread, "It doesn't see my 'if' statements". In addition to the other issues raised in both threads, your program suffers from logic errors which you don't seem to have addressed yet.. See <posted yesterday (27th) at 01:04 GMT.

Kind regards,
Mike
 
M

markspace

if( btn.equals( "1" ) || btn.equals( "2" ) || btn.equals( "3" )
|| btn.equals( "4" )
|| btn.equals( "5" ) || btn.equals( "6" ) || btn.equals(
"7" ) || btn.equals( "8" )
|| btn.equals( "9" ) || btn.equals( "0" ) || btn.equals(
"." )) {


Wow, you actually changed it. Good job.

I have to say that I like ".0123456789".contains( btn ) better. It's
much shorter. ;-)

if (btn == "+") {

You really do need to change all of the other string comparisons to
..equals() too. This == stuff is going to fail unpredictably for you.
It tests for object identity (i.e., to objects are the same object) and
is only going to succeed for strings by luck at this point. .equals()
checks that the contents of the string are the same.

I'll stop there because any other errors might be masked by these ==
comparisons for strings.
 
M

Mike Winter

That link is completely mangled for me.

It's the message ID for the post I wrote, but I know some news readers won't act on it properly. Hell, I might've written it incorrectly as it's been a long time since I used Usenet regularly. But that's why I mentioned the name of the thread, and the date and time of the post. ;)

Mike
 
G

Gene Wirchenko

That link is completely mangled for me.

It works for me in Agent. It switched me over to the other
thread. I tried the link in the post you replied to and your post,
and both worked.

Sincerely,

Gene Wirchenko
 
J

Joshua Cranmer

That link is completely mangled for me.

Thunderbird doesn't properly support news URIs that don't specify a
server. It's been on my todo list for years now. :)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,073
Messages
2,570,539
Members
47,195
Latest member
RedaMahuri

Latest Threads

Top