Có thể trong Java để vẽ các hình dạng và nội dung trực tiếp trên màn hình để máy tính của tôi vẫn hiển thị và tôi có thể nhấp vào bất kỳ thứ gì bên dưới hình dạng của mình không? Tôi đang sử dụng Windows XP. Cảm ơn.Vẽ trực tiếp trên màn hình
Trả lời
Có, điều đó là có thể. Nhưng nó không phải là một nhiệm vụ tầm thường.
Nếu bạn đang tìm kiếm "widget desktop":
Xem this và this link* cho mờ & cửa sổ hình
Xem this link để biết thông tin GUI nghiệm hơn.
Có thể bạn sẽ cần JNA hoặc JNI để tạo các cửa sổ/hiệu ứng này, mà còn để cung cấp chức năng "nhấp qua".
* Yêu cầu Java 6u10. Về cơ bản bạn có thể vẽ bất kỳ thứ gì bạn muốn bên trong một Khung, đặt các thuộc tính được đề cập trong chuỗi được liên kết và bất kỳ nơi nào bạn không vẽ (hoặc vẽ các pixel trong suốt) màn hình sẽ hiển thị.
(Tôi muốn xem xét sử dụng một ngôn ngữ/khuôn khổ khác nhau từ Java, như máy tính để bàn-widget không thực sự dễ dàng để thực hiện trong Java [thậm chí có thể JavaFX?])
tôi có một chương trình rất lạ. Có một lớp, DirectPaintingDevice
. Đây rồi; giải thích là mã dưới đây:
package direct_painting_device;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.function.Consumer;
import javax.swing.JFrame;
import javax.swing.JPanel;
public final class DirectPaintingDevice {
public final Graphics2D graphics;
private BufferedImage image;
private final ArrayList<JFrame> frames = new ArrayList<>(0);
private final ArrayList<Runnable> actions = new ArrayList<>(0);
public DirectPaintingDevice() {
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
this.image = new BufferedImage(screen.width, screen.height,
BufferedImage.TYPE_INT_ARGB);
this.graphics = this.image.createGraphics();
Color color = this.graphics.getColor();
this.graphics.setColor(new Color(0, true));
this.graphics.fillRect(0, 0, screen.width, screen.height);
this.graphics.setColor(color);
}
public synchronized void update() {
this.frames.forEach(JFrame::dispose);
this.frames.clear();
ArrayList<Point> done_points = new ArrayList<>(0);
for (int x = 0; x < this.image.getWidth(); x++) {
for (int y = 0; y < this.image.getHeight(); y++) {
if (this.image.getRGB(x, y) >> 24 == 0
|| done_points.contains(new Point(x, y))) {
continue;
}
final int cx = x;
final int cy = y;
int w;
for (w = 0; w < this.image.getWidth() - x
&& this.image.getRGB(x + w, y) >> 24 == this.image
.getRGB(x, y) >> 24; w++) {
// Empty loop
}
int h;
outer: for (h = 0; h < this.image.getHeight() - y; h++) {
for (int cw = 0; cw < w; cw++) {
if (this.image.getRGB(x + cw, h + y) >> 24 != this.image
.getRGB(x, y) >> 24) {
break outer;
}
}
for (int i = 0; i < w; i++) {
done_points.add(new Point(i + x, h + y));
}
}
final int cw = w;
final int ch = h;
JFrame frame = new JFrame();
frame.setUndecorated(true);
frame.setDefaultCloseOperation(0);
frame.setSize(w, h);
frame.setLocation(x, y);
frame.setOpacity((int) (1 - ((double) (this.image.getRGB(x, y) >> 24)/505)));
frame.toFront();
frame.setAlwaysOnTop(true);
frame.add(new JPanel() {
private static final long serialVersionUID = 6246612303574731899L;
public void paintComponent(Graphics g) {
g.drawImage(DirectPaintingDevice.this.image
.getSubimage(cx, cy, cw, ch), 0, 0, null);
}
});
frame.setVisible(true);
System.out.println("Created Frame : [" + x + ", " + y + ", "
+ w + ", " + h + "];");
this.frames.add(frame);
}
}
this.actions.forEach(Runnable::run);
}
public synchronized void allFrames(Consumer<JFrame> action) {
synchronized (this) {
this.frames.forEach(action);
}
}
public synchronized void exec(Consumer<Graphics2D> action) {
new Thread(() -> {
synchronized (DirectPaintingDevice.this) {
action.accept(DirectPaintingDevice.this.graphics);
}
}).start();
}
public void onUpdate(Runnable action) {
this.actions.add(action);
}
public synchronized void setImage(BufferedImage image) {
this.image = image;
}
public static void main(String... args) throws IOException {
DirectPaintingDevice device = new DirectPaintingDevice();
device.graphics.setColor(Color.BLACK);
device.graphics.fillRect(0, 0, 50, 50);
device.graphics.fillRect(0, 50, 50, 50);
device.graphics.fillRect(0, 100, 50, 50);
device.graphics.fillRect(50, 0, 50, 50);
device.graphics.fillRect(50, 100, 50, 50);
device.graphics.fillRect(100, 0, 50, 50);
device.graphics.fillRect(100, 50, 50, 50);
device.graphics.fillRect(100, 100, 50, 50);
device.graphics.fillRect(0, 70, 100, 10);
device.graphics.fillRect(70, 0, 10, 100);
device.update();
};
}
Tạo một DirectPaintingDevice
, và sử dụng device.graphics...
vẽ những thứ sử dụng một đối tượng Graphics2D
. Sau đó, sử dụng device.update();
để cập nhật các cửa sổ. Nó tạo ra rất nhiều hình chữ nhật JFrames.
Tuy nhiên, hãy nhớ rằng mã này là cực kỳ chậm và chậm.
Đây có phải là câu trả lời hoặc câu hỏi mới không? – durron597
Đây là câu trả lời. – HyperNeutrino
Tôi xin lỗi nếu câu hỏi ban đầu của tôi thiếu chi tiết, nhưng tôi đã cố gắng để tạo ra một hình dạng trong suốt chuột, không hình dạng có lỗ. Tôi không nghĩ rằng lỗ hổng được tính là một phần của hình dạng ... Mặc dù vậy, thú vị là hack;) – Martynas
- 1. Làm cách nào để vẽ trực tiếp trên màn hình?
- 2. Vẽ Python trên màn hình
- 3. Số byte trực tiếp so với bộ nhớ thực trong màn hình hoạt động trên iOS
- 4. Vẽ hình ảnh trên chế độ toàn màn hình Android
- 5. Màu/mờ có thể vẽ trên màn hình
- 6. Vẽ để xem trực tiếp trên đầu trang của tất cả các cửa sổ
- 7. Webapp trên iPad 3 màn hình hiển thị võng mạc màn hình chậm vẽ
- 8. Vòng vẽ trên vải không phù hợp với màn hình
- 9. Vẽ một hàm trực tiếp từ một tệp văn bản
- 10. Vẽ lại màn hình trong terminal
- 11. Cách vẽ UIImage hoặc trực tiếp trong -drawRect :?
- 12. Lỗi vẽ màn hình Whim vim
- 13. Cách vẽ TextView vào Bitmap (không bao giờ được vẽ trên màn hình)
- 14. Cách lấy độ phân giải màn hình của trình duyệt trực tiếp
- 15. Có thể chụp ảnh màn hình trực tiếp bằng cách sử dụng WebDriver không?
- 16. Loại tham chiếu trực tiếp trên heap, loại giá trị trực tiếp trên ngăn xếp
- 17. Vẽ trên màn hình võng mạc bằng cách sử dụng CoreGraphics - Hình ảnh pixelated
- 18. Khởi động WPF trên màn hình phụ?
- 19. Phát trực tuyến âm thanh trực tiếp trên trang web
- 20. Giải mã base64 Phát trực tiếp hình ảnh
- 21. nhấp - chỉ trên "trực tiếp" onclicks
- 22. Truyền trực tiếp từ M3U trên Android
- 23. Scala sánh chữ trên regex trực tiếp
- 24. Làm thế nào để vẽ ra màn hình bằng C++?
- 25. Qt. Cách nhanh nhất để vẽ 1024x1024 chấm trên màn hình
- 26. Terminal đọc từ stdout như thế nào và vẽ văn bản trên màn hình?
- 27. Có thể tiếp quản toàn bộ màn hình của nhiều màn hình với .NET trên Windows không?
- 28. Máy tính vẽ màn hình như thế nào?
- 29. iOS: CAShapeLayer để vẽ hình ảnh không trực tràng và làm động hình dạng của nó
- 30. Cách phát trực tiếp video trực tiếp RTMP trong Android
Ý của bạn có phải là chính màn hình máy tính hoặc cửa sổ không? –