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 菜鸟,所以,你能告诉我,为什么“你敢”文本没有出现在一行中吗?你能告诉我你是如何找到解决方案的,所以其他时候我也可以自己做。

4

3 回答 3

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));

所以删除这一行。使用 swing 组件作为组件,使用 JPanel(或 JTabbedPane 等)作为容器。

问候,Stéphane btw,从不硬编码值,使用常量。没有 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的第一行第一列。第一行,第一列将产生一个框。当您创建这样的框时,您需要确保框足够宽,以便您的文本完全适合单行。在这种情况下,您的文本只是跳到下一行,因为您为整个标签创建的“框”中没有足够的空间来容纳一行。

问题修复:

  • 删除这一行:txt.setLayout(new GridLayout(1, 1));

或者

  • 更改以下行txt.setLayout(new GridLayout(1, 1)); txt.setLayout(new GridLayout(1,2));

我注意到您还有另一个问题:

  • 以下行应位于顶部下方private JButton but[] = new JButton[9]; JLabel txt = new JLabel("Will you dare?");//Removing the 'JLabel.CENTER'

应该这样做。(我认为我没有错过任何东西)。:)

于 2011-08-23T05:56:55.787 回答