java - JTextField 无法正确显示

java - JTextField wont show properly

我正在做一个小型 java 项目,最终目标是一个程序,告诉您指定月份有多少天。我的问题是我的文本字段中只有一个出现在 GUI 中!我不知道为什么会这样,并且一直在寻找解决方案大约 2 个小时。请帮忙! p.s。我是一名新手程序员,至少在 java 所以这可能是一个显而易见的答案!

我的代码:

package main;

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

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

@SuppressWarnings({ "unused", "serial" })
public class Test extends JFrame {
  JTextField text;
  JTextField text2 = new JTextField("Enter Year", 40);
  JPanel panel = new JPanel();
  JLabel label1;
  String Input1;
  String Input2;
  int month;
  int year;
  int numDays = 0;

  public Test() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    text  = new JTextField("Enter month's #", 40);
    text2.addActionListener(new MyActionListener());
    panel.setPreferredSize(new Dimension(400,800));
    getContentPane().add(panel);
    getContentPane().add(text, "Center");
    getContentPane().add(text2, "Center");
    pack();
    }

    public static void main(String[] args) {
    new Test().setVisible(true);
  }
    class MyActionListener implements ActionListener {
        public void actionPerformed(ActionEvent evt) {
     Input1 = text.getText();
     Input2 = text2.getText();
     month = Integer.parseInt(Input1);
     year = Integer.parseInt(Input2);
     math(month, year);
  }
 }
  public void math(int month, int year){
      switch (month) {
      case 1: case 3: case 5:
      case 7: case 8: case 10:
      case 12:
          numDays = 31;
          break;
      case 4: case 6:
      case 9: case 11:
          numDays = 30;
          break;
      case 2:
          if (((year % 4 == 0) && 
               !(year % 100 == 0))
               || (year % 400 == 0))
              numDays = 29;
          else
              numDays = 28;
          break;
      default:
          label1 = new JLabel("Invalid input...");
          getContentPane().add(label1, JLabel.BOTTOM);
          break;
  }
  label1 = new JLabel(Integer.toString(numDays));
  getContentPane().add(label1, JLabel.BOTTOM);
  }
}

我确定这可能是我只是简单地看了看,我希望他们是一个简单的解决方案!提前致谢!

两个文本字段都位于中间位置。也许您想将它们添加到面板中。改变这个:

getContentPane().add(panel);
panel.setLayout(new BorderLayout());
panel.add(text, BorderLayout.CENTER);
panel.add(text2, BorderLayout.SOUTH);

先看看 Laying Out Components Within a Container and How to Use BorderLayout

JFrame 默认使用 BorderLayout,它只管理 5 个可用位置中的每一个的单个组件,在这种情况下,只管理您添加的最后一个组件

根据您想要实现的目标来确定您可能使用的布局管理器。

例如,您可以使用 GridBagLayout

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        JTextField text;
        JTextField text2 = new JTextField("Enter Year", 40);
        JLabel label1;
        String Input1;
        String Input2;
        int month;
        int year;
        int numDays = 0;

        public TestPane() {
            setLayout(new GridBagLayout());
            text = new JTextField("Enter month's #", 40);
            text2.addActionListener(new MyActionListener());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            add(text, gbc);
            add(text2, gbc);
        }

        class MyActionListener implements ActionListener {

            public void actionPerformed(ActionEvent evt) {
                Input1 = text.getText();
                Input2 = text2.getText();
                month = Integer.parseInt(Input1);
                year = Integer.parseInt(Input2);
                math(month, year);
            }
        }

        public void math(int month, int year) {
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            switch (month) {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    numDays = 31;
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    numDays = 30;
                    break;
                case 2:
                    if (((year % 4 == 0)
                                    && !(year % 100 == 0))
                                    || (year % 400 == 0)) {
                        numDays = 29;
                    } else {
                        numDays = 28;
                    }
                    break;
                default:
                    label1 = new JLabel("Invalid input...");
                    add(label1, gbc);
                    break;
            }
            label1 = new JLabel(Integer.toString(numDays));
            add(label1, gbc);
        }

    }
}

有关详细信息,请参阅 How to Use GridBagLayout

不过,通常情况下,您会使用多个布局管理器,将您的 UI 隔离为可工作的单元,重点关注每个部分在其自己的容器中的个别需求,然后通过使用其他布局管理器将它们组合起来布局管理器