簡體   English   中英

從另一個JPanel內部重新繪制一個JPanel

[英]Repaint a JPanel from within another JPanel

因此,我正在制作一個繪畫程序,我有一個主要的Paint類(用於檢測鼠標輸入和繪畫),以及一個Tools類(其為左側的工具欄),其中包含許多工具,例如筆刷大小更改和形狀更改。 因此,我想向Tools類添加一個清除按鈕,以清除整個屏幕。 我的問題是Paint類持有要Paint的點的ArrayList,而我無法從Tools內重新繪制Paint

Paint

//imports    
public class Paint extends JPanel{
    private ArrayList<Brush> points;
    ...

    public Paint() {
        ...
    }

    public void paintComponent(Graphics page) {
        ...

        //draws all points in the arraylist
        for (Brush b : points) {
            //paint points
        }
    }
}

Tools

//imports
public class Tools extends JPanel
{
    private JButton clear;

    public Tools() {
        clear = new JButton("Clear");
        clear.addActionListener(new BrushInput());
    }

    public void paintComponent(Graphics page) {
        ...
    }
    private class BrushInput implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == clear) {
                //clear points arraylist and repaint
            }
        }
    }

}

我遇到的問題是repaint()是實例方法,因此我無法從Tools內訪問Paint的repaint。

只需將對Paint實例的引用傳遞給Tools的構造函數。 或者,在包含兩者的容器( JFrame等)上調用重繪,這將導致其所有子級都被重繪。

例如:

public class Paint extends JPanel {
    private ArrayList<Brush> points;

    // . . .

    public void clear() {
        points.clear();
        repaint();
    }
}

public class Tools extends JPanel {
    private JButton clear;
    private Paint paint;

    public Tools(Paint paint) {
        this.paint = paint;
        // . . .
    }

    // . . .

    private class BrushInput implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == clear) {
                paint.clear();
            }
        }
    }
}

創建這些組件的代碼:

Paint paint = new Paint();
Tools tools = new Tools(paint);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM