1

3 つのボタン、2 つのラベル、2 つのテキスト フィールド、1 つのテキスト領域を含む非常に単純な GUI を作成しています。奇妙なことに、結果は不安定です。クラスを実行すると、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("SOF\n");
        }
    });

    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 = "";
    }
}
4

1 に答える 1

6

このコードにはいくつかの問題があります。

  • すでに JFrame から継承しているため、さらに別の JFrame を作成する必要はありません。
  • フレームを表示しsetVisible(true)、その後コンポーネントを追加しています。これによりレイアウトが無効になります。後で再検証する必要があります (またはsetVisible()、既にコンポーネントを追加した場所に移動します)。
  • コンポーネントを JFrame に直接追加していますが、その contentpane を使用する必要があります。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);
}
于 2012-12-26T16:47:35.877 に答える