1

私は Java を学ぼうとしていて、GUI をプログラミングしたいと思っています。簡単な電卓から始めようとして、JTextField を試しているときに問題に遭遇しました。次のコードをコンパイルすると、空のフレームが生成される場合と、パネルとボタンが含まれるフレームが生成される場合があります。

これは、javac または eclipse のどちらを使用しても発生します。次のコードを使用します。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;



public class Mainframe extends JFrame {

private JButton button1;
private JPanel mainpanel;
private JLabel headline;
private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
JTextField number1;
JTextField number2;


public Mainframe(String s) {

    super(s);
    setSize(screenSize.width, screenSize.height);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    mainpanel = new JPanel(new BorderLayout(100, 100));
    number1 = new JTextField(20);
    number2 = new JTextField(20);
    headline = new JLabel("Simple Calculator");
    button1 = new JButton("1");

    mainpanel.add(headline, BorderLayout.NORTH);
    mainpanel.add(number1, BorderLayout.SOUTH);
    mainpanel.add(button1, BorderLayout.EAST);
    mainpanel.add(number2, BorderLayout.CENTER);
    mainpanel.validate();

    getContentPane().add(mainpanel);

}

public static void main(String[] args) {
    Mainframe mainframe1 = new Mainframe("Title");

}
}

繰り返したい: これは、javac と eclipse の違いに関するものではなく、両方のコンパイラで発生した問題/発生に関するものです。なぜそれが起こるのですか?

前もって感謝します!

4

2 に答える 2

3

setVisible( true )すべてのコンポーネントを追加した瞬間に移動します。

これを行わない場合は、Container#addメソッドの javadoc に示されているように、レイアウトを再検証する必要があります。

このメソッドは、レイアウト関連の情報を変更するため、コンポーネント階層を無効にします。コンテナーが既に表示されている場合は、追加されたコンポーネントを表示するために、その後階層を検証する必要があります。

于 2013-04-12T10:21:49.407 に答える
3

JFrame.setVisible(true)への呼び出しが呼び出した最後の行であることを確認してください。

したがって、行を移動するだけです:

setVisible(true);

コンストラクターの最後まで。

さらにいくつかのコメント:

  • 必要ない場合は拡張しないでください (ここでは必要ありません)。
  • すべての UI 関連操作が EDT で実行されていることを確認します (SwingUtilities.invokeLater()ブロックを使用して UI を開始します)。
  • 呼び出すのではsetSize(screenSize.width, screenSize.height);なくframe.setExtendedState(Frame.MAXIMIZED_BOTH);、ウィンドウが画面全体のスペースを取るようにします。すべてのコンポーネントが適切にレイアウトされ、フレームのサイズが計算された優先サイズに設定されるようpack()に、フレームを表示する前に (ただし を呼び出す前に) を呼び出すことも検討してください。frame.setExtendedState(Frame.MAXIMIZED_BOTH);
于 2013-04-12T10:22:02.217 に答える