i want to open a new tab with a link but using the fuction keyPressed
something like; if i press CTRL+A open a tab on the browser with a specif link
I suggest using the Java Desktop class. Here’s an example:
import java.awt.Desktop;
import java.net.URI;
import java.io.IOException;
import java.net.URISyntaxException;
Desktop desktop;
boolean controlPressed = false;
void setup() {
size(200, 200);
desktop = Desktop.getDesktop();
}
void draw() {
// must keep window running to register keys
}
void keyPressed() {
if (keyCode == 17) { // Control
controlPressed = true;
}
if (keyCode == 65 && controlPressed) { // A
openWebPage("https://discourse.processing.org/");
}
}
void keyReleased() {
if (keyCode == 17) { // Control
controlPressed = false;
}
}
void openWebPage(String siteUrl) {
try {
URI site = new URI(siteUrl);
if (Desktop.isDesktopSupported() && desktop.isSupported(Desktop.Action.BROWSE)) {
desktop.browse(site);
} else {
println("Desktop does not support browse");
}
} catch(URISyntaxException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
}
Links to link() reference:
thank you so much, this is really helpfull!!! i have to do this like 5 times in my project, do you know a “simpler” way to do this? thanks again
You could encapsulate it in a class. Which is just good practice.
BrowserOpener browserOpener;
void setup() {
size(200, 200);
browserOpener = new BrowserOpener();
// A
browserOpener.addSite(65, "https://discourse.processing.org/");
// S
browserOpener.addSite(83, "https://discourse.processing.org/t/open-a-link-on-a-browser-with-keypressed/6740");
}
void draw() {
// must keep window running to register keys
}
void keyPressed() {
browserOpener.keyDown(keyCode);
}
void keyReleased() {
browserOpener.keyUp(keyCode);
}
import java.awt.Desktop;
import java.net.URI;
import java.io.IOException;
import java.net.URISyntaxException;
class BrowserOpener {
ArrayList<SiteKey> siteKeys;
boolean controlPressed;
Desktop desktop;
BrowserOpener() {
siteKeys = new ArrayList<SiteKey>();
controlPressed = false;
desktop = Desktop.getDesktop();
}
void addSite(int codeForKey, String site) {
siteKeys.add(new SiteKey(codeForKey, site));
}
void keyDown(int codeForKey) {
if (codeForKey == 17) {
controlPressed = true;
} else if (controlPressed) {
for (int i = 0; i < siteKeys.size(); i++) {
if (codeForKey == siteKeys.get(i).codeForKey) {
openSite(i);
}
}
}
}
void keyUp(int codeForKey) {
if (codeForKey == 17) {
controlPressed = false;
}
}
void openSite(int index) {
try {
URI site = new URI(siteKeys.get(index).site);
if (Desktop.isDesktopSupported() && desktop.isSupported(Desktop.Action.BROWSE)) {
desktop.browse(site);
} else {
println("Desktop does not support browse");
}
} catch(URISyntaxException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
}
}
class SiteKey {
int codeForKey;
String site;
SiteKey(int codeForKey, String site) {
this.codeForKey = codeForKey;
this.site = site;
}
}
@figraham, what are important differences between using link()
and what you can do with the java.awt.Desktop
approach?
Please provide a brief description of the links.
Apologizes I thought link()
was only implemented within Processing.js because that’s the only place I saw it in documentation. Just saw @GoToLoop’s link to the javadocs. I’d say there’s basically no point to using Desktop
over link. Would recommend that @_megss0 replaces the openWebPage()
method with the link()
method.
I’ve posted link() as an alternative answer to your Desktop-based solution.
Obviously I had to use Pjs’ reference instead b/c Processing’s arbitrarily hides lotsa good API from us!
The fact it was a Pjs link shouldn’t be interpreted as being exclusive to it, since I gave it as a Java Mode answer!
Though I remember link() was once part of Processing’s reference by the time of P1.5.1.
Later on, I remembered to include a Processing JavaDocs reference too.
Well, one good argument for the standalone approach is that link is semi-documented / semi-hidden – which I suppose means it is always possible that it could be removed in the future. Certainly, not finding it in the reference can be confusing for beginners – although I’m honestly happy that it isn’t widely used by beginners; it could be frustrating if people were frequently embedding the equivalent of pop-ups in their sketches.
That’d be an unfortunate, shortsighted, arbitrary decision then.
This link() subject keeps coming from time to time to our Processing forum:
Its Desktop replacement is a tad too complex for Processing’s target audience.