Close window after checking - java

I'm having a slight issue, and I can't figure it out.
I want for my code to check if the email and password matches and then close the window. This the action:
btnLogin.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
boolean status = Email_Verification.email_validation(email_text.getText().toString().trim());
if (status) {
lbl_inco_email.setText(null);
} else {
lbl_inco_email.setText("Please enter a valid email");
}
boolean stat = Password_Verification.password_validation(password_Field.getPassword().toString());
if (stat) {
lbl_inco_pwd.setText(null);
} else {
lbl_inco_pwd.setText("Please enter a valid Password");
}
/* Exit and redirect to the main application if the email/pwd matches the database */
/** MAIN__WINDOW __EXIT__ONCLICK__ = new MAIN__WINDOW();
__EXIT__ONCLICK__.setVisible(true); */
}
});

I am going to assume you have an issue with opening a new frame and disposing of the login frame, because if you have an issue with user validation there isn't enough information for any of us to actually help.
Also, please read this concerning the use of multiple JFrames. The Use of Multiple JFrames: Good or Bad Practice?
Now for the code section...
Once user validation is done, you need to create an instance of your main window and make it visible. After that you can close the first JFrame.
Your actionPerformed would look something like this:
btnLogin.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
// Let's assume you have a boolean variable that handles user validation
//for simplicity...
if(userVerified) {
// In this example let's call the main application window MainFrame
MainFrame mF = new MainFrame();
// Set it to visible
mF.setVisible(true);
mF.setLocationRelativeTo(null);
// Now you can close the first JFrame
this.dispose();
}
}
});

Related

Java: Dispose Gui Form

I'm making a GUI using IntelliJ, and I have selected the option New -> Gui Form. I have made it as a login screen, but I cannot dispose the window at successful login. I have tried to extend the class with extends JFrame and then call dispose(), but it does not seem to be working. What do I do wrong?
In advance, thank you.
UPDATE with code:
public LoginFrame() {
loginButton.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
char[] pass = password.getPassword();
StringBuilder passwordBuilder = new StringBuilder();
for (char p : pass)
{
passwordBuilder.append(p);
}
String password = passwordBuilder.toString();
//Login.
if(DatabaseHandler.login(username.getText(), password))
{
dispose(); //THIS WINDOW.
}
else
{
JOptionPane.showMessageDialog( null, "Wrong username or password!", "Login failed!", JOptionPane.ERROR_MESSAGE);
}
}
});
}
You can try following:
if(DatabaseHandler.login(username.getText(), password))
{
Component button = (Component) e.getSource();
SwingUtilities.getWindowAncestor(button).dispose();
}
When it does not help, please provide a MCVE so we can understand what's wrong in your code.
if you have your class extending JFrame you just use your class name to dispose the JFrame as per the below
windowClassName.super.dispose();

JPasswordField addFocusListener not working correct keeps repeating message

I have a login form with 2 JTextFields - one "elbtUser" the other "pass" (username and password) and everything works. I want to show a message as shown below if username is left empty and pass is clicked else the button will enable. It works but the message keeps repeating in an endless loop. How to I get back to form break out?
pass.addFocusListener(new FocusAdapter() {
#Override
public void focusGained(FocusEvent arg0) {
if(elbtUser.getText().equals("")) {
JOptionPane.showMessageDialog(null, "username cannot be empty");
}
else {
btnLogin.setEnabled(true);
}
}
});
I can't say for 100% certainty, but I'm guessing after the dialog is closed the text field regains focus and triggers the action listener. If this is the case, try 1 of two things:
1) add a variable to keep state and when the dialog should be shown. Once on focus gained, and then it should be reset when elbtUser gains focus.
2) You can force elbtUser to request focus after dialog is shown, elbtUser.requestFocus();
//edit.. i Just tried (1) as it seemed easier and it works,
pass.addFocusListener(new FocusAdapter() {
#Override
public void focusGained(FocusEvent arg0) {
if(elbtUser.getText().equals("")) {
//do this *BEFORE* displaying the dialog!!!
elbtUser.requestFocus(false);
JOptionPane.showMessageDialog(null, "username cannot be empty");
}
else {
}
}
});

