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