【问题标题】:Unable to get rid of drawn lines无法摆脱画线
【发布时间】:2012-10-14 10:51:20
【问题描述】:

我在互联网上发现了类似的问题,但提供的解决方案不起作用。

我想清除 JPanel。为此,我调用repaint()(来自clear() 方法)并将标志设置为false,以避免调用我的绘图方法(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);
        }
    }

}

【问题讨论】:

  • paint == super.paint(g)paintComponent == super.paintComponent(g)
  • 作为你的第一个问题,我给你+1,不过从下次开始,请提供一个可运行的程序,一个SSCCE

标签: java swing awt jpanel paint


【解决方案1】:

您正在覆盖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();
            }
        });
    }
}

【讨论】:

  • @user1771047 :我希望你在 EDT 事件调度线程上运行你的 Swing 代码。由于这必须起作用,因此在此之后没有任何问题。
  • @user1771047:使用@Override 确保您正在覆盖。
  • Still doesn't work after this modification 你的 JPanel 没有返回任何 PreferredSize,或者你设置这个值的方式和位置
  • 这假定面板是opaque
【解决方案2】:

paint 方法的第一行应该是这样的:

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

这样你可以确保当你再次开始绘画时以前的绘画不会在那里。

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 2013-06-20
    • 2015-10-03
    相关资源
    最近更新 更多