Handle barcode scan in Java

I want to have my application react to barcodes being scanned to trigger button presses. For example the user could scan the ((PRINT)) barcode to activate the print button.
The barcodes will just be treated as if the user had entered some text. I am not sure if the scanners will be set up to append an enter or a tab or nothing on the end, so I don't want to make an assumption on that basis.
The application is a Java/Swing application.
I have looked at keybindings/action maps and the like, but they seem to be focussed on key chords/single key entries. I need it to not trigger the binding until the whole string is entered.
The tricky bit is that this should work wherever the user is focussed in the screen. They will not normally enter ( characters, so some kind of trigger on that might work. I am not sure how to handle the rest of the string though.
Edit: Apologies if it wasn't clear in the question, but the barcode scanner isn't anything "special" to the application, it's just like another keyboard. So the user won't be typing in (print), but effectively that is what the barcode scanner will be doing, if that makes sense.
So there are only two ways to trigger the print: pressing the button, or "typing" the string (print). The tricky part is that the user can be focussed anywhere on the application. I am only worried about if the application has focus as a whole, not which field the user is focussed on. The particular screen in question has checkbuttons and left/right selectors on it, so the user isn't necessarily going to be typing in to a field.
I had a problem just like yours, and created a project (currently proof of concept with some problems) to make barcode handling in swing easier.
It is based in the fact that the barcode readers emulate a keyboard but differently to humans they "type" with a constant timing. It will basically allow you to listen to "barcode read" events.
The project location: https://github.com/hablutzel1/swingbarcodelistener
Demo usage:
public class SimpleTest extends JFrame {
public SimpleTest() throws HeadlessException {
// start of listening for barcode events
Toolkit.getDefaultToolkit().addAWTEventListener(new BarcodeAwareAWTEventListener(new BarcodeCapturedListener() {
#Override
public void barcodeCaptured(String barcode) {
JOptionPane.showMessageDialog(SimpleTest.this, "barcode captured: " + barcode);
}
}), AWTEvent.KEY_EVENT_MASK);
// end of listening for barcode events
getContentPane().setLayout(new FlowLayout());
getContentPane().add(new JLabel("Capture barcode demo"));
getContentPane().add(new JTextField(25));
}
public static void main(String[] args) {
SimpleTest simpleTest = new SimpleTest();
simpleTest.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
simpleTest.setVisible(true);
simpleTest.pack();
}
}
It has some problems now but as a starting point I think it is ok, if you have time to improve it it would be great.
Correct me if I missunderstood, but it sounds like you have a barcode-scanner which will enter text into a field. But you want to be alerted when the text in the field equals something (so an action can take place) regardless of how it was entered (by barcode scanner or key press).
I'd recommend using a DocumentListener to alert you of changes to the text field - this should work with both of your requirements.
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
public class TempProject extends Box{
public TempProject(){
super(BoxLayout.Y_AXIS);
final JTextArea ta = new JTextArea();
ta.getDocument().addDocumentListener(new DocumentListener(){
#Override
public void changedUpdate(DocumentEvent arg0) {
doSomething();
}
#Override
public void insertUpdate(DocumentEvent arg0) {
doSomething();
}
#Override
public void removeUpdate(DocumentEvent arg0) {
doSomething();
}
public void doSomething(){
if(ta.getText().equalsIgnoreCase("print")){
System.out.println("Printing...");
//Need to clear text in a separate swing thread
SwingUtilities.invokeLater(new Runnable(){
#Override
public void run() {
ta.setText("");
}});
}
}
});
add(ta);
}
public static void main(String args[])
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setContentPane(new TempProject());
frame.setPreferredSize(new Dimension(500, 400));
frame.pack();
frame.setVisible(true);
}
});
}
}
I do not completely understand the question, and this is a bit too long to put in a comment. As far as I understood it, you have a Swing application and a bar-code scanner which has 3 different ways to trigger the same operation
User enters some text ("print") in the UI and this triggers the print action
The UI has a print button which can be pressed by the user and this triggers the print action
User can scan a "print" bar code and this triggers the print action
The part I do not understand is why the scanning of the bar code, which should trigger the print action, has anything to do with the UI-part where the user can input text.
I assume the scanning of the barcodes happens on another thread then the Event Dispatch Thread. Once you scanned a barcode and parsed it, you need to trigger the "print" action. You can do this directly without bothering going through the UI.
This is my approach. It's working. Just get the miliseconds for ensure doesn't read twice. Just add a Key Listener (implemented in the same JFrame).
#Override
public void keyTyped(KeyEvent e) {
}
#Override
public void keyPressed(KeyEvent e) {
}
#Override
public void keyReleased(KeyEvent e) {
logger().info("keytyped" + e.getKeyChar() + " code "+e.getKeyCode());
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
logger().info("all keys " + keyspressed);
return;
}
// will not last more than a second...
if (keyspressed == null || System.currentTimeMillis() - currentTimeMillis > 1000) {
keyspressed = e.getKeyChar()+"";
currentTimeMillis = System.currentTimeMillis();
} else {
keyspressed = keyspressed + e.getKeyChar();
currentTimeMillis = System.currentTimeMillis();
}
}
private String keyspressed = null;
private long currentTimeMillis = System.currentTimeMillis();

