Java 点击JButton(气泡排序)清除JTextField。为什么?

Java 点击JButton(气泡排序)清除JTextField。为什么?,java,swing,jbutton,jtextfield,Java,Swing,Jbutton,Jtextfield,上面的代码是关于Swing的。 我设计的实际代码是:-(在框架中) 选择平均案例(单选按钮) 在文本字段中输入任意数字(输入) 点击生成 单击任意排序按钮(气泡排序和选择排序) 现在,问题是,如果单击BubbleSort,文本字段将被清除。但它不应该像我设计的那样发生。有谁能给我建议解决方案,这样在输入任何内容后,文本字段就不会变得清晰了 这里有几行: public class Sort_BenchMark extends JFrame { private JPanel contentP

上面的代码是关于Swing的。 我设计的实际代码是:-(在框架中)

  • 选择平均案例(单选按钮)
  • 在文本字段中输入任意数字(输入)
  • 点击生成
  • 单击任意排序按钮(气泡排序和选择排序)
  • 现在,问题是,如果单击BubbleSort,文本字段将被清除。但它不应该像我设计的那样发生。有谁能给我建议解决方案,这样在输入任何内容后,文本字段就不会变得清晰了

    这里有几行:

    public class Sort_BenchMark extends JFrame {
    
       private JPanel contentPane;
       private JTextField textField;
       private JButton btnBubbleSort;
       private JLabel label_1;
       private JButton btnGenerate;
       private JButton btnSelectionSort;
       private JLabel lblSs;
       private JLabel lblStatus;
    
       /**
        * Launch the application.
        */
       public static void main(String[] args) 
       {
         EventQueue.invokeLater(new Runnable() 
         {
            public void run() 
            {
                try 
                  {
                    Sort_BenchMark frame = new Sort_BenchMark();
                    frame.setVisible(true);
                  }
                  catch (Exception e) 
                  {
                    e.printStackTrace();
                  }
               }
           });
       }
    
    /**
     * Create the frame.
     */
    public Sort_BenchMark() 
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
    
        textField = new JTextField("Enter ");
        textField.setForeground(Color.GRAY);
        textField.addFocusListener(new FocusListener() {
    
            @Override
            public void focusLost(FocusEvent e) {
                // TODO Auto-generated method stub
    
            }
    
            @Override
            public void focusGained(FocusEvent e) {
                textField.setText("");
                textField.setForeground(Color.BLACK);
            }
        });
        textField.setBounds(29, 30, 139, 20);
        contentPane.add(textField);
        textField.setColumns(10);
    
        label_1 = new JLabel("");
        label_1.setBounds(334, 20, 120, 30);
        contentPane.add(label_1);
    
        btnBubbleSort = new JButton("Bubble Sort");
    
        btnBubbleSort.setBounds(204, 20, 120, 30);
        contentPane.add(btnBubbleSort);
    
        btnSelectionSort = new JButton("Selection Sort");
        btnSelectionSort.setBounds(204, 70, 120, 30);
        contentPane.add(btnSelectionSort);
    
        lblSs = new JLabel("");
        lblSs.setBounds(334, 70, 120, 30);
        contentPane.add(lblSs);
    
        lblStatus = new JLabel("");
        lblStatus.setBounds(75, 87, 93, 23);
        contentPane.add(lblStatus);
    
        final JRadioButton rdbtnAvgCase = new JRadioButton("Avg Case");
        rdbtnAvgCase.setBounds(29, 150, 109, 23);
        contentPane.add(rdbtnAvgCase);
    
        ButtonGroup b = new ButtonGroup();
        b.add(rdbtnAvgCase);
    
        btnGenerate = new JButton("Generate");
        btnGenerate.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e) 
            {
                btnBubbleSort.setEnabled(true);
                btnSelectionSort.setEnabled(true);
                final String s = textField.getText();
                if(s.contentEquals(""))
                {
                    lblStatus.setText("Enter length");
                }
                else
                {
                    lblStatus.setText("Ready");
                    if(rdbtnAvgCase.isSelected())
                    {
                        btnBubbleSort.addActionListener(new ActionListener() 
                        {
                            public void actionPerformed(ActionEvent e) 
                            {
                                Thread t1 = new Thread(new Runnable() 
                                {
                                    @Override
                                    public void run() 
                                    {
                                        btnBubbleSort.setEnabled(false);
                                        label_1.setText("done");
    
                                        btnBubbleSort.setEnabled(true);
                                    }
                                });
                                t1.start();
                            }
                        });
    
                        btnSelectionSort.addActionListener(new ActionListener() 
                        {
                            public void actionPerformed(ActionEvent e) 
                            {
                                Thread t3 = new Thread(new Runnable() 
                                {
                                    @Override
                                    public void run() 
                                    {
                                        btnSelectionSort.setEnabled(false);
                                        lblSs.setText("done");
                                        btnSelectionSort.setEnabled(true);
                                    }
                                });
                                t3.start();
                            }
                        });
                    }
                }
            }
        });
        btnGenerate.setBounds(64, 62, 88, 25);
        contentPane.add(btnGenerate);       
      }
    }
    

    在focus listener代码中,当您单击textfield时,将其文本设置为空字符串。

    首先,执行了可怕的嵌套操作

    撇开这一点不谈,文森特·拉姆达尼(Vincent Ramdhanie)对于问题的根源是正确的。之所以只有在单击某个按钮时才会发生这种情况,是因为当您禁用某个按钮时,该按钮就不能有焦点,这会迫使焦点集中在其他内容上,在禁用btnBubbleSort的情况下,这似乎是您的文本字段

    请尝试使用setVisible(false)和setVisible(true),而不是BtnSelectSort.setEnabled(false)和BtnSelectSort.setEnabled(true)


    如果这不起作用,请删除onfocus部分,改为使用鼠标单击事件进行操作。

    但是如果我单独单击selectionSort按钮,文本字段将不会清除如果删除“btnbbleSort.setEnabled(false);”,文本字段也不会清除,因为GUI可能必须在不同的平台上使用不同的PLAF,在不同的屏幕大小和分辨率上使用不同的字体大小默认设置。因此,它们不利于组件的精确放置。改用布局管理器,或者空白。你能修改代码并给我解决方案吗???你能付钱给我吗?顺便说一句,如果一个人不能拼出“you”这个词的所有3个字母,或者用“?”表示一个问题,那么他不可能从我这里得到帮助。哦,对不起,实际上我在担心代码。你能修改代码并给我解决方案吗?请
      @Override
        public void focusGained(FocusEvent e) {
            textField.setText(""); //HERE
            textField.setForeground(Color.BLACK);
        }