简体   繁体   中英

JTextField does not pass value from textfield to object field as intended in swing

I am writing a 2D drawing application using javax.swing package. The idea is to create a DrawingApplicationFrame (extends Jframe class), in which several JButtton , JCheckBox , JTextFields are instantiated to change the state of the paint, in addition to a DrawingPanel instance drawpanel embedded in this DrawingApplicationFrame class. I use JTextField instances LineWidthText and DashLengthText to change the Width and Length attributes of instance drawpanel . However, the textfields seems not accepting the values in them and change drawpanel.Width and drawpanel.Length values. How can I fix the error to let the textfields pass value?

Here's the creation of listeners for textfields LineWidthText and DashLengthText :

    JTextField LineWidthText=new JTextField(2);
    JTextField DashLengthText=new JTextField(2);
        LineWidthText.addActionListener(new ActionListener(){
          @Override
          public void actionPerformed(ActionEvent e)
          { 
            drawpanel.Width=Float.parseFloat(LineWidthText.getText());
            drawpanel.dashed=new BasicStroke(drawpanel.Width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{drawpanel.Length}, 10);
            drawpanel.concrete=new BasicStroke(drawpanel.Width);
          }
          });
        
        DashLengthText.addActionListener(new ActionListener(){
          @Override
          public void actionPerformed(ActionEvent e)
          {
            drawpanel.Length=Float.parseFloat(DashLengthText.getText());
            drawpanel.dashed=new BasicStroke(drawpanel.Width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{drawpanel.Length}, 10);     
          }
          });

Here's code for DrawPanel class:

    public class DrawPanel extends JPanel
    {
        Color ColorOne=Color.BLACK;
        Color ColorTwo=Color.BLACK;
        Boolean FilledOrNot=false, UseGradientOrNot=false, DashedOrNot=false, isDragged=false;
        float Width=10;
        float Length=10;
        String ShapeChoice="Line";
        ArrayList<MyShapes> ShapeObjects=new ArrayList<MyShapes>();
        
        Paint gradient=new GradientPaint(100, 100, ColorOne, 100+Width*2, 100+Width*2, ColorTwo, true);
        Paint mono=new GradientPaint(100, 100, ColorOne, 100+Width*2, 100+Width*2, ColorOne, true);
        Stroke dashed=new BasicStroke(Width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{Length}, 10);
        Stroke concrete=new BasicStroke(Width);

        Point start=new Point();
        Point stop=new Point();
        Point drag=new Point();
        
        JLabel label=new JLabel("(,)");
        
        public DrawPanel(String caption)
        {
          this.setBackground(Color.WHITE);
          this.setLayout(new BorderLayout());
          this.add(label, BorderLayout.SOUTH);
          this.label.setVisible(true);
        }

        @Override
        @SuppressWarnings("empty-statement")
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            //loop through and draw each shape in the shapes arraylist
            addMouseListener(new MouseHandler());
            for(int i=0; i<ShapeObjects.size(); i++){
                ShapeObjects.get(i).draw(g2d);
                }  
            }
        
        void removeLastElement(){
          ShapeObjects.remove(ShapeObjects.size()-1);
          repaint();
        }
        
        void clearAllElements(){
          ShapeObjects.clear();
          repaint();
        }
        
        public void addShape(MyShapes shape){
          ShapeObjects.add(shape);
        }

        public class MouseHandler extends MouseAdapter implements MouseMotionListener
        {

            
            public void mousePressed(MouseEvent event)
            {
                DrawPanel dp=(DrawPanel) event.getSource();
                dp.start=(new Point(event.getX(), event.getY()));
            }
   
            public void mouseReleased(MouseEvent event)
            {
                DrawPanel dp=(DrawPanel) event.getSource();
                dp.stop=(new Point(event.getX(), event.getY()));
                switch(ShapeChoice){
                  
                    case "Line":
                        if(UseGradientOrNot&&DashedOrNot)
                          dp.addShape(new MyLine(dp.start, dp.stop, dp.gradient, dp.dashed));
                        else if((UseGradientOrNot==false)&&DashedOrNot)
                          dp.addShape(new MyLine(dp.start, dp.stop, dp.mono, dp.dashed));
                        else if(UseGradientOrNot&&(DashedOrNot==false))
                          dp.addShape(new MyLine(dp.start, dp.stop, dp.gradient, dp.concrete));
                        else if((UseGradientOrNot==false)&&(DashedOrNot)==false)
                          dp.addShape(new MyLine(dp.start, dp.stop, dp.mono, dp.concrete));
                        break;
                        
                    case "Oval":
                        if(UseGradientOrNot&&DashedOrNot)
                          dp.addShape(new MyOval(dp.start, dp.stop, dp.gradient, dp.dashed, dp.FilledOrNot));
                        else if((UseGradientOrNot==false)&&DashedOrNot)
                          dp.addShape(new MyOval(dp.start, dp.stop, dp.mono, dp.dashed, dp.FilledOrNot));
                        else if(UseGradientOrNot&&(DashedOrNot==false))
                          dp.addShape(new MyOval(dp.start, dp.stop, dp.gradient, dp.concrete, dp.FilledOrNot));
                        else if((UseGradientOrNot==false)&&(DashedOrNot)==false)
                          dp.addShape(new MyOval(dp.start, dp.stop, dp.mono, dp.concrete, dp.FilledOrNot));
                        break;
                        
                    case "Rectangle":
                        if(UseGradientOrNot&&DashedOrNot)
                          dp.addShape(new MyRectangle(dp.start, dp.stop, dp.gradient, dp.dashed, dp.FilledOrNot));
                        else if((UseGradientOrNot==false)&&DashedOrNot)
                          dp.addShape(new MyRectangle(dp.start, dp.stop, dp.mono, dp.dashed, dp.FilledOrNot));
                        else if(UseGradientOrNot&&(DashedOrNot==false))
                          dp.addShape(new MyRectangle(dp.start, dp.stop, dp.gradient, dp.concrete, dp.FilledOrNot));
                        else if((UseGradientOrNot==false)&&(DashedOrNot)==false)
                          dp.addShape(new MyRectangle(dp.start, dp.stop, dp.mono, dp.concrete, dp.FilledOrNot));
                        break;
                  }
                        
                    repaint();
                }
        }

    }

It is solved by myself. There're two methods: one is to assign the value-retrieving task from the textfields on a button. The another is simply press "Enter" key! It turns out that the code works just fine. It does not work only when the value simply is typed into the textfields without any further actions!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM