Chịu với tôi ... Tôi không nghĩ rằng điều này quá chủ quan nhưng có thể tôi đã sai.Đây có phải là Java không chính thức không?
Gần đây tôi muốn đưa ra một số mã lặp đi lặp lại đã vẽ nền Bitmap tùy chỉnh trên ứng dụng BlackBerry của chúng tôi.
(Câu hỏi này là không thực sự về BlackBerry mặc dù, vì vậy tôi sẽ cung cấp một số chi tiết ở đây về BB GUI để mọi người phi BB Java có thể cân nhắc trong ...)
Các FullScreen lớp là từ BB API - nó có một phương thức vẽ (Graphics) mà khung gọi để vẽ màn hình và bất kỳ thành phần nào được thêm vào nó. Có thể ghi đè lên để làm bức tranh tùy chỉnh - như vẽ nền Bitmap trước khi bất kỳ bức tranh nào khác xảy ra (BB API mới hơn cung cấp lớp nền nhưng ứng dụng của chúng tôi phải hoạt động trên điện thoại cũ).
Tôi muốn có một loạt các màn hình tất cả cùng một nền, mỗi đã làm một số loại sơn tùy chỉnh ... đây là những gì tôi đã đưa ra:
abstract public class BGFullScreen extends FullScreen {
Bitmap bg;
public BGFullScreen(Manager mgr, long style) {
super(mgr, style);
bg = Bitmap.getBitmapResource("bg.jpg");
}
abstract protected void innerPaint(Graphics g);
protected void paint(Graphics g) {
g.drawBitmap(new XYRect(0, 0, bg.getWidth(), bg.getHeight()), bg, 0, 0);
innerPaint(g);
super.paint(g);
}
}
Mỗi màn hình sau đó sẽ phân lớp trừu tượng này lớp và thực hiện innerPaint(). Bằng cách này khi khung công tác BB gọi phương thức paint(), mỗi màn hình có thể có các công cụ vẽ tùy chỉnh xảy ra SAU nền được vẽ (vì vậy bất kỳ bức tranh nào xảy ra trên nền) nhưng TRƯỚC các thành phần của màn hình được vẽ, khi FullScreen. paint() được gọi.
(Tôi đã đưa ra với điều này bởi vì tôi đã nghiên cứu Common Lisp ở nhà, và nó xảy ra với tôi rằng những gì tôi muốn làm là một cái gì đó giống như sự kết hợp giữa phương pháp xen kẽ trong Clos)
Dưới đây là một việc thực hiện mẫu của lớp trừu tượng trên:
public class MainAppScreen extends BGFullScreen {
public MainAppScreen() {
super(new VerticalFieldManager(), 0);
// add some components to the screen:
add(new ButtonField(...));
add(...)
}
protected void innerPaint(Graphics g) {
// stuff drawn will be on top of background and under buttons
g.draw(...)
}
}
về cơ bản tôi muốn có một lớp trẻ để thực hiện một phương pháp được gọi ở giữa thực hiện mẹ của nó và thực hiện nó ông bà của cùng một phương pháp. Tôi không thể tìm ra cách nào khác để làm điều này trong Java ...
Đây có phải là Java không chính thức không? Điều này thực sự thực sự phổ biến và đó là một câu hỏi ngớ ngẩn? Đây thực sự là thiết kế khủng khiếp? (Các chuyên gia BB, làm thế nào tôi có thể làm điều này theo bất kỳ cách nào khác?)
Đã chỉnh sửa để thêm: Thao tác này được mô tả - bản vẽ sẽ diễn ra theo thứ tự tôi muốn.
có thể (không biết gì về BB api), bạn có thể gọi 'super.paint', trước đó, sơn bên trong – OscarRyz
Nếu tôi thay đổi lớp trừu tượng để gọi super.paint trước innerPaint thì những thứ trong innerPaint được vẽ trên đầu Các nút bấm, vv – spacemanaki
Chỉ cần thêm một phần nhỏ vào câu trả lời chính xác rằng điều này là tốt và được gọi là Phương thức mẫu: bạn có thể muốn vẽ() cuối cùng, vì vậy các máy khách (các lớp con cụ thể) không thể vô tình gây rối và phá vỡ nó dựng hình. –