JLabel,GridLayout

时间:2011-08-23 01:51:25

标签: swing grid-layout java

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

3 个答案:

答案 0 :(得分:2)

您的代码中有两个警告:

您使用以下表达式添加组件

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

这两个电话都是

的快捷方式
window.getContentPane().add

默认情况下,JFrame的内容窗格具有BorderLayout。默认情况下,如果在添加时未指定其他区域/约束,则此布局将在中心区域添加组件。所以你只需将组件放在另一个上面,只剩下最后一个。

你应该“剪切”(翻译不好,切片?)你的GUI,在中心添加你的JLabel,在南方添加另一个JPanel,在里面,使用流程布局并添加你的按钮。

Here is a good start使用我提到的布局,这是非常标准的。

您使用JLabel作为容器。几乎所有的swing组件都继承自java.awt.Container,swing使用它来提供复合组件,但实际上,你不应该将它们用作容器,即不要将其他组件放在其中或给它们布局。你这样做,在行

给它一个布局
txt.setLayout(new GridLayout(1, 1));

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

此致  斯特凡 顺便说一句,永远不要硬编码值,使用常量。 No 9但BUTTON_COUNT = 9静态成员。 你可以考虑买一本java书。我曾经向我的学生推荐Deitel和Deitel。

答案 1 :(得分: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();
    }

}

答案 2 :(得分: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'

应该这样做。(我不认为我错过了什么)。 :)