不稳定的Java GUI



我正在写一个非常简单的GUI,包含3个按钮,2个标签,2个文本字段和一个文本区域。奇怪的是,结果是不稳定的:当运行类时,GUI出现了随机数量的控件。我尝试了各种布局管理器,改变了控件之间的顺序——没有效果。

有人能帮忙吗?

package finaltestrunner;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FinalTestGUI extends JFrame implements ActionListener
{   
public Boolean startState = false;
    JButton sofButton;
    JButton startStopButton;
    JButton exitButton;
        JTextField loopCounts;        
        JTextField trSnField;        
        JTextArea resultField = null;
    public FinalTestGUI() 
    {
// The constructor creates the panel and places the controls
    super();    // Jframe constructor
    JFrame trFrame = new JFrame();
    trFrame.setSize(1000, 100);
    trFrame.setVisible(true);
    trFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    trFrame.setTitle("Test runner");
    setFont(new Font("SansSerif", Font.PLAIN, 14));
//  trFrame.setLayout(new FlowLayout());
    JPanel trControlPanel = new JPanel();
    trControlPanel.setSize(1000, 100);
    trControlPanel.setLayout(new GridLayout(1,7));
        exitButton = new JButton("Exit");
    trControlPanel.add(exitButton);
    startStopButton = new JButton("Run ");
    trControlPanel.add(startStopButton);
    JLabel loopsLabel = new JLabel ("Loops count: ");
    trControlPanel.add(loopsLabel);
        loopCounts = new JTextField (5);
    trControlPanel.add(loopCounts);
    sofButton = new JButton("SoF");
    trControlPanel.add(sofButton);
    JLabel testLabel = new JLabel ("serial Number: ");
    trControlPanel.add(testLabel);
        trSnField = new JTextField (5);
    trControlPanel.add(trSnField);
    JTextArea trResultField = new JTextArea (80, 10);
    trFrame.add(trControlPanel);
//  cpl.add(trResultField);
    startStopButton.addActionListener(new ActionListener()
    {
            @Override
        public void actionPerformed (ActionEvent trStartStopButton)
        {
            startState = !startState;
            if (startState)
            {
                startStopButton.setText("Run ");
                startStopButton.setForeground(Color.red);
            }
            else
            {
                startStopButton.setText("Stop");
                startStopButton.setForeground(Color.green);
            }
        }
    });
    sofButton.addActionListener(new ActionListener()
    {
            @Override
        public void actionPerformed (ActionEvent trSofButton)
        {
                        loopCounts.setText("SOFn");
        }
    });
    exitButton.addActionListener (new ActionListener()
    {
            @Override
        public void actionPerformed (ActionEvent trExitButton)
        {
                        System.exit(0);
        }
    });
    } // End of the constructor
    @Override
    public void actionPerformed (ActionEvent ae)  { }
    public void atpManager ()
    {
        String selectedAtp = "";
    }
}

这段代码有几个问题:

  • 你已经继承了JFrame,所以你不需要再创建一个JFrame
  • 你正在用setVisible(true)显示你的框架,然后向它添加组件。这将使您的布局无效,您需要在之后重新验证(或将setVisible()移动到您已经添加组件的位置)
  • 您直接将组件添加到JFrame中,但是您需要使用它的内容窗格。从Java 1.5开始,JFrame.add()方法自动转发到内容窗格。在较早的版本中,有必要使用JFrame.getContentPane()检索内容窗格,以便将子组件添加到内容窗格。

试试这个:

public FinalTestGUI()     {
  // The constructor creates the panel and places the controls
  super();    // Jframe constructor
  setSize(1000, 100);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setTitle("Test runner");
  setFont(new Font("SansSerif", Font.PLAIN, 14));
  setLayout(new FlowLayout());
  JPanel trControlPanel = new JPanel();
  trControlPanel.setSize(1000, 100);
  trControlPanel.setLayout(new GridLayout(1,7));
  exitButton = new JButton("Exit");
  trControlPanel.add(exitButton);
  startStopButton = new JButton("Run ");
  trControlPanel.add(startStopButton);
  JLabel loopsLabel = new JLabel ("Loops count: ");
  trControlPanel.add(loopsLabel);
  loopCounts = new JTextField (5);
  trControlPanel.add(loopCounts);
  sofButton = new JButton("SoF");
  trControlPanel.add(sofButton);
  JLabel testLabel = new JLabel ("serial Number: ");
  trControlPanel.add(testLabel);
  trSnField = new JTextField (5);
  trControlPanel.add(trSnField);
  JTextArea trResultField = new JTextArea (80, 10);
  // getContentPane().add(trControlPanel); // pre 1.5
  add(trControlPanel);                     // 1.5 and greater
  setVisible(true);
}

相关内容

  • 没有找到相关文章

最新更新