6

We have built a Point of Sale system and now we require to implement it to Touch screens? Do we need to change any code in turn to allow this to work.

And we are using the Keyboard to enter values - let's say quantity - Is there a java way of popping up a key board (like android) when I focus on a JTextField?

Eng.Fouad
  • 115,165
  • 71
  • 313
  • 417
Chan
  • 2,601
  • 6
  • 28
  • 45

5 Answers5

4

Here is a simple example on how to implement a pop-up keyboard:

enter image description here

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;


@SuppressWarnings("serial")
public class MainFrame extends JFrame
{
    private JTextField txt;
    private PopUpKeyboard keyboard;

    public MainFrame()
    {
        super("pop-up keyboard");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        txt = new JTextField(20);
        keyboard = new PopUpKeyboard(txt);

        txt.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                Point p = txt.getLocationOnScreen();
                p.y += 30;
                keyboard.setLocation(p);
                keyboard.setVisible(true);
            }
        });
        setLayout(new FlowLayout());
        add(txt);

        pack();
        setLocationByPlatform(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new MainFrame().setVisible(true);
            }
        });
    }

    private class PopUpKeyboard extends JDialog implements ActionListener
    {
        private JTextField txt;

        public PopUpKeyboard(JTextField txt)
        {
            this.txt = txt;
            setLayout(new GridLayout(3, 3));
            for(int i = 1; i <= 9; i++) createButton(Integer.toString(i));
            pack();
        }

        private void createButton(String label)
        {
            JButton btn = new JButton(label);
            btn.addActionListener(this);
            btn.setFocusPainted(false);
            btn.setPreferredSize(new Dimension(100, 100));
            Font font = btn.getFont();
            float size = font.getSize() + 15.0f;
            btn.setFont(font.deriveFont(size));
            add(btn);
        }

        @Override
        public void actionPerformed(ActionEvent e)
        {
            String actionCommand = e.getActionCommand();
            txt.setText(txt.getText() + actionCommand);
        }
    }
}
Eng.Fouad
  • 115,165
  • 71
  • 313
  • 417
3

If you don't need multi-touch, the normal mouse drivers for use with most touch screen controllers will just have the touch-screen emulate a normal mouse where a finger touching the screen is emulated as a mouse click.

As for a virtual keyboard, there are crummy ones built into Windows and MacOSX but it would probably be best to build one into the application if you can.

If you need multi touch or have issues with specific touch screen controllers, there are a few options.

Your best bet in swing, at least on windows, seems to be this project: http://www.michaelmcguffin.com/code/JWinPointer/

JavaFX appears to have touch support, Intel has a tutorial: https://software.intel.com/en-us/articles/using-javafx-to-implement-multi-touch-with-java-on-windows-8-desktop. You might be able to get this working with swing somehow as there are methods to host Swing in JavaFX and JavaFX in Swing, you might look for other answers to accomplish interop between both.

There was project MT4J, but it seems to be defunct. It doesn't seem to work with Swing or JavaFX.

Charlie
  • 8,530
  • 2
  • 55
  • 53
  • Is there no pre built libraries? – Chan Jul 24 '12 at 03:57
  • I'm sure there exist commercial Java virtual keyboards. – Charlie Jul 24 '12 at 04:07
  • Do I google search, I found 2-3 in the top of the search listing. Not knowing your requirements makes it difficult to make a suggestion in this regard. – MadProgrammer Jul 24 '12 at 04:11
  • My Asus Q552UB with Windows 10 doesn't generate any mouse events from its touch screen until *after* I lift my finger from the screen. Do you know of any setting or other way to make a `mouse pressed` event occur at the moment the screen is touched (rather than when the touch is lifted)? – Stevens Miller Dec 22 '16 at 23:42
  • It's possible you might need to try another solution. I updated the answer with some new information. – Charlie Dec 23 '16 at 05:10
1

You should be able to provide your own virtual keyboard through the use of something like a JWindow and the KeyboardFocusManager

MadProgrammer
  • 343,457
  • 22
  • 230
  • 366
0

We implemented a custom Look-and-feel for our Swing application with touch support to make everything just look bigger (all buttons, checkboxes, ..., even JTree instances) so that it is easy to modify them using a finger.

Such a solution might save you the work to convert all your UI's to a touch-friendly UI.

Robin
  • 36,233
  • 5
  • 47
  • 99
0

You should change your user experience and interaction design, thus change the code. Check out Windows UX guidelines for touch - https://msdn.microsoft.com/en-us/library/windows/desktop/dn742468.aspx

randers
  • 5,031
  • 5
  • 37
  • 64
Max JSwing
  • 33
  • 7