【问题标题】:JTextField input and outputJTextField 输入输出
【发布时间】:2012-10-03 16:45:56
【问题描述】:

我正在尝试用 Java 设计一个英里到海里的计算器。

我能够通过控制台正常创建和运行它,但是我在学习如何在 JFrames 中执行它时遇到了麻烦。

我基本上想做的是:

有两个文本字段和一个按钮,一个文本字段英里和一个海里,当您在一个字段中输入金额然后按下按钮,结果将显示在另一个字段中。

我在下面粘贴了我的代码

不知道下一步该做什么

package Mile_Conversion;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class OwnWindow implements ActionListener{



    public static void main(String[] args) {
        MyJFrame();

    }

    public static void MyJFrame() {

        //JLabel
        JLabel start = new JLabel("Enter the amount below to calculate");
        start.setBounds(/*x*/70, -65/*Y*/, 270, 150); // x, y, width, height    x across, y down
        JLabel milecon = new JLabel("Miles");
        milecon.setBounds(154, 55, 50, 150);
        JLabel nautcon = new JLabel("Nautical Miles");
        nautcon.setBounds(135, -15, 150, 150);

        //JTextField
        JTextField miles = new JTextField();
        miles.setBounds(100, 140, 150, 25);
        JTextField nautical = new JTextField();
        nautical.setBounds(100, 70, 150, 25);

        double mile, nautmile;

    /*
            mile = nautmile * 0.868;

            nautmile = mile * 1.150; 
    */

        //JButton
        JButton convert = new JButton("Convert");
        convert.setBounds(250, 200, 90, 25);


        //JFrame
        JFrame window = new JFrame("Milage Conversion");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(400, 300);
        window.setVisible(true);
        window.setLayout(null);
        window.setResizable(false);
        window.add(start);
        window.add(miles);
        window.add(nautical);
        window.add(convert);
        window.add(milecon);
        window.add(nautcon);

    }

    @Override
    public void actionPerformed(ActionEvent e) {


    }
}

【问题讨论】:

  • 1) 使用EDT 2) 不要使用null/Absolute 布局

标签: java swing jtextfield


【解决方案1】:

欢迎来到可变字体、分辨率和 DPI 的奇妙世界,它在您屏幕上的外观永远无法与其他任何人匹配(好吧,这有点夸张,但感觉就像 :P)

在这个世界上,布局管理器是您的朋友。它们将为您节省很多很多很多小时的挫败感和折磨。

我建议你通读一遍;

这是我对你正在尝试做的事情的看法......

public class TestConvertDistance {

    public static void main(String[] args) {
        new TestConvertDistance();
    }

    public TestConvertDistance() {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new DistancePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected class DistancePane extends JPanel {

        private JLabel lblInstruct;
        private JLabel lblMiles;
        private JLabel lblNauticalMiles;

        private JTextField fldMiles;
        private JTextField fldNauticalMiles;

        private JButton btnCalculate;

        public DistancePane() {

            lblInstruct = new JLabel("Enter the amount below to calculate");
            lblMiles = new JLabel("Miles");
            lblNauticalMiles = new JLabel("Nautical Miles");

            fldMiles = new JTextField(8);
            fldNauticalMiles = new JTextField(8);

            btnCalculate = new JButton("Convert");

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(2, 2, 2, 2);
            gbc.anchor = GridBagConstraints.WEST;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            add(lblInstruct, gbc);

            gbc.gridx = 0;
            gbc.gridy++;
            gbc.anchor = GridBagConstraints.WEST;
            gbc.gridwidth = 1;
            add(lblMiles, gbc);

            gbc.gridy++;
            add(lblNauticalMiles, gbc);

            gbc.gridx = 1;
            gbc.gridy = 1;
            add(fldMiles, gbc);

            gbc.gridy++;
            add(fldNauticalMiles, gbc);

            gbc.gridx = 0;
            gbc.gridy++;
            gbc.anchor = GridBagConstraints.CENTER;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            add(btnCalculate, gbc);

            btnCalculate.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // Do your calculation here...
                }
            });

        }

    }

}

注意,我使用了GridBagLayout,这是核心 API 中最强大和最复杂的布局管理器之一,所以如果一开始看起来很混乱,请不要担心;)

【讨论】:

  • 感谢您的帮助。您说的布局令人困惑是对的!我现在一直坚持使用 setBounds,直到我明白了它!
【解决方案2】:

actionPerformed 方法中编写转换代码:

  • 从第一个 JTextFieldmiles 获取输入
  • 解析为int或float(JTextFields getText()方法返回String
  • 进行转换
  • 使用nautical.setText(); 方法将转换后的值设置为另一个JTextField 航海

【讨论】:

    【解决方案3】:

    这是我的版本。它可能并不完美,也没有任何异常处理:

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingConstants;
    
    public class OwnWindow implements ActionListener
    {
    
        JLabel start;
        JLabel milecon;
        JLabel nautcon;
        JTextField miles;
        JTextField nautical;
        JButton convert;
        JFrame window;
    
        double mile, nautmile;
        public static void main(String[] args) 
        {
            OwnWindow obj = new OwnWindow();
    
        }
        public OwnWindow()
        {
            start = new JLabel("Enter the amount below to calculate");
            start.setBounds(/*x*/70, -65/*Y*/, 270, 150); // x, y, width, height    x across, y down
    
            milecon = new JLabel("Miles");
            milecon.setBounds(154, 55, 50, 150);
    
            nautcon = new JLabel("Nautical Miles");
            nautcon.setBounds(135, -15, 150, 150);
    
            miles = new JTextField();
            miles.setBounds(100, 140, 150, 25);
    
            nautical = new JTextField();
            nautical.setBounds(100, 70, 150, 25);
    
            convert = new JButton("Convert");
            convert.setBounds(250, 200, 90, 25);
            convert.addActionListener(this);
    
            window = new JFrame("Milage Conversion");
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.setSize(400, 300);
            window.setVisible(true);
            window.setLayout(null);
            window.setResizable(false);
            window.add(start);
            window.add(miles);
            window.add(nautical);
            window.add(convert);
            window.add(milecon);
            window.add(nautcon);
        }
    
    
        @Override
        public void actionPerformed(ActionEvent e) 
        {
            String strNaut = nautical.getText();
            String strMile = miles.getText();
    
            //this means the user wants to convert nautical to normal
            if(strNaut.length() > 0)
            {
                nautmile = Double.parseDouble(strNaut);
                miles.setText(nautmile*0.868 + "");
            }
            else if(strMile.length() > 0)
            {
                mile = Double.parseDouble(strMile);
                nautical.setText(mile*1.150 + "");
            }
        }
    }
    

    【讨论】:

    • 很公平,但是 OP 在代码中存在一些重大缺陷,例如在添加组件之前设置框架可见,当然您可以将其添加到重构中,从而进一步帮助 OP
    • 谢谢,这很容易理解,现在对我有用! 2个问题:1.@DavidKroukamp,在添加组件之前将框架设置为可见有什么缺点? 2. 如果我做了一个计算,然后想再做一次,我输入第一个文本框时如何清除第二个文本框?即 - 我在英里中输入计算并在海里字段中得到我的结果,当我点击返回英里字段时如何清除航海温和字段,反之亦然?
    猜你喜欢
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2021-06-02
    • 2014-09-08
    • 2013-10-01
    相关资源
    最近更新 更多