I have a issue with java threads and KeyEvents?

I need a bit of help with my program here. I have a blocking function waiting in my main thread for the user to click "Enter". Then, when the user hits enter, the keypressed event should fire, which will unblock the blocking function. However, when the program hits the blocking function, it simply freezes up and doesn't register the key pressed event.
So, my question is, is a event a runnable, which is added to a thread whenever the user clicks enter? If so, my code should have worked, right? If this is not the case, and each event is not a separate thread, could anyone enlighten me on how I should fix my problem here?
my blocking function:
public String getInput() {
synchronized(waitObject) {
try {
System.out.println("waiting");
waitObject.wait(); // throws exception, cba to add it here
} catch (Exception ex) {
ex.printStackTrace();
}
}
return(myString);
}
my keylistener code:
public void keyPressed(KeyEvent e) {
System.out.println("key pressed");
char c = e.getKeyChar();
if (c == e.VK_ENTER) {
System.out.println("Enter pressed");
synchronized(waitObject) {
waitObject.notifyAll();
}
}
}
and the function getting the input:
private String getCommand() {
System.out.println("getting command");
CommandField command = new CommandField((JFrame)(this));
command.setPreferredSize(new Dimension(getWidth(), 30));
m_panel.add(command, BorderLayout.NORTH);
validate();
command.requestFocus();
System.out.println(command.getInput());
return null;
}
And this function is called from another keylistener:
public class Listener implements KeyListener {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_F2) {
System.out.println(getCommand());
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
}
OK, getCommand() is called on the event thread which then calls getInput() on the same thread, which then calls Object#wait() on the event thread, so yes you are tying up the event thread and effectively freezing your program.
None of this is needed, and a much easier fix is possible if you code using the concepts of event-driven programming. You don't want to call wait() in a Swing GUI and in your situation don't need to call it, but rather you want to change how your program responds to input based on its state. If you tell us more on the exact behavior you're trying to elicit, we can probably help you find a much better solution.
Edit
Consider using a JOptionPane or a modal JDialog for displaying a "blocking" window that stops the main program until the dialog has been dealt with.
Starting with ImageApp, I added the following key binding in the constructor. It will show() the popup menu when pressing the Enter key. You can change the arbitrary location to suit your usage.
this.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "showPopup");
this.getActionMap().put("showPopup", new AbstractAction("showPopup") {
#Override
public void actionPerformed(ActionEvent e) {
popup.show(ImageApp.this, 42, 42);
}
});
Addendum: To bring up a modal input dialog, so something like this:
this.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "dialog");
this.getActionMap().put("dialog", new AbstractAction("dialog") {
#Override
public void actionPerformed(ActionEvent e) {
String value = JOptionPane.showInputDialog("What?");
System.out.println(value);
}
});

