首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JLabel,GridLayout

JLabel,GridLayout
EN

Stack Overflow用户
提问于 2011-08-23 09:51:25
回答 3查看 16K关注 0票数 1
代码语言:javascript
复制
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新手,所以,你能告诉我,为什么“你敢吗”的文本没有出现在一行中?你能告诉我你是如何找到解决方案的吗,所以其他时间我也可以自己去做。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-23 11:01:22

这是胡乱猜测,但我认为你想要这样的东西:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-08-23 11:00:11

在您的代码中有两个警告:

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

代码语言:javascript
复制
 window.add(txt);
 //....
 window.add(but[i]);

这两个调用都是

代码语言:javascript
复制
window.getContentPane().add

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

你应该“切”(翻译得不好,切片?)更多的图形用户界面,在中间添加你的JLabel,在南边添加另一个JPanel,在里面,使用流布局并添加你的按钮。

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

你使用一个JLabel作为一个容器。几乎所有的swing组件都继承自java.awt.Container,这是swing用来提供复合组件的,但实际上,你永远不应该将它们用作容器,也就是说,不要把其他组件放在里面或者给它们一个布局。您可以这样做,给它一个在line上的布局

代码语言:javascript
复制
txt.setLayout(new GridLayout(1, 1));

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

顺便说一句,永远不要硬编码值,使用常量。不是9,而是BUTTON_COUNT =9静态成员。你可以考虑买一本java书。我过去常常向我的学生推荐Deitel和Deitel。

票数 2
EN

Stack Overflow用户

发布于 2011-08-23 13:56:56

这里的problem非常简单:你正在给你的标签“txt”添加一个布局。

您是说标签"txt“应该占据JFrame的第一行第一列。第一行,第一列将产生一个框。当你创建一个这样的方框时,你需要确保方框的宽度足以让你的文本完全适合一行。在这种情况下,您的文本只是跳到下一行,因为您创建的“框”中没有足够的空间来容纳整个标签。

解决问题的方法:

删除此行:txt.setLayout(new GridLayout(1, 1));

将以下行更改为

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

你还有一个我注意到的问题:

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

下面

这应该可以了。(我不认为我错过了任何东西)。:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7155508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档