So I've been trying to make a game for a school project and wanted to add some easter eggs, but in order to do so I need to detect key input. I've been looking up how to do this for a while and couldn't find any ways that work. The setup I'm using is making a JOptionPane and creating it with a JDialog to make a title and add an icon to the window.
Here's my code so far:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyAdapter;
public class ObamaSimulator {
public static void main(String[] args) {
JLabel label; // text in JOptionPane
label = new JLabel("<html><center><b style = 'font-size: 40px; color: red;'>WELCOME</b><p style = 'width: 175px;'><br> To Obama Simulator. In this game you are obama, there isn't really much else to say <br>(The story will tell you more)<br>[press OK to continue or X to quit]", SwingConstants.CENTER);
String choice = JText("Yes", null, label, "Welcome!"); // Runs JText with option 1, option 2, label, and title, and outputs with the option they chose
if(choice == "Yes"){
game();
}else{
System.out.println("Baboon closed the window :(");
label = new JLabel("<html><center><p style = 'width: 175px;'>Game Closed", SwingConstants.CENTER);
JText("OK", null, label, null);
System.exit(0); // Used to end the program, IDK why it dosn't end by it's self
}
}
public static String JText(String op1, String op2, JLabel label, String title){
Object[] options; // Options in JOptionPane
JFrame frm = new JFrame(); // Frame used to make JOptionPane have icon
frm.setIconImage(new ImageIcon("Obama (1).gif").getImage()); // Sets icon of JOptionPane window
if(op1 == null){ // Checks if an option is missing
options = new Object[] {op2};
}else if(op2 == null){
options = new Object[] {op1};
}else{
options = new Object[] {op1, op2};
}
if(title == null){ // Checks if title is missing
title = "Obama Simulator";
}
JOptionPane jp = new JOptionPane(label , JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE,null, options, options[0]); // Creates basic JOptionPane
JDialog dialog = jp.createDialog(frm, title); // Finishes by adding icon and title
dialog.setSize(350, 300); // Sets size
dialog.setLocationRelativeTo(null); // Centers the Window
dialog.setResizable(true); // Needed to make icon
dialog.addKeyListener(new KeyListener(){
@Override
public void keyTyped(KeyEvent e) {
// Nothing
}
@Override
public void keyPressed(KeyEvent e) {
// Nothing
}
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP){
System.out.println("up");
}
}
});
dialog.setVisible(true); // Sets JOptionPane visible
String choice = (String) jp.getValue(); // Sets Choice to variable
return choice; // Sends choice back to meathod
}
public static void game(){
JLabel label;
String choice;
System.out.println("Baboon picked yes");
label = new JLabel("<html><center><p style = 'width: 175px; font-size: 10px;'>You are Obama, having a lovely day in Minecraft, feeding your dog. You need more quarts and Redstone blocks to build a lighthouse by the sea. While running to your portal room you find an untamed wolf, do you want to tame it?", SwingConstants.CENTER);
choice = JText("Tame", "Dont tame", label, null);
if(choice == "Tame"){
System.out.println("Baboon picked tame");
label = new JLabel("<html><center><p style = 'width: 175px; font-size: 10px;'>You shove a bone deep into the mouth of the wolf. You tame it but it makes you feel horrible, maybe it will make you feel better if you dye the collar?", SwingConstants.CENTER);
choice = JText("Dye", "Dont dye", label, null);
if(choice == "Dye"){
System.out.println("Baboon Dyed");
}
}
// System.exit(0);
}
}
I tryed to use keyListener on the dialog, but it dosn't work, I've tryed other basic examples and they work, I just have no clue what's wrong with mine.
If you could help, I would greatly appreciate it! Thanks in advanced :)
CodePudding user response:
You're going to want to avoid KeyListener
. When ever you have another focusable component on the screen, it's not going to work.
Instead, you'll want to look at How to Use Key Bindings.
choice == "Yes"
is not how you compare String
s in Java, you'll want to use "Yes".equals(choice)
instead.
I'd also suggesting having a look at How to Use CardLayout as another means for flipping the UI ;)
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.ImageIcon;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
public class ObamaSimulator {
public static void main(String[] args) {
JLabel label; // text in JOptionPane
label = new JLabel("<html><center><b style = 'font-size: 40px; color: red;'>WELCOME</b><p style = 'width: 175px;'><br> To Obama Simulator. In this game you are obama, there isn't really much else to say <br>(The story will tell you more)<br>[press OK to continue or X to quit]", SwingConstants.CENTER);
String choice = JText("Yes", null, label, "Welcome!"); // Runs JText with option 1, option 2, label, and title, and outputs with the option they chose
if ("Yes".equals(choice)) {
game();
} else {
System.out.println("Baboon closed the window :(");
label = new JLabel("<html><center><p style = 'width: 175px;'>Game Closed", SwingConstants.CENTER);
JText("OK", null, label, null);
System.exit(0); // Used to end the program, IDK why it dosn't end by it's self
}
}
public static String JText(String op1, String op2, JLabel label, String title) {
Object[] options; // Options in JOptionPane
JFrame frm = new JFrame(); // Frame used to make JOptionPane have icon
frm.setIconImage(new ImageIcon("Obama (1).gif").getImage()); // Sets icon of JOptionPane window
if (op1 == null) { // Checks if an option is missing
options = new Object[]{op2};
} else if (op2 == null) {
options = new Object[]{op1};
} else {
options = new Object[]{op1, op2};
}
if (title == null) { // Checks if title is missing
title = "Obama Simulator";
}
JOptionPane jp = new JOptionPane(label, JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]); // Creates basic JOptionPane
JDialog dialog = jp.createDialog(frm, title); // Finishes by adding icon and title
dialog.pack();//setSize(350, 300); // Sets size
dialog.setLocationRelativeTo(null); // Centers the Window
dialog.setResizable(true); // Needed to make icon
InputMap im = jp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap am = jp.getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up");
am.put("up", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Up");
}
});
//
//dialog.addKeyListener(new KeyListener() {
//
// @Override
// public void keyTyped(KeyEvent e) {
// // Nothing
// }
//
// @Override
// public void keyPressed(KeyEvent e) {
// // Nothing
// }
//
// @Override
// public void keyReleased(KeyEvent e) {
//
// if (e.getKeyCode() == KeyEvent.VK_UP) {
// System.out.println("up");
// }
//
// }
//});
dialog.setVisible(true); // Sets JOptionPane visible
String choice = (String) jp.getValue(); // Sets Choice to variable
return choice; // Sends choice back to meathod
}
public static void game() {
JLabel label;
String choice;
System.out.println("Baboon picked yes");
label = new JLabel("<html><center><p style = 'width: 175px; font-size: 10px;'>You are Obama, having a lovely day in Minecraft, feeding your dog. You need more quarts and Redstone blocks to build a lighthouse by the sea. While running to your portal room you find an untamed wolf, do you want to tame it?", SwingConstants.CENTER);
choice = JText("Tame", "Dont tame", label, null);
if ("Tame".equals(choice)) {
System.out.println("Baboon picked tame");
label = new JLabel("<html><center><p style = 'width: 175px; font-size: 10px;'>You shove a bone deep into the mouth of the wolf. You tame it but it makes you feel horrible, maybe it will make you feel better if you dye the collar?", SwingConstants.CENTER);
choice = JText("Dye", "Dont dye", label, null);
if ("Dye".equals(choice)) {
System.out.println("Baboon Dyed");
}
}
// System.exit(0);
}
}