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

public class Gui extends JFrame
{
    private JFrame window = new JFrame();
    private JButton but[] = new JButton[9];

    public Gui()
    {
        window.setSize(300,400);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setLayout(new GridLayout(4, 3));

        JLabel txt = new JLabel("Will you dare?", JLabel.CENTER);
        txt.setLayout(new GridLayout(1, 1));
        txt.setHorizontalTextPosition(JLabel.CENTER);
        txt.setFont(new Font("Serif", Font.PLAIN, 21));
        window.add(txt);

        for(int i = 0; i < 9; i++)
        {
            but[i] = new JButton();
            window.add(but[i]);
        }  

        window.setVisible(true);

    }

    public void actionPerformed(ActionEvent e) 
    {

    }

}

私は Java 初心者なので、「あえて」というテキストが 1 行に表示されない理由を教えてください。どうやって解決策を見つけたのか教えていただけないでしょうか?

4

3 に答える 3

2

コードには2つの注意点があります。

次の式を使用してコンポーネントを追加します

 window.add(txt);
 //....
 window.add(but[i]);

どちらの呼び出しもへのショートカットです

window.getContentPane().add

JFrameのコンテンツペインにはデフォルトでBorderLayoutがあります。また、デフォルトでは、追加時に他の領域/拘束が指定されていない場合、このレイアウトは中央領域にコンポーネントを追加します。したがって、コンポーネントを上下に配置するだけで、最後のコンポーネントのみが残ります。

GUIをさらに「カット」(変換が不十分、スライス?)し、中央にJLabelを追加し、南に別のJPanelを追加し、その中にフローレイアウトを使用してボタンを追加する必要があります。

これは、私が言及した非常に標準的なレイアウトを使用するための良いスタートです。

また、JLabelをコンテナとして使用します。ほとんどすべてのswingコンポーネントは、から継承しますjava.awt.Container。これは、swingによって複合コンポーネントを提供するために使用されますが、実際には、それらをコンテナとして使用しないでください。つまり、他のコンポーネントを内部に配置したり、レイアウトを指定したりしないでください。あなたはそれを行い、それにラインでレイアウトを与えます

txt.setLayout(new GridLayout(1, 1));

したがって、この行を削除します。スイングコンポーネントをコンポーネントとして使用し、JPanel(またはJTabbedPaneなど)をコンテナーとして使用します。

よろしく、Stéphaneところで、値をハードコードすることはなく、定数を使用します。9はありませんが、BUTTON_COUNT=9の静的メンバーです。あなたはJavaの本を買うことを検討することができます。私は以前、DeitelとDeitelを生徒に勧めていました。

于 2011-08-23T03:00:10.977 に答える
2

ここでは大げさな推測ですが、私はあなたが次のようなものが欲しいと思っています:

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

public class Gui extends JFrame
{
    private JFrame window = new JFrame();
    private JButton but[] = new JButton[9];

    public Gui()
    {
        window.setSize(300,400);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//        window.setLayout(new GridLayout(4, 3));
        JPanel panel = new JPanel( new GridLayout(3, 3) );
        window.add(panel, BorderLayout.CENTER);

        JLabel txt = new JLabel("Will you dare?", JLabel.CENTER);
//        txt.setLayout(new GridLayout(1, 1));
        txt.setHorizontalTextPosition(JLabel.CENTER);
        txt.setFont(new Font("Serif", Font.PLAIN, 21));
//        window.add(txt);
        window.add(txt, BorderLayout.NORTH);

        for(int i = 0; i < 9; i++)
        {
            but[i] = new JButton();
//            window.add(but[i]);
            panel.add(but[i]);
        }

        window.setVisible(true);

    }

    public static void main(String args[]) throws Exception
    {
        new Gui();
    }

}
于 2011-08-23T03:01:21.993 に答える
1

ここでの問題は非常に単純です。ラベル「txt」にレイアウトを追加しています。

ラベル「txt」がJFrameの最初の行、最初の列を占めるべきだと言っています。最初の行、最初の列はボックスになります。このようなボックスを作成するときは、テキストが 1 行に完全に収まる十分な幅があることを確認する必要があります。この場合、作成した「ボックス」には、ラベル全体が 1 行に収まる十分なスペースがないため、テキストが次の行にジャンプするだけです。

問題の修正:

  • 次の行を削除します。txt.setLayout(new GridLayout(1, 1));

また

  • 次の行txt.setLayout(new GridLayout(1, 1)); を変更します。 txt.setLayout(new GridLayout(1,2));

私が気づいたもう1つの問題があります:

  • 次の行は、上部の下にある必要がありますprivate JButton but[] = new JButton[9]; JLabel txt = new JLabel("Will you dare?");//Removing the 'JLabel.CENTER'

それでうまくいくはずです(何も見逃していないと思います)。:)

于 2011-08-23T05:56:55.787 に答える