Java - 通过单个文本域

时间:2017-01-05 12:54:30

标签: java arrays swing

使用此代码,我想开发一个程序,使用户能够在单个文本字段中输入5个int值。这些值将存储在一个数组中,按下按钮后,将绘制一个条形图来表示输入的值。类BtnHandler处理按钮单击事件,类gegHandler处理文本字段输入事件。我无法在数组中收集用户输入。这是我的代码。

package voorbeeld0805;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Vb0805 extends JFrame {
    public static void main( String args[] ) {
        JFrame frame = new Vb0805();
        frame.setSize( 300, 300 );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setTitle( "Voorbeeld 0805" );
        frame.setContentPane( new Tekenpaneel() );
        frame.setVisible( true );
    }
}

class Tekenpaneel extends JPanel {
    private Staafdiagram staafdiagram;
    private JButton knopTeken;
    private JTextField gegevensVak;
    private JLabel lblNo;
    private int[] lengtes = new int [5]; 
    public Tekenpaneel() {
        setBackground( Color.ORANGE );

        knopTeken = new JButton("Teken");
        knopTeken.addActionListener(new BtnHandler());
        gegevensVak = new JTextField(5);
        gegevensVak.addActionListener(new gegHandler());
        lblNo = new JLabel("Enter Value");

        add(knopTeken);
        add (gegevensVak);
        add (lblNo);

    }

    public void paintComponent( Graphics g ) {
        super.paintComponent( g );              
        if (staafdiagram != null)
        {
           staafdiagram.teken( g, 50, 250 ); 
        }
        this.requestFocusInWindow();


    }

    class BtnHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {

            //To test using the first constructor. Works perfectly

            /*int [] lengtes = { 144, 98, 117, 130, 172, 173 };
            staafdiagram = new Staafdiagram( lengtes, 30 );*/

            repaint();
        }
    }     
    class gegHandler implements ActionListener {  
        public void actionPerformed(ActionEvent e) { 
          //Here user input should be collected, placed in an array and
          //saved in staafdiagram.setLengtes(); 
            for (int i = 0; i < lengtes.length; i++){
               lblNo.setText("Next Value Is " + i++);
               lengtes[i] = Integer.parseInt( gegevensVak.getText());
               gegevensVak.setText("");//clear textfield after entering a value       
           }  
        }
    }  
}

class Staafdiagram {
    private int[] lengtes;
    private int witruimte;//this generates the spaces between the bars

   //First contructor with 2 arguments array en space 
   public Staafdiagram( int[] lengtes, int witruimte ) {
        this.lengtes = lengtes;
        this.witruimte = witruimte;
    } 

   //Second constructor with only 1 argument space
    public Staafdiagram(int witruimte ) {
        this.witruimte = witruimte;
    } 

    //With this, i want the user input to be collected in an array
    public void setLengtes(int[] lengtes) {
        this.lengtes = lengtes;
    }

    //To calculate the bar with the highest value
    public int bepaalMax(){
        int maximum = lengtes [0];
        for (int i = 1; i < lengtes.length; i++){
            if (lengtes[i] > maximum)
            {
                maximum = lengtes[i];
            }          
        }
        return maximum;
    }

    //To calculate the bar with the lowest value
    public int bepaalMin(){
        int minimum = lengtes [0];
        for (int i = 1; i < lengtes.length; i++){         
            if (lengtes[i] < minimum)
            {
                minimum = lengtes[i];
            }          
        }
        return minimum;
    }

    public void teken( Graphics g, int x, int y ) {
        int startX = x;
        // Draw the bars
        for( int lengte : lengtes ) {
            if (lengte == bepaalMax())
            g.setColor(Color.red);
            else if (lengte == bepaalMin())
            g.setColor(Color.green);
            else
            g.setColor(Color.black);

            g.fillRect( x, y - 20 - lengte, 20, lengte );
            x += witruimte;

        }
        // Display the values under the bars
        x = startX;
        for( int lengte : lengtes ) {
            g.drawString( String.format( "%d", lengte ), x, y );
            x += witruimte;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

如果在ActionListener上添加JTextField,则在对此字段执行“操作”时会调用actionPerformed()方法:此处是按下的回车键。

如果您希望将按钮与您的操作相关联,则应该丰富您在JButton上定义的ActionListener以获取用户输入的值。这个想法是将两者都链接起来,因为两个操作都应该一个接一个地执行:

  

这些值将存储在一个数组中,按下按钮后,   将绘制一个条形图来表示输入的值。

 class BtnHandler implements ActionListener {

    public void actionPerformed(ActionEvent e) {
      // collection information from textfield       
        for (int i = 0; i < lengtes.length; i++){
           lblNo.setText("Next Value Is " + i++);
           lengtes[i] = Integer.parseInt( gegevensVak.getText());
           gegevensVak.setText("");//clear textfield after entering a value       
       }  
        // rendering           
        staafdiagram = new Staafdiagram( lengtes, 30 );*/
        repaint();
    }
}     

答案 1 :(得分:0)

  1. 从文本字段中获取文本
  2. 拆分为字符串数组
  3. 转换为int
  4. 按如下方式修改您的代码。

    class BtnHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
    
            //To test using the first constructor. Works perfectly
    
            /*int [] lengtes = { 144, 98, 117, 130, 172, 173 };
            staafdiagram = new Staafdiagram( lengtes, 30 );*/
    
            String textInt=gegevensVak .getText();      //gegevensVak is the name of the textfield you mentioned
            String[] strArray = textInt.split();
            //now convert the string to int and add to a new array
            repaint();
        }
    }