1

我在 NetBeans 中使用 Java Swing 创建了一个 JFrame 表单。它包含一些文本字段、一些组合框和一个导航到下一个表单的按钮。一切正常,直到我关闭并重新打开 NetBeans。现在,当我运行表单时,只有文本字段变得无响应。组合框和按钮工作正常。我尝试在文本字段中使用 setEditable()、setFocusable() 和 requestFocusinWindow(),但输出没有改变。请帮我。

package Hora.GUI;

import java.awt.Color; 
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class InputJFrame3 extends javax.swing.JFrame
{
    public InputJFrame3()
    {
        initComponents();

        numberJTextField.addMouseListener(new MouseAdapter() 
                                          {
                                              public void mouseClicked(MouseEvent e)
                                              {
                                              numberJTextField.setForeground(Color.black);
                                              }
                                          });
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

    numberJLabel = new javax.swing.JLabel();
    numberJTextField = new javax.swing.JTextField();
    nextJButton = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setTitle("HORA");
    setFocusableWindowState(false);

    numberJLabel.setText("Number");

    nextJButton.setText("next >");
    nextJButton.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            nextJButtonActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(nextJButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(numberJLabel)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(numberJTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGap(0, 0, Short.MAX_VALUE)))
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(numberJLabel)
                .addComponent(numberJTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(nextJButton)
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>//GEN-END:initComponents

    private void nextJButtonActionPerformed(java.awt.event.ActionEvent evt)
    {
        //GEN-FIRST:event_nextJButtonActionPerformed
        number=Integer.parseInt(numberJTextField.getText());

        Boolean mistake=false;

        if(number<1 || number>249)
        {
            mistake=true;
            numberJTextField.setForeground(Color.red);
        }

        if(!mistake)
            setVisible(false);
    }//GEN-LAST:event_nextJButtonActionPerformed

    public int getNumber()
    {
        return number;
    }

    private int number;

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton nextJButton;
    private javax.swing.JLabel numberJLabel;
    private javax.swing.JTextField numberJTextField;
    // End of variables declaration//GEN-END:variables
}


package Hora.GUI;

public class Run
{
    public static void main(String[] args)
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run() 
            {
                InputJFrame3 frame = new InputJFrame3();
                frame.setVisible(true);
            }
        });
    }
}
4

1 回答 1

2

你的问题在这里:

setFocusableWindowState(false);

这样做可以防止 JTextField 获得焦点和可用。我建议你不要这样做。

另外,我同意 camickr 的观点,即您不应该使用 IDE 来创建您的sscce。只需将您的组件添加到默认使用 FlowLayout 的简单 JPanel 中,例如:

  nextJButton.setText("next >");
  nextJButton.addActionListener(new java.awt.event.ActionListener() {
     public void actionPerformed(java.awt.event.ActionEvent evt) {
        nextJButtonActionPerformed(evt);
     }
  });

  JPanel panel = new JPanel();
  panel.add(numberJLabel);
  panel.add(numberJTextField);
  panel.add(otherJTextField);
  panel.add(nextJButton);

  getContentPane().add(panel);

  pack();
}// </editor-fold>//GEN-END:initComponents

同样,您的程序看起来好像在交换通常被认为是弱设计的 JFrame。而是让您的代码创建 JPanel“视图”,并让您的 GUI 使用 CardLayout 交换视图。如果必须显示详细信息窗口,请使用 JDialog。


编辑 2
在您声明的评论中:

但那部分在生成的代码中。我在写字板中打开了 java 文件并对其进行了修改。现在可以了。有没有其他方法可以使用 IDE 来做到这一点?非常感谢 Hovercraft 先生和 Camickr 先生帮助我。我正在为我的爷爷做这个爱好项目,他想自动化他的占星术计算。

我认为公平地说,这个网站上的大多数主要 Swing 顾问(至少是我熟悉的那些)都是手工创建他们的 Swing 代码。不要误会我的意思,我们使用 IDE,但我们在创建 Swing 代码时不使用 IDE 的拖放工具。Swing 教程将帮助您学习如何做到这一点。特别是,请查看课程:在容器内布局组件部分。

请注意,即使您最终使用了诸如 NetBeans 的 Matisse 工具之类的 Swing 代码生成器,学习如何进行一些手工编码也不会对您造成伤害,因为所获得的知识将直接应用于您使用代码生成工具的工作中.

于 2013-07-14T18:07:29.183 回答