简体   繁体   English

JTextField 不会按预期将值从文本字段传递到对象字段

[英]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.我正在使用javax.swing包编写一个 2D 绘图应用程序。 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.想法是创建一个DrawingApplicationFrame (扩展Jframe类),其中实例化了几个JButttonJCheckBoxJTextFields以更改绘制的状态,此外还有一个DrawingPanel实例drawpanel嵌入在此DrawingApplicationFrame类中。 I use JTextField instances LineWidthText and DashLengthText to change the Width and Length attributes of instance drawpanel .我使用JTextField实例LineWidthTextDashLengthText来更改实例drawpanelWidthLength属性。 However, the textfields seems not accepting the values in them and change drawpanel.Width and drawpanel.Length values.但是,文本字段似乎不接受其中的值并更改drawpanel.Widthdrawpanel.Length值。 How can I fix the error to let the textfields pass value?如何修复错误以让文本字段传递值?

Here's the creation of listeners for textfields LineWidthText and DashLengthText :下面是为文本字段LineWidthTextDashLengthText创建侦听器:

    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:这是 DrawPanel 类的代码:

    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!另一种是简单地按“Enter”键! 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!仅当将值简单地输入到文本字段而不进行任何进一步操作时,它才起作用!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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