JoptionPane ShowConfirmDialog

I have a Java program. When I run the program, it will give me a GUI which as I attached.
When I want to close it, it will prompt out a confirm dialog. If I press the Yes button, it will quit the program using System.exit().
public static void main(String args[])
{
ButtonTest app = new ButtonTest( );
app.addWindowListener(
new WindowAdapter( )
{
public void windowClosing (WindowEvent e)
{
String message = " Really Quit ? ";
String title = "Quit";
int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
if (reply == JOptionPane.YES_OPTION)
{
System.exit(0);
}
}
}
);
}
If I don't want to quit the program, what can I do? System.continued() ?
You Don't need the else in this case
Try setting this,
app.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)
[Edited]
So, your code will become something like this,
public static void main(String args[]) {
ButtonTest app = new ButtonTest();
app.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
int reply = JOptionPane.showConfirmDialog(null,
"Really Quit ?", "Quit", JOptionPane.YES_NO_OPTION);
if (reply == JOptionPane.YES_OPTION)
System.exit(0);
}
});
app.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
app.setSize(640, 480);
app.setVisible(true);
}
[Explanation]
You might be thinking that why it is like that. The behaviour of windows close button for JFrame, unlike Frame,is to hide the window. Therefore, it will hide/close the window anyway. But when you specify that it must also exit the program, when the user click yes. Then, besides closing the window, it also exits the program. And when user clicks no, it does nothing but closes the window anyway. Hence, you must tell it explicitly that DO_NOTHING_ON_CLOSE.
[Docs]
Unlike a Frame, a JFrame has some notion of how to respond when the
user attempts to close the window. The default behavior is to simply
hide the JFrame when the user closes the window. To change the default
behavior, you invoke the method setDefaultCloseOperation(int). To make
the JFrame behave the same as a Frame instance, use
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE).
Ref: JFrame docs
If you will ask me, I will go with, on YES SELECTION instead of abruptly closing my Application with System.exit(0), I will choose the gracious way of closing my Application, by using frameObject.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) and on NO SELECTION , I will go for frameObject.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE). Here is one sample program for your help :
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ApplicationCloseExample
{
private void displayGUI()
{
final JFrame frame = new JFrame("Application Close Example");
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
int result = JOptionPane.showConfirmDialog(
frame, "Do you want to Exit ?"
, "Exit Confirmation : ", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
else if (result == JOptionPane.NO_OPTION)
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
});
frame.setSize(300, 300);
frame.setVisible(true);
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new ApplicationCloseExample().displayGUI();
}
});
}
}
If you want the program to continue when you press NO, place the rest of your code in else block or call the function where you have placed the rest of your code.
Removing else block is also an option if you don't want to place any action on the NO button because the JOptionPane.showConfirmDialog() will close anyways. You can continue with rest of your code after the if statement.
FYI- There is no System.continue(). The program pretty much does that on it's own.
You can add an else block. if you want to run the main method again (which I assume you do) it should look like this. You should have some method which you run if the user chooses no, whether it is the main method main(null) or another method.
public static void main(String args[])
{
ButtonTest app = new ButtonTest( );
app.addWindowListener(
new WindowAdapter( )
{
public void windowClosing (WindowEvent e)
{
String message = " Really Quit ? ";
String title = "Quit";
int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
if (reply == JOptionPane.YES_OPTION)
{
System.exit(0);
}
else
{
//whatever you plan on running instead here, instead of quitting,
//main(null) to run the main method, or put another method if you want
}
}
}
);
}

Categories

Resources