Java 在小程序中绘制多行时,它只显示最后一行

Java 在小程序中绘制多行时,它只显示最后一行,java,swing,canvas,applet,Java,Swing,Canvas,Applet,我正在尝试使用JavaApplet和canvas绘制多条线。我已经定义了类画布: public class Canvas extends JPanel { private static final int RIGHT=0, LEFT=1, UP=2, DOWN=3; public static final int WIDTH=600, HEIGHT=500; private int direction = 0 ;

我正在尝试使用JavaApplet和canvas绘制多条线。我已经定义了类画布:

 public class Canvas extends JPanel {

    private static final int RIGHT=0, LEFT=1, UP=2, DOWN=3;
    public static final int WIDTH=600, HEIGHT=500;
    private int direction = 0 ;                          
    private int pixels;                             

    /**
     *  Canvas() constructor sets its size
     */
    public Canvas() {
        setSize(WIDTH, HEIGHT);
    }

    public void setPatt(int pat, int lev) {
        direction = pat;
        pixels = lev;
    }

    public void paintComponent(Graphics g) {
        g.setColor(getForeground());
        switch (direction) {
        case LEFT:  
            drawLineLeft(g, pixels); 
            break;
        case RIGHT:
            drawLineRight(g, pixels);
            break;
        case UP:
            drawLineUp(g, pixels);
            break;
        case DOWN:
            drawLineDown(g, pixels);
            break;
        } 
    } 

    private void drawLineLeft(Graphics g, int pix){

        if(pix > 0){
            Dimension d = getSize();
            int x = d.width/2;
            int y = d.height/2;
           g.drawLine(x, y, x-10*pix, y);//left
        }
    }

    private void drawLineUp(Graphics g, int pix){
        if(pix > 0){
            Dimension d = getSize();
            int x = d.width/2;
            int y = d.height/2;
            g.drawLine(x, y, x, y-10*pix);//up
        }
    }

    private void drawLineRight(Graphics g, int pix){
        //Graphics2D g2 = (Graphics2D) g;
        if(pix > 0){
            Dimension d = getSize();
            int x = d.width/2;
            int y = d.height/2;

            g.drawLine(x, y, x+10*pix, y);//right
        }
    }

    private void drawLineDown(Graphics g, int pix){
        if(pix > 0){
            Dimension d = getSize();
            int x = d.width/2;
            int y = d.height/2;
            g.drawLine(x, y, x, y+10*pix);// down
        }
    }
} 
我还有另一个类,我在其中定义了下拉列表、文本字段和按钮。我可以从下拉列表中选择绘制线条的方向(右、左、上、下方向),并且可以通过在文本字段(像素)中键入数字来定义线条的长度。按下按钮时,将调用方法
setPatt
,并在画布中显示行:

public class TurtleApplet extends JApplet implements ActionListener
{
    .....
    .....
    .....

    public void actionPerformed( ActionEvent e) 
    {
       if(e.getSource() == drawButton){
            int y = Integer.parseInt(pixels.getText());
            canvas.setPatt(direction.getSelectedIndex(), Integer.parseInt(pixels.getText()));

        }
       //repaint();
    }  
    .....
}
问题是,当我按下按钮时,只有在调整小程序窗口的大小时,才会在画布中显示新行。我尝试添加
repaint()
方法,这很有帮助,但仍然存在另一个问题-如何在不丢失前一条线的情况下绘制新的线


只有最后一条线在屏幕上可见,例如,当我从中心向左画一条线(线总是从画布的中心开始),然后我想从中心向右画一条新线,第一条线消失,我只能看到第二条线,依此类推。

你应该跟踪已经画好的线。
paintComponent
方法应该打印(或重新打印)整个组件。据我所知,你总是只打印一行,因此你失去了以前的状态

尝试创建一个
Map
,在其中存储线数据,并在
paintComponent
方法中迭代绘制所有线

方法
setPatt
可以称为
addPatt


注:如果顺序很重要,请尝试
LinkedHashMap

在您进行任何自定义绘制之前,您应该先调用``真正的问题是,当您只指定一个可能的方向时,为什么它要绘制多条线?有4个方向,即画布中心线的起点,您应该做什么,是用指令(direction,lev)维护某种类型的列表,每次调用paintComponent时,您都应该在该列表上迭代绘制每一行。请记住,绘制是破坏性的,当调用paintComponent时,您需要重新绘制组件的当前状态。您应该查看并更好地了解绘制的工作方式如果有多条相同方向的线,会发生什么?IHMO一个POJO和一个
列表
会更好,我同意MadProgrammer的观点,但是POJO听起来像是对这种发明了很多次的对象的过度杀伤力。。dreamPr尝试列表,将您的观点保留在其中。