3

インターネットでも同様の問題が見つかりましたが、提供された解決策は機能しませんでした。

JPanelをクリアしたいです。これを行うには、描画メソッド()を呼び出さないように、フラグをfalseに設定してrepaint()(メソッドから)呼び出します。描かれた線はまだパネル上にあります。clear()drawLines()

同じ線を背景色で塗り直してみました。これもうまくいきませんでした。

  public class WektPanel extends JPanel{    

    boolean check = false;
    Color c = Color.BLUE;
    boolean oval = false;

    public WektPanel() {
        setBackground(c);
        setVisible(true);

    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        if(check)
            drawLines(3, g);

    }

    void clear(){
        check=false;
        repaint();
    }
    void draw(){
        check=true;
        repaint();
    }

    void drawLines(int stroke, Graphics g){

        g.drawLine(0,0,getWidth(),getHeight());
        g.drawLine(0,getHeight(),getWidth(),0);
        for(int i=1; i<stroke;i++){
                g.drawLine(0+i,0,getWidth(),getHeight()-i);
                g.drawLine(0,0+i,getWidth()-i,getHeight());
                g.drawLine(0,getHeight()-i,getWidth()-i,0);
                g.drawLine(0+i,getHeight(),getWidth(),0+i);
        }
    }

}
4

2 に答える 2

3

オーバーライドしていますpaint()が、呼び出していますsuper.paintComponent(g)。をオーバーライドする必要がありますpaintComponent(g)

check編集:私はあなたの論理に従うことができませんでした。これは私のために働いた。

public class Test {

    private class WektPanel extends JPanel {

        boolean clear;

        public WektPanel() {
            setBackground(Color.BLUE);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(300, 200);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            drawLines(3, g);
        }

        public void clear() {
            clear = true;
            repaint();
        }

        public void draw() {
            clear = false;
            repaint();
        }

        private void drawLines(int stroke, Graphics g) {
            if (!clear) {
                g.drawLine(0, 0, getWidth(), getHeight());
                g.drawLine(0, getHeight(), getWidth(), 0);
                for (int i = 1; i < stroke; i++) {
                    g.drawLine(0 + i, 0, getWidth(), getHeight() - i);
                    g.drawLine(0, 0 + i, getWidth() - i, getHeight());
                    g.drawLine(0, getHeight() - i, getWidth() - i, 0);
                    g.drawLine(0 + i, getHeight(), getWidth(), 0 + i);
                }
            }
        }
    }

    private void showGUI() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final WektPanel wektPanel = new WektPanel();
        f.add(wektPanel, BorderLayout.CENTER);
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(new JButton(new AbstractAction("Clear") {

            @Override
            public void actionPerformed(ActionEvent e) {
                wektPanel.clear();
            }
        }));
        buttonPanel.add(new JButton(new AbstractAction("Draw") {

            @Override
            public void actionPerformed(ActionEvent e) {
                wektPanel.draw();
            }
        }));
        f.add(buttonPanel, BorderLayout.SOUTH);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().showGUI();
            }
        });
    }
}
于 2012-10-24T11:45:43.783 に答える
3

メソッドの最初の行は次のpaintようになります。

g.clearRect(0, 0, getWidth(), getHeight());

このようにして、ペイントを再開するときに前のペイントがそこにないことを確認します。

于 2012-10-24T11:47:22.907 に答える