Reputation: 83
I'm trying to plug my code into my GUI at the moment i can't find a way to call text in the ActionListener with out breaking my code I know there are some things in findAndReplace() i will need to work on to get it to work in my GUI... but at the moment I'm just trying to account the ActionListener.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import javax.swing.*;
public class HangmanPanel extends JPanel {
static Boolean FOUND;
private static final long serialVersionUID = -5793357804828609325L;
public static String answerKey() {
//get random array element
String array[] = new String[10];
array[0] = "hamlet";
array[1] = "mysts of avalon";
array[2] = "the iliad";
array[3] = "tales from edger allan poe";
array[4] = "the children of hurin";
array[5] = "the red badge of courage";
array[6] = "of mice and men";
array[7] = "utopia";
array[8] = "chariots of the gods";
array[9] = "a brief history of time";
ArrayList<String> list = new ArrayList<String>(Arrays.asList(array));
Collections.shuffle(list);
String s = list.get(0);
return s;
}
public StringBuilder dashReplace(String s) {
//replace non-white space char with dashes and creates StringBuilder Object
String tW = s.replaceAll("\\S", "-");
System.out.print(tW + "\n");
StringBuilder AnswerKey = new StringBuilder(tW);
return AnswerKey;
}
public HangmanPanel(){
this.setLayout(null);
JLabel heading = new JLabel("Welcome to the Hangman App");
JButton Button = new JButton("Ok");
//get input
Button.addActionListener(new input());
JLabel tfLable = new JLabel("Please Enter a Letter:");
JLabel AnswerKey = new JLabel(dashReplace(answerKey()).toString());
JTextField text = new JTextField(10);
heading.setSize(200, 50);
tfLable.setSize(150, 50);
text.setSize(50, 30);
Button.setSize(60, 20);
AnswerKey.setSize(200, 100);
heading.setLocation(300, 10);
tfLable.setLocation(50, 40);
text.setLocation(50, 80);
Button.setLocation(100, 85);
AnswerKey.setLocation(100,85);
this.add(heading);
this.add(tfLable);
this.add(text);
this.add(Button);
this.add(AnswerKey);
}
public class input implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// can't access text
sc = text.getText();
char ch = sc.charAt(0);
findAndReplace(s, AnswerKey, input, ch);
}
}
public static int findAndReplace(String s, StringBuilder AnswerKey, String sc,
char ch) {
//find position of user input and replace
int pos = -1;
FOUND = false;
while(true){
pos = s.indexOf(sc, pos+1);
if(pos < 0){
break;
}else{
FOUND = true;
AnswerKey.setCharAt(pos, ch);
}
}
System.out.println(AnswerKey);
return pos;
}
}
Upvotes: 0
Views: 447
Reputation: 285403
The text JTextField variable is declared inside of the constructor and is invisible to other methods of your class since it does not have class "scope". You need to make this variable a class field by declaring it in the class, not a constructor in order to give it visibility throughout the class.
e.g.,
public class HangmanPanel extends JPanel {
private static final long serialVersionUID = -5793357804828609325L;
private Boolean found; // this should not be static nor capitalized
private JTextField text; // declare your class field
// .... etc...
public HangmanPanel() {
this.setLayout(null); // *** don't do this. Use layout managers.
// ... etc
// JTextField text = new JTextField(10);
text = new JTextField(10);
Upvotes: 3
Reputation: 10143
First of all do not use lowercase class names and uppercase variable names, your code is really hard to read.
You can use anonymous inner class to add event listener like this:
Button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// can't access text
sc = text.getText();
char ch = sc.charAt(0);
findAndReplace(s, AnswerKey, input, ch);
}
});
Mark text
variable as final in order to access it in anonymous class:
final JTextField text = new JTextField(10);
Upvotes: 1