1

我正在尝试用 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) {


    }
}
4

3 回答 3

3

欢迎来到可变字体、分辨率和 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 中最强大和最复杂的布局管理器之一,所以如果一开始看起来很混乱,请不要担心;)

于 2012-10-03T20:13:22.293 回答
1

在方法内部编写转换代码actionPerformed

  • 从第一JTextField英里获取输入
  • 将其解析为 int 或 float(作为JTextFieldsgetText()方法返回String
  • 进行转换
  • 将转换后的值设置为其他JTextField航海使用nautical.setText();方法
于 2012-10-03T16:52:53.277 回答
0

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

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 + "");
        }
    }
}
于 2012-10-03T17:05:14.200 回答