【问题标题】:JLabel, GridLayoutJLabel,网格布局
【发布时间】:2011-08-24 07:43:35
【问题描述】:
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 菜鸟,所以,你能告诉我,为什么“你敢”文本没有出现在一行中吗?你能告诉我你是如何找到解决方案的,所以其他时候我也可以自己解决。

【问题讨论】:

  • 对我来说似乎出现在一行中i.imgur.com/JD4LZ.png
  • 您可能希望张贴您所拥有的图片,因为它应该在一行中。

标签: swing grid-layout java


【解决方案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));
        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】:

    您的代码中有两个警告:

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

     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 等)作为容器。

    问候, 斯蒂芬妮 顺便说一句,从不硬编码值,使用常量。没有 9,但​​有一个 BUTTON_COUNT = 9 静态成员。 你可以考虑买一本java书。我曾经向我的学生推荐 Deitel 和 Deitel。

    【讨论】:

      【解决方案3】:

      这里的问题非常简单:您正在为标签“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'

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-03
        • 2011-10-28
        • 2013-04-24
        • 1970-01-01
        • 2015-11-13
        • 1970-01-01
        • 2017-10-26
        相关资源
        最近更新 更多