- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Tiếp tục câu hỏi trước , Tôi đang tìm cách tốt nhất để kết hợp hiển thị đang hoạt động với các trường văn bản trong Java. Tôi đã thử một số tùy chọn, sử dụng BufferStrategy, VolatileImage hoặc ghi đè update() và Paint() trong AWT tiêu chuẩn, nhưng cuối cùng tôi lại sử dụng Swing.
Tôi đăng trạng thái hiện tại ở đây phòng trường hợp bất kỳ ai có thông tin chi tiết mới dựa trên ví dụ về mã của tôi và có thể những người khác đang phát triển các ứng dụng tương tự có thể hưởng lợi từ những phát hiện của tôi.
Mục tiêu là hoàn thành ba kỳ công sau:
Dưới đây là mã cho một ứng dụng demo được phát triển với sự trợ giúp tuyệt vời từ stackoverflowerthần rác rưởi .
Hai lưu ý:
1) Việc làm mới nghiêm ngặt các khu vực hoạt ảnh mà bước trước đó không hợp lệ dường như dễ gây ra lỗi hình ảnh, vì vậy tôi đã từ bỏ. Điều này có nghĩa là bây giờ tôi vẽ lại toàn bộ vùng đệm nền cho mỗi khung hình.
2) Hiệu quả của việc vẽ BufferedImage lên màn hình phụ thuộc rất nhiều vào nền tảng. Việc triển khai Mac dường như không hỗ trợ tăng tốc phần cứng một cách thích hợp, điều này khiến cho việc vẽ lại hình nền cho cửa sổ đầu ra trở thành một công việc tẻ nhạt, tất nhiên tùy thuộc vào kích thước cửa sổ.
Tôi đã tìm thấy các kết quả sau trên iMac lõi kép 2,93 GHz của mình:
Mac OS 10.5:
640 x 480: 0,9 ms, 8 - 9%
1920 x 1100: 5 ms, 35 - 40%
Windows XP:
640 x 480: 0,05 mili giây, 0%
1920 x 1100: 0,05 mili giây, 0%
huyền thoại:
Kích thước màn hình: thời gian trung bình để vẽ một khung hình, mức sử dụng CPU của ứng dụng.
Theo như tôi biết, mã bên dưới là cách hiệu quả nhất để đạt được mục tiêu của tôi. Mọi thông tin chi tiết, tối ưu hóa hoặc kết quả thử nghiệm mới đều được hoan nghênh!
Trân trọng, Matisse
nhập java.awt.Color;
nhập java.awt.Dimension;
nhập java.awt.EventQueue;
nhập java.awt.Graphics;
nhập java.awt.Graphics2D;
nhập java.awt.GraphicsConfiguration;
nhập java.awt.GraphicsDevice;
nhập java.awt.GraphicsEnvironment;
nhập java.awt.GridLayout;
nhập java.awt.Rectangle;
nhập java.awt.Transparency;
nhập java.awt.event.ActionEvent;
nhập java.awt.event.ActionListener;
nhập java.awt.event.ComponentAdapter;
nhập java.awt.event.ComponentEvent;
nhập java.awt.event.MouseAdapter;
nhập java.awt.event.MouseEvent;
nhập java.awt.image.BufferedImage;
nhập javax.swing.JFrame;
nhập javax.swing.JPanel;
nhập javax.swing.JTextField;
nhập javax.swing.Timer;
lớp công khai SwingTest mở rộng các triển khai JPanel
Trình nghe hành động,
Có thể chạy được
{
riêng tư cuối cùng dài serialVersionUID = 1L;
bộ đệm nền BufferedImage riêng tư;
boolean repaintbackground = true;
riêng tư cuối cùng tĩnh initWidth = 640;
riêng tư tĩnh cuối cùng initHeight = 480;
bán kính int tĩnh cuối cùng = 25;
riêng cuối cùng Bộ hẹn giờ t = Bộ hẹn giờ mới (20, cái này);
riêng tư cuối cùng Hình chữ nhật trực tràng = Hình chữ nhật mới();
riêng tư tổng thời gian dài = 0;
khung int riêng tư = 0;
thời gian trung bình dài riêng tư = 0;
public static void main(String[] args) {
EventQueue.invokeLater(new SwingTest());
}
công khai SwingTest() {
siêu (đúng);
this.setPreferredSize(New Dimension(initWidth, initHeight));
this.setLayout(null);
this.setOpaque(false);
this.addMouseListener(New MouseHandler());
}
@Ghi đè
công khai void run() {
JFrame f = JFrame mới("SwingTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.addComponentListener(new ResizeHandler());
/* Panel bổ sung này với GridLayout là cần thiết để đảm bảo
bảng nội dung của chúng tôi được thay đổi kích thước phù hợp với cửa sổ.*/
JPanel p = JPanel mới(new GridLayout());
p.add(cái này);
f.add(p);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
createBuffer();
t.start();
}
@Ghi đè
public void actionPerformed(ActionEvent e) {
this.repaint();
}
@Ghi đè
protected void PaintComponent(Graphics g) {
bắt đầu dài = System.nanoTime();
super.paintComponent(g);
if (backgroundBuffer == null) createBuffer();
nếu (repaintbackground) {
/* Sơn lại nền có thể yêu cầu các thao tác hiển thị phức tạp,
vì vậy chúng tôi không muốn thực hiện việc này ở mọi khung hình.*/
repaintBackground(backgroundBuffer);
sơn lại nền = sai;
}
/* Sơn lại bộ đệm nền được kết xuất trước ở mỗi khung hình
dường như không thể tránh khỏi.
vùng bị vô hiệu và chỉ sơn lại phần đó của bộ đệm nền
hình ảnh đã thất bại */
g.drawImage(backgroundBuffer, 0, 0, null);
repaintBall(g, BackgroundBuffer, this.getWidth(), this.getHeight());
repaintDrawTime(g, System.nanoTime() - bắt đầu);
}
void repaintBackground(Bộ đệm BufferedImage) {
Graphics2D g = buffer.createGraphics();
int width = buffer.getWidth();
int chiều cao = buffer.getHeight();
g.clearRect(0, 0, chiều rộng, chiều cao);
vì (int i = 0; i < 100; i++) {
g.setColor(Màu mới(0, 128, 0, 100));
g.drawLine(width, Height, (int)(Math.random() * (width - 1)), (int)(Math.random() * (height - 1)));
}
}
void repaintBall(Đồ họa g, Bộ đệm hình ảnh đệm, chiều rộng int, chiều cao int) {
thời gian gấp đôi = 2* Math.PI * (System.currentTimeMillis() % 3300) / 3300.;
orth.setRect((int)(Math.sin(time) * width/3 + width/2 - bán kính), (int)(Math.cos(time) * chiều cao/3 + chiều cao/2) - bán kính, bán kính * 2, bán kính * 2);
g.setColor(Color.BLUE);
g.fillOval(orth.x, orth.y, orth.width, orth.height);
}
void repaintDrawTime(Đồ họa g, frameTime dài) {
if (khung == 32) {avgTime = tổng thời gian/32; tổng thời gian = 0; khung = 0;}
khác {totalTime += frameTime; khung ++;
g.setColor(Color.white);
Chuỗi s = String.valueOf(avgTime / 1000000d + "ms");
g.drawString(s, 5, 16);
}
void createBuffer() {
int width = this.getWidth();
int chiều cao = this.getHeight();
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
Cấu hình đồ họa gc = gs.getDefaultConfiguration();
nềnBuffer = gc.createCompatibleImage(chiều rộng, chiều cao, Độ trong suốt.OPAQUE);
repaintbackground = true;
}
lớp riêng MouseHandler mở rộng MouseAdapter {
@Ghi đè
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
Trường JTextField = JTextField mới("test");
Thứ nguyên d = field.getPreferredSize();
field.setBounds(e.getX(), e.getY(), d.width, d.height);
thêm (trường);
}
}
lớp riêng ResizeHandler mở rộng ComponentAdapter {
@Ghi đè
public void thành phầnResized(ComponentEvent e) {
super.comComponentResized(e);
System.out.println("Đã thay đổi kích thước thành " + getWidth() + " x " + getHeight());
createBuffer();
}
}
}
câu trả lời hay nhất
Tôi có một vài suy nghĩ:
bạn đã cải thiệnsơn lạiDrawTime()
Rất dễ đọc, nhưng nó làđiểm chuẩn vi môvà tùy thuộc vàothất thườngHệ điều hành máy chủ. Tôi không thể không tự hỏi liệu XP có phải là hệ thống không độ phân giải đồng hồ hạn chế sản phẩm. Tôi thấy kết quả rất khác nhau trên Windows 7 và Ubuntu 10.
Nếu bạn không sử dụng bố cục trống, bạn không cần các bảng bổ sung; JPanel
Bố cục mặc định là FlowLayout
,f.add(cái này)
Chỉ cần thêm nó vào mặc định của khung Trung tâm BorderLayout
.
Việc gọi hàm tạo nhiều lần có thể tốn thời gian.
Xem xét thay thế
g.setColor(Màu mới(0, 128, 0, 100));
Và
riêng tư tĩnh cuối cùng Màu màu = Màu mới (0, 128, 0, 100);
...
g.setColor(màu);
Hoặc, một cách đơn giản bảng tra cứu màu sắc , có thể hữu ích, ví dụ:
riêng tư cuối cùng Queue clut = new LinkedList();
Về java - Hiệu quả hiển thị hoạt động của Swing hoặc cách kết hợp hiển thị hoạt động với các tiện ích gui, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/3289336/
Tôi có một bảng Excel cập nhật xếp hạng của người chơi. Khởi tạo vị trí người chơi 1 2 3 4 Xếp hạng tài chính A 1 2,0 1,000 0,018 0,016 0,014 2,007 D 2 -2,0 54,5
Tôi có một bản đồ = std::map trong đó myItemModel kế thừa QAbstractItemModel. Bây giờ tôi muốn hợp nhất tất cả myItemModels thành một myItemModel (tất cả các mô hình phần tử khác.
Tôi sử dụng "do.call" rất nhiều để tạo các lệnh gọi hàm. Ví dụ: myfun <- "rnorm"; myargs <- list(n=10, Mean=5); do.call(myfun, myargs);
Hãy tưởng tượng biến thể sau của inputStream: trait FutureInputStream { //đọc byte không đồng bộ Mảng trống có nghĩa là E.
Đây là mã C của tôi: #include void sum(); int newAlphabet; int main(void) { sum();
Tôi chỉ muốn chọn mọi phần tử sau lớp ".last". HTML: 1 2 Jquery
Tôi đang xây dựng một trình giải tuần tự XML cho một dự án và tôi thường gặp phải tình huống loại mã này: var myVariable = ParseNDecimal(xml.Element("myElement")) == n
Đây là câu hỏi tiếp theo từ Chọn mức lương cao nhất Giả sử có một bảng 'có thể trả lương' tên giờ thấp giờ cao mức lương pri
Tôi đang tạo một chương trình tàu chiến cho chương trình của mình; chương trình đang hoạt động tốt, nhưng tôi đang cố gắng đảm bảo rằng khi người dùng đặt tọa độ ngoài phạm vi, chương trình cho biết họ đã nhập tọa độ không chính xác. Đây là mã: #include #include void
Tôi có một hàm trả về giá trị DWORD khác nhau cho từng trường hợp nếu xảy ra lỗi. Vì vậy, tôi có các định nghĩa sau: #define ERR_NO_DB_CONNECTION 0x90000 #define ERR_DB_N
Tạo ra các sự kiện của lớp cơ sở trong lớp dẫn xuất Ví dụ đơn giản sau đây minh họa cách khai báo các sự kiện tiêu chuẩn trong lớp cơ sở có thể được tạo ra từ một lớp dẫn xuất. Mẫu này được sử dụng rộng rãi cho các lớp Windows Forms trong thư viện lớp .NET Framework. Khi tạo một lớp có thể được sử dụng làm lớp cơ sở cho các lớp khác, bạn nên
Tôi chỉ tự hỏi liệu điều này có khả thi hay không: sử dụng Modern::Perl; my @list = ('a' .. 'j'); map { func($_) } each(@list);
Tôi đã sử dụng =IF(L2="","Active",IF(K2I2,"Late"))) hoạt động nhưng bây giờ tôi cần kiểm tra nhiều cột có điều kiện trên FI. Tôi đã thử hàm OR =IF(OR (F2 ="Đã lên lịch"
Tôi có 2 lệnh như hình dưới đây. Thêm hình ảnh giới thiệu vào video ffmpeg -y -loop 1 -framerate 10 -t 3 -i intro.png -i video.mp4 -filter_com
Được rồi, tôi có công thức tạo tên người dùng dựa trên danh sách họ và tên. Bây giờ, trong khi điều này hoạt động, tôi muốn ô tham chiếu đến hàm VBA của riêng tôi. Tuy nhiên, vì mã ít hơn nhiều nên tôi vẫn muốn sử dụng công thức gốc. Tôi có công thức này: =SUBSTITUTE
Tôi có hai phiên bản HAProxy. Cả hai phiên bản đều đã bật số liệu thống kê và đang hoạt động tốt. Tôi đang cố gắng hợp nhất số liệu thống kê của hai phiên bản thành một để tôi có thể sử dụng một HAProxy duy nhất để xem số liệu thống kê về giao diện người dùng/phụ trợ. Tôi đang cố gắng làm hai hapro
Tôi có một Observable trong đó mỗi giá trị mới sẽ gây ra yêu cầu HTTP. Về phía khách hàng, tôi chỉ quan tâm đến giá trị phản hồi mới nhất, tuy nhiên, tôi muốn mọi yêu cầu đều được hoàn thành để theo dõi/v.v. Mục đích. Những gì tôi hiện có là: chức năng
Tôi có plugin TinyMCE trên trang web của mình. Khi thêm hình ảnh vào vùng văn bản của plugin TinyMCE, tôi muốn hình ảnh bao gồm cả việc tải chậm. Hình thu nhỏ của trang web của tôi có một kiểu tải chậm cụ thể trong đó hình ảnh src có nền màu xám. Theo người dùng
Tôi muốn hợp nhất các khoảng thời gian bôi trơn để nếu chúng trùng nhau, tôi nhận được mức tối thiểu từ lần đầu tiên bên trong và mức tối đa từ lần cuối cùng bên trong và tổng hợp để tạo một khoảng thời gian mới kéo dài toàn bộ khoảng thời gian. Đây là một reprex: thư viện(lubridate, w
Tôi có một ứng dụng về cơ bản là tiêu đề, nội dung chính và chân trang luôn hiển thị. Phần chân trang có thể được thay đổi kích thước và tôi muốn đặt một số công cụ trên bảng nội dung chính phía trên phần chân trang. Bố cục chính được thực hiện bằng cách sử dụng flex. Sự hiểu biết của tôi khi đọc tài liệu là việc định vị tuyệt đối được thực hiện tương ứng với vị trí gần nhất.
Tôi là một lập trình viên xuất sắc, rất giỏi!