I am trying to copy words from anywhere (like MS word, pdf, not from any java component) to clip board when I double click on it. Therefore, I use awt.Robot to copy that selected word to clip board after double click on it. After copy, the word will return. Therefore, I use two method copy_From_Original and copy_From_ClipBoard.
The problem is when I copy word, it will show the previous word that clipboard content not the current copied one.
If there are, another ways to do this process feel free to say it.
Thanks. Sorry for my bad English.
public class copyWord {
public static String copy_From_Original() {
try {
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_CONTROL);
} catch (AWTException ex) {
Logger.getLogger(copyWord.class.getName()).log(Level.SEVERE, null, ex);
}
String word = copy_From_ClipBoard();
return word;
}
private static String copy_From_ClipBoard() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
Clipboard clipboard = toolkit.getSystemClipboard();
try {
String result = (String) clipboard.getData(DataFlavor.stringFlavor);
return result;
} catch (Exception e) {
System.out.println("ERROR");
return null;
}
} }
Do not use Robot for this. You haven’t said what type of component contains the double-clicked text, but if it’s a JTextField or JTextArea or any other subclass of JTextComponent, you can simply call copy().
If it’s an AWT TextField or TextArea, you can use place the selection on the clipboard yourself:
String text = textField.getSelectedText();
Clipboard clipboard = textField.getToolkit().getSystemClipboard();
clipboard.setContents(new StringSelection(text), null);
Trying to use Text Area to send String to IBM Watson.
Could do this by hard coding String. I want to be able to input my own text in JTextArea.
Move String text = textArea.getText(); inside the actionPerformed method like this:
public void actionPerformed(ActionEvent e) {
String text = textArea.getText();
Profile profile = service.getProfile(text).execute();
System.out.println(profile);
}
I know this question is asked many times.But i didnt get what i want.
I need to automate quick3270 which is used to connect to mainframe using java.
First let me tell you what i want.
I need my code to open quick3270.exe then open my saved session:---this is done.
Now, I have to send commands to the quick3270.Here comes the problem, I dont know how to send command to that software.
Third is I am using robot class.So that i can input:TAB,ENTER,F3 etc. inputs.
So, the whole thing is I want to send commands to quick3270. I need interval also.Like send one command then delay of 1 second then other and so on.
public static void main(String[] args) throws IOException, AWTException {
String exeloc = "C:\\Program Files\\Quick3270\\Quick3270.exe ";
// my saved session
String directory = "C:\\Users\\c111128\\Desktop\\Project\\xyz.ecf";
ProcessBuilder builder = new ProcessBuilder(new String[] { exeloc, directory });
// Starting the process
Process p = builder.start();
// For handling keyboard events
Robot robot = new Robot();
try {
robot.delay(2000);
// Passing enter key to top screen
robot.keyPress(KeyEvent.VK_ENTER);
robot.delay(4000);
// Here I want to write the command
//Command like:"teleview" which is used in mainframe
robot.delay(1000);
}
catch (Exception e) {
System.out.println("Second:" + e);
e.printStackTrace();
}
}
did you manage the Problem?
Via VBA you can send commands to Quick3270 this way:
Set Session = .ActiveSession
Set Screen = Session.Screen
Screen.SendKeys ("<Enter>")
Result = Screen.WaitForKbdUnlock
Screen.SendKeys ("<PF12>")
Screen.SendKeys ("<Enter>")
Result = Screen.WaitForKbdUnlock
Screen.SendKeys ("<PF12>")
Result = Screen.WaitForKbdUnlock
Result = Screen.WaitForCursor(4, 15)
QuickPutstring "1", 10, 2
Private Function QuickPutstring(ByVal PutstringText As String, Row As Long, Col As Long)
Screen.MoveTo Row, Col
Screen.Putstring PutstringText
End Function
Hope that helps...
What I want is that the user can only input decimal numbers on a Text, I don't want it to allow text input as:
HELLO
ABC.34
34.HEY
32.3333.123
I have been trying using VerifyListener, but it only gives me the portion of the text that got inserted, so I end up having the text that I want to insert and the text before the insertion, tried also combining the text, but I got problems when you delete a key (backspace) and I end up having a String like 234[BACKSPACE]455.
Is there a way to set a Mask on a Text or successfully combine VerifyEvent with the current text to obtain the "new text" before setting it to the Text?
You will have to add a Listener on the Text using SWT.Verify. Within this Listener you can verify that the input contains only a decimal number.
The following will only allow the insertion of decimals into the text field. It will check the value each time you change something in the text and reject it, if it's not a decimal.
This will solve your problem, since the VerifyListener is executed BEFORE the new text is inserted. The new text has to pass the listener to be accepted.
public static void main(String[] args) {
Display display = Display.getDefault();
final Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Text textField = new Text(shell, SWT.BORDER);
textField.addVerifyListener(new VerifyListener() {
#Override
public void verifyText(VerifyEvent e) {
Text text = (Text)e.getSource();
// Get old text and create new text by using the VerifyEvent.text
final String oldS = text.getText();
String newS = oldS.substring(0, e.start) + e.text + oldS.substring(e.end);
try
{
Float.parseFloat(newS);
}
catch(NumberFormatException ex)
{
// Prevent the input from happening, as it's not a float
e.doit = false;
}
System.out.println(newS);
}
});
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
Have you tried the FormattedText Widgets from Nebula? - They are an easy way to implement these kind of input fields, see http://eclipse.org/nebula/widgets/formattedtext/formattedtext.php
In order to get the behavior that I wanted I had to use several listeners:
A VerifyListner restricts the characters that are accepted as partial input while typing
A FocusListener validates the total input when leaving focus. If the total input is not valid, an error decoration will be shown.
A ModifyListener checks if the error decoration can be hidden while typing. It does not show the error decoration since invalid partial input like "4e-" is allowed to finally enter "4e-3"
valueField.addVerifyListener((event) -> restrictInput(event));
valueField.addModifyListener((event) -> validateValueOnChange(valueField.getText()));
valueField.addFocusListener(new FocusListener() {
#Override
public void focusGained(org.eclipse.swt.events.FocusEvent e) {}
#Override
public void focusLost(org.eclipse.swt.events.FocusEvent event) {
validateValueOnFocusLoss(valueField.getText());
}
});
protected void restrictInput(VerifyEvent event) {
String allowedCharacters = "0123456789.,eE+-";
String text = event.text;
for (int index = 0; index < text.length(); index++) {
char character = text.charAt(index);
boolean isAllowed = allowedCharacters.indexOf(character) > -1;
if (!isAllowed) {
event.doit = false;
return;
}
}
}
protected void validateValueOnChange(String text) {
try {
Double.parseDouble(valueField.getText());
valueErrorDecorator.hide();
} catch (NumberFormatException exception) {
//expressions like "5e-" are allowed while typing
}
}
protected void validateValueOnFocusLoss(String value) {
try {
Double.parseDouble(valueField.getText());
valueErrorDecorator.hide();
} catch (NumberFormatException exception) {
valueErrorDecorator.show();
}
}
The ModifyListener could be further improved to check for partial input that is not able to finally give a valid total input, e.g. "4e-....3". In that special case the ModifyListener should activate the error decoration while typing.
In addition to #Tom Seidel's answer: You could use a org.eclipse.swt.widgets.Spinner. This allows only digits. You can specify min and max value and the return value is an int so no need to cast a String.
final Composite composite parent = new Composite(superParent, SWT.NONE);
parent.setLayout(new FillLayout());
final Spinner spinner = new Spinner(parent, SWT.BORDER);
spinner.setvalues(0, 10, Integer.MAX_VALUE, 0, 1, 10);
The value of the Spinner can than be retrieved by calling:
int selectedValue = spinner.getSelection();
I need to develop a Lotus Notes plug-in that adds some UI to Lotus Notes main UI and does the following when user creates & sends an email:
Intercept the outgoing email to see if there are any attachments in email.
If there is any attachment found in email, cancel sending the email.
Manipulate the attachments of email and then send the email again (by calling some Notes API)
Is this doable in Lotus Notes plug-ins?
Thanks & regards,
Nadeem Ullah
package com.ibm.NotesJava.agents;
import lotus.domino.*;
import java.io.File;
import java.io.FileInputStream;
import java.lang.*;
import java.util.*;
import java.awt.*;
import java.awt.List;
import java.awt.event.*;
import java.text.SimpleDateFormat;
public class MyJavaAgent extends AgentBase {
//Main metho which is called by lotus notes
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
// (Your code goes here)
Name n = session.createName(agentContext.getEffectiveUserName());
String st = n.getCommon();
Log log=session.createLog("JAVA_AGENT");
log.openFileLog("JAVA_AGENT.log");
MessageBox mb = new MessageBox();
try{
log.logAction("");
log.logAction("******************************Starting JAVA AGENT ************************");
log.logAction("Hello " + st + "!");
log.logAction("Executing JavaAgentTest with Agent: "+agentContext.getCurrentAgent().getName());
Database db = agentContext.getCurrentDatabase();
//System.out.println("Loading emaildetails.properties file from following location:C:\\Program Files\\Lotus\\Notes\\framework\\emaildetails.properties");
log.logAction("Loading emaildetails.properties file from following location:C:\\Program Files\\Lotus\\Notes\\framework\\emaildetails.properties");
Properties pro = new Properties();
File fil = new File("C:\\Program Files\\Lotus\\Notes\\framework\\emaildetails.properties");
//***********LOGIC*********
DocumentCollection coll=agentContext.getUnprocessedDocuments();
Document doc=coll.getFirstDocument();
//get input from user about the process area
}
}
/************************Library Code ***********************************/
/*
* The MessageBox class allows you to create simple message boxes
* using only the java.awt classes. All you have to do is create an instance
* of a MessageBox and use it to call the doOkCancelDialog or the
* doInputBox methods. You can use a single MessageBox instance to
* create multiple dialogs.
*
* This class has been implemented here as an inner class, but there's
* no reason why it couldn't be a class all by itself. The functionality to
* create buttons and messageboxes has been modularized, so it should
* be easy for you to add your own methods to this class, or make global
* modifications as you desire.
*
* The only really complicated/weird thing I had to do was to write and
* include the MultiLineLabel class, which is included towards the end
* of this class as an inner class. Read the comments associated with
* that class to see what's going on there.
*
* Make sure you import java.awt.* and java.awt.event.*
*
* Julian Robichaux -- http://www.nsftools.com
*/
class MessageBox {
public final int NO_ACTION = -1;
public final int CANCEL_ACTION = 0;
public final int OK_ACTION = 1;
int actionCode = NO_ACTION;
Frame parent;
Dialog msgbox;
MultiLineLabel msglabel; // our custom class, defined later
Panel buttons;
Button ok, cancel;
TextField textbox;
Choice dropdown;
List multilist;
public MessageBox () {
// this is the invisible Frame we'll be using to call all of our Dialogs
parent = new Frame();
}
public void dispose () {
// use this when you're ready to clean up
try { msgbox.dispose(); } catch (Exception e) {}
try { parent.dispose(); } catch (Exception e) {}
}
/*
* This method will create a simple dialog box with a title, a message,
* and Ok/Cancel buttons. It will halt execution of your program until
* one of the buttons is clicked, and it will return either OK_ACTION
* if the Ok button is clicked, or CANCEL_BUTTON if the Cancel
* button is clicked.
*/
public int doOkCancelDialog (String title, String message) {
actionCode = NO_ACTION;
try {
// create the messagebox
msgbox = new Dialog(parent, title, true);
msgbox.setLayout(new BorderLayout());
// create the label
initMsglabel(message);
msgbox.add("North", msglabel);
// create the OK and Cancel buttons
buttons = new Panel();
buttons.setLayout(new FlowLayout());
initOkButton();
buttons.add(ok);
initCancelButton();
buttons.add(cancel);
msgbox.add("South", buttons);
// display everything (the system will wait until a button is pressed
// before returning)
displayMsgbox();
msgbox.dispose(); // just in case the ActionListeners didn't fire...
} catch (Exception e) {
}
return actionCode;
}
/*
* This method will create a dialog box that allows the user to enter
* text into a field. It also has a title, a message, and Ok/Cancel buttons,
* and will halt execution of your program until one of the buttons is
* clicked or the user enters text into the field and presses "Enter".
* If the user clicks the Ok button or enters text and presses "Enter",
* then the text in the field will be returned; otherwise, this method will
* return null (which usually indicates that the user clicked Cancel).
*/
public String doInputBox (String title, String message, String defaultText) {
actionCode = NO_ACTION;
try {
// create the messagebox
msgbox = new Dialog(parent, title, true);
msgbox.setLayout(new BorderLayout());
// create the label
initMsglabel(message);
msgbox.add("North", msglabel);
// create the text field
initTextbox(defaultText);
msgbox.add("Center", textbox);
// create the OK and Cancel buttons
buttons = new Panel();
buttons.setLayout(new FlowLayout());
initOkButton();
buttons.add(ok);
initCancelButton();
buttons.add(cancel);
msgbox.add("South", buttons);
// display everything (the system will wait until a button is pressed
// before returning)
displayMsgbox();
msgbox.dispose(); // just in case the ActionListeners didn't fire...
} catch (Exception e) {
}
if (actionCode == OK_ACTION)
return textbox.getText();
else
return null;
}
/*
* This method will create a dialog box that allows the user to select from
* a dropdown list. It also has a title, a message, and Ok/Cancel buttons,
* and will halt execution of your program until one of the buttons is
* clicked. If the user clicks the Ok button then the text in the field will be
* returned; otherwise, this method will return null (which usually indicates
* that the user clicked Cancel).
*/
public String doDropdownBox (String title, String message, String[] selections) {
actionCode = NO_ACTION;
try {
// create the messagebox
msgbox = new Dialog(parent, title, true);
msgbox.setLayout(new BorderLayout());
// create the label
initMsglabel(message);
msgbox.add("North", msglabel);
// create the dropdown box
initDropdown(selections);
msgbox.add("Center", dropdown);
// create the OK and Cancel buttons
buttons = new Panel();
buttons.setLayout(new FlowLayout());
initOkButton();
buttons.add(ok);
initCancelButton();
buttons.add(cancel);
msgbox.add("South", buttons);
// display everything (the system will wait until a button is pressed
// before returning)
displayMsgbox();
msgbox.dispose(); // just in case the ActionListeners didn't fire...
} catch (Exception e) {
}
if (actionCode == OK_ACTION)
return dropdown.getSelectedItem();
else
return null;
}
/*
* This method will create a dialog box that allows the user to select from
* a list of options (use the allowMultiSelect parameter to indicate whether
* the user can select multiple items from the list [true] or just one [false]).
* It also has a title, a message, and Ok/Cancel buttons, and will halt
* execution of your program until one of the buttons is clicked. If the user
* clicks the Ok button then the text in the field will be returned; otherwise,
* this method will return null (which usually indicates that the user clicked
* Cancel or didn't select anything).
*/
public String[] doMultilistBox (String title, String message, String[] selections, boolean allowMultiSelect) {
actionCode = NO_ACTION;
try {
// create the messagebox
msgbox = new Dialog(parent, title, true);
msgbox.setLayout(new BorderLayout());
// create the label
initMsglabel(message);
msgbox.add("North", msglabel);
// create the multilist field
initMultilist(4, allowMultiSelect, selections);
msgbox.add("Center", multilist);
// create the OK and Cancel buttons
buttons = new Panel();
buttons.setLayout(new FlowLayout());
initOkButton();
buttons.add(ok);
initCancelButton();
buttons.add(cancel);
msgbox.add("South", buttons);
// display everything (the system will wait until a button is pressed
// before returning)
displayMsgbox();
msgbox.dispose(); // just in case the ActionListeners didn't fire...
} catch (Exception e) {
}
if ((actionCode == OK_ACTION) &&
(java.lang.reflect.Array.getLength(multilist.getSelectedItems()) > 0))
return multilist.getSelectedItems();
else
return null;
}
/*
* The private methods below are simply reusable modular functions for
* creating various elements that may appear in a MessageBox dialog.
* They make it easier to write new public methods that create different
* kinds of dialogs, and also allow you to make global changes to all your
* dialog components pretty easily.
*/
private void initMsglabel (String message) {
// the actual message in the MessageBox (using the custom
// MultiLineLabel class, included below)
msglabel = new MultiLineLabel(message);
}
private void initOkButton () {
// the OK button
ok = new Button("OK");
ok.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionCode = OK_ACTION;
msgbox.dispose();
}
} );
}
private void initCancelButton () {
// the Cancel button
cancel = new Button("Cancel");
cancel.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionCode = CANCEL_ACTION;
msgbox.dispose();
}
} );
}
private void initTextbox (String defaultText) {
// the field that allows a user to enter text in an InputBox
textbox = new TextField(defaultText, 40);
// the ActionListener here will get called if the user presses "Enter"
textbox.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionCode = OK_ACTION;
msgbox.dispose();
}
} );
}
private void initDropdown (String[] selections) {
// a dropdown box that allows a user to select from a list of
// multiple items
dropdown = new Choice();
for (int i = 0; i < java.lang.reflect.Array.getLength(selections); i++)
dropdown.add(selections[i]);
}
private void initMultilist (int numOfLines, boolean allowMultiSelect, String[] selections) {
// a multiple selection box that allows a user to select one or
// more items. numOfLines indicates how many lines should be
// visible at a time, allowMultiSelect is a boolean value indicating
// whether or not the user should be allowed to select more than
// one item from the list, and selections is an array of Strings that
// is used to populate the selection box
multilist = new List(numOfLines, allowMultiSelect);
for (int i = 0; i < java.lang.reflect.Array.getLength(selections); i++)
multilist.add(selections[i]);
}
private void displayMsgbox () {
// once all of the components have been added to a dialog,
// use this method to display it
Dimension d = msgbox.getToolkit().getScreenSize();
msgbox.setLocation(d.width/3, d.height/3); // center the dialog (sort of)
msgbox.pack(); // organize all its components
msgbox.setResizable(false); // make sure the user can't resize it
msgbox.toFront(); // give it focus
msgbox.setVisible(true); // and display it
}
/*
* Okay, this is a pain, but java.awt doesn't natively have a Label-type class
* that allows you to display text that's more than one line. So I had to write one
* myself. The class below is a modification of some code from the fantastic
* book, "Java in a Nutshell".
*
* The big change I made was to allow this multi-line label to have a fixed width,
* so the Label wouldn't fly off the screen if you had a big paragraph of text to
* display. The width is specified in "columns", which I defined as the width of
* the letter "X" in whatever font is being used. The text that you add to the label
* is automatically split into chunks that are no longer than the number of columns
* specified (you'll see the code to do this in the parseLabel method).
*
* This sample implementation is an inner class of the MessageBox class, although
* it could also be a separate class all by itself. I made it an inner class to make it
* easier to copy and paste everything from one agent to another.
*
* Julian Robichaux -- http://www.nsftools.com
*/
class MultiLineLabel extends Canvas {
// a custom class that will display a text label at a fixed width across
// multiple lines
// (modification of MultiLineLabel class from "Java in a Nutshell")
String label;
String[] lines;
int rows = 1;
int cols = 40;
int margin = 6;
int rowHeight;
int lineAscent;
int maxWidth;
public MultiLineLabel (String text) {
// create a label with the default width
label = text;
}
public MultiLineLabel (String text, int columns) {
// create a label with the specified number of "columns" (where a column
// is the width of "X" in the font that we're using)
if (columns > 0)
cols = columns;
label = text;
}
protected void measure () {
// get the global values we use in relation to our current font
FontMetrics fm = this.getFontMetrics(this.getFont());
if (fm == null)
return;
rowHeight = fm.getHeight();
lineAscent = fm.getAscent();
maxWidth = fm.stringWidth("X") * cols;
}
private int stringWidth (String text) {
// calculate the width of a String using our current font
FontMetrics fm = this.getFontMetrics(this.getFont());
if (fm == null)
return 0;
return fm.stringWidth(text);
}
public Font getFont () {
// return the font that we're currently using
return super.getFont();
}
public void setFont (Font f) {
// change the font that we're currently using, and redraw the
// label with the new font
super.setFont(f);
repaint();
}
public void addNotify () {
// automatically invoked after our label/Canvas is created but
// before it's displayed (FontMetrics aren't available until
// super.addNotify() has been called)
super.addNotify();
measure();
}
public Dimension getPreferredSize () {
// called by the LayoutManager to find out how big we want to be
if (lines == null)
setText(label);
return new Dimension(maxWidth + (2 * margin), (rows * rowHeight) + (2 * margin));
}
public Dimension getMinimumSize () {
// called by the LayoutManager to find out what our bare minimum
// size requirements are
if (lines == null)
setText(label);
return new Dimension(maxWidth, (rows * rowHeight));
}
public void setText (String text) {
// change the text we're using for this label
label = text;
parseLabel();
}
private void parseLabel () {
// parses the text we want to display in the label, so that the lines[]
// variable contains lines of text that are no wider than maxWidth
String token, word;
StringBuffer msg = new StringBuffer("");
StringBuffer line = new StringBuffer("");
// do an initial measurement, to make sure we have maxWidth
measure();
rows = 0;
// we'll be tokenizing the label String twice, first at every end-of-line
// character ('\n') and then at every space (if the lines are too long),
// in order to generate an StringBuffer of proper length lines, all
// separated by \n
java.util.StringTokenizer st1 = new java.util.StringTokenizer(label, "\n", false);
while (st1.hasMoreTokens()) {
token = st1.nextToken();
if (stringWidth(token) <= maxWidth) {
// if the whole line is shorter than the maxWidth allowed, we can
// just add this line to the buffer and get the next one
rows++;
msg.append(token + "\n");
} else {
// if the line was too long, we'll have to break it up manually by
// tokenizing the line at every space and adding words together
// one by one until we have a line that's greater than maxWidth;
// then we can add that shorter line to the buffer and keep doing
// that until we're out of words
java.util.StringTokenizer st2 = new java.util.StringTokenizer(token, " ", false);
while (st2.hasMoreTokens()) {
word = st2.nextToken();
if ((stringWidth(line.toString()) + stringWidth(word)) > maxWidth) {
rows++;
msg.append(line.toString() + "\n");
line.setLength(0);
line.append(word + " ");
} else {
line.append(word + " ");
}
}
// after we've run out of words, add any remaining text to the buffer, too
if (line.length() > 0) {
rows++;
msg.append(line.toString() + "\n");
}
}
}
// once we're done, split the buffer into the lines[] array
java.util.StringTokenizer st = new java.util.StringTokenizer(msg.toString(), "\n");
lines = new String[rows];
for (int i = 0; i < rows; i++)
lines[i] = st.nextToken();
}
public void paint (Graphics g) {
// draw the actual label to the screen, with space around the edges
// based on the margins we've specified (for some reason, we have to
// call setLabel instead of just parseText here in order to get the size
// right, which is a little redundant, but whatever works...)
int y;
setText(label);
Dimension d = this.getSize();
y = lineAscent + (d.height - (rows * rowHeight)) / 2;
for (int i = 0; i < rows; i++, y += rowHeight)
g.drawString(lines[i], margin, y);
}
}
}// end of the MultiLineLabel class
I think you can do it using java lotus notes API.
Download the examples from here..
http://www.nsftools.com/tips/NotesTips.htm#javascraps
Download javascraps.zip file..it has example for maximum API..
To complete ur work u need to create a java agent in lotus notes and then you need to write java code as per your requirement using the java API to get the task done..