Tôi có một lớp đơn giản vẽ một đường khi chuột kéo hoặc một dấu chấm khi chuột nhấn (nhả).Nội dung của cửa sổ biến mất khi thu nhỏ
Khi tôi thu nhỏ ứng dụng và sau đó khôi phục ứng dụng, nội dung của cửa sổ biến mất trừ dấu chấm cuối (pixel). Tôi hiểu rằng phương pháp super.paint(g)
vẽ lại nền sau mỗi lần cửa sổ thay đổi, nhưng kết quả dường như giống nhau dù tôi có sử dụng hay không. Sự khác biệt giữa hai người trong số họ là khi tôi không sử dụng nó có nhiều hơn một điểm ảnh được vẽ trên cửa sổ, nhưng không phải tất cả bức tranh của tôi. Làm thế nào tôi có thể sửa lỗi này?
Đây là lớp học.
package painting;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;
class CustomCanvas extends Canvas{
Point oldLocation= new Point(10, 10);
Point location= new Point(10, 10);
Dimension dimension = new Dimension(2, 2);
CustomCanvas(Dimension dimension){
this.dimension = dimension;
this.init();
addListeners();
}
private void init(){
oldLocation= new Point(0, 0);
location= new Point(0, 0);
}
public void paintLine(){
if ((location.x!=oldLocation.x) || (location.y!=oldLocation.y)) {
repaint(location.x,location.y,1,1);
}
}
private void addListeners(){
addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent me){
oldLocation = location;
location = new Point(me.getX(), me.getY());
paintLine();
}
@Override
public void mouseReleased(MouseEvent me){
oldLocation = location;
location = new Point(me.getX(), me.getY());
paintLine();
}
});
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent me){
oldLocation = location;
location = new Point(me.getX(), me.getY());
paintLine();
}
});
}
@Override
public void paint(Graphics g){
super.paint(g);
g.setColor(Color.red);
g.drawLine(location.x, location.y, oldLocation.x, oldLocation.y);
}
@Override
public Dimension getMinimumSize() {
return dimension;
}
@Override
public Dimension getPreferredSize() {
return dimension;
}
}
class CustomFrame extends JPanel {
JPanel displayPanel = new JPanel(new BorderLayout());
CustomCanvas canvas = new CustomCanvas(new Dimension(200, 200));
public CustomFrame(String titlu) {
canvas.setBackground(Color.white);
displayPanel.add(canvas, BorderLayout.CENTER);
this.add(displayPanel);
}
}
public class CustomCanvasFrame {
public static void main(String args[]) {
CustomFrame panel = new CustomFrame("Test Paint");
JFrame f = new JFrame();
f.add(panel);
f.pack();
SwingConsole.run(f, 700, 700);
}
}
Không kết hợp các thành phần Swing & AWT với nhau! Nếu nó không gây ra vấn đề ngay bây giờ, nó sẽ khi bạn thêm các menu, các mẹo công cụ, combo hoặc các phần tử nổi khác. Có bao nhiêu yếu tố được vẽ sẽ là điển hình cho trường hợp sử dụng này? Họ sẽ bị loại bỏ? Nếu câu trả lời cho câu hỏi thứ nhất là 'nghìn' và câu trả lời thứ hai là 'không', một 'BufferedImage' duy nhất (được hiển thị trong một nhãn) có thể là một lựa chọn tốt hơn. Một người nghe chuột có thể được thêm vào nhãn. –
Re Swing/AWT. Cụ thể đó là 'Canvas' mà tôi đang đề cập đến. Đối với một Swing tương đương, mở rộng hoặc một 'JComponent' hoặc' JPanel' sau đó ghi đè 'paintComponent()' thay vì 'paint()'. BTW - hiển thị hình ảnh có nghĩa là không phải mở rộng * bất kỳ thứ gì *, và trong khi 'java.awt.Label' không hỗ trợ hình ảnh, thì' javax.swing.JLabel' sẽ không. ;) –
Có, tôi đã xem qua ví dụ được tìm thấy [ở đây] (http://stackoverflow.com/questions/6132988/painting-in-a-bufferedimage-inside-swing-java) và tôi đang lập kế hoạch sử dụng một hình ảnh đệm vì tôi cũng cần phải lưu hình ảnh của tôi, nhưng cho thời điểm này tôi đang cố gắng để hiểu làm thế nào sơn và cập nhật công việc. Ví dụ, trong mã của tôi (mà tôi sẽ đăng ngay sau khi tôi tìm ra cách thức và vị trí), tôi không hiểu tại sao gọi phương thức vẽ trong bản cập nhật không giống như viết mã chính xác (từ phương pháp vẽ) trong phương thức cập nhật. –