为啥这个 JLabel 不在这个 Java 应用程序的中心?
Posted
技术标签:
【中文标题】为啥这个 JLabel 不在这个 Java 应用程序的中心?【英文标题】:Why isn't this JLabel in the center of this Java application?为什么这个 JLabel 不在这个 Java 应用程序的中心? 【发布时间】:2013-05-26 18:43:43 【问题描述】:这里是 Java 新手程序员:
我讨厌每次遇到问题时都提出问题,但我不知道应该使用什么来让绿色的“Hello World”标签直接进入 JPanel 的中心。这是我的代码:
package game;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Javagame extends JPanel implements ActionListener
protected JButton b1;
private JLabel label;
public Javagame()
b1 = new JButton("Button!");
b1.setActionCommand("change");
b1.addActionListener(this);
add(b1);
label = new JLabel("Hello World!", SwingConstants.CENTER);
label.setFont(new Font("Arial", Font.BOLD, 20));
label.setForeground(new Color(0x009900));
add(label, BorderLayout.CENTER);
public void actionPerformed(ActionEvent e)
if ("change".equals(e.getActionCommand()))
label.setText("Hello Universe!");
b1.setActionCommand("changeBack");
if ("changeBack".equals(e.getActionCommand()))
label.setText("Hello World!");
b1.setActionCommand("change");
private static void createWindow()
JFrame frame = new JFrame("Javagame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(500,500));
Javagame newContentPane = new Javagame();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
public static void main(String[] args)
createWindow();
BorderLayout.CENTER
似乎不适用于add()
。任何帮助将不胜感激,谢谢!
【问题讨论】:
【参考方案1】:JLabel
在父容器内居中,文本在标签内对齐。
试试……
label.setHorizontalAlignment(JLabel.CENTER);
label.setVerticalAlignment(JLabel.CENTER);
【讨论】:
您好,感谢您的回复。我应该把代码放在哪里?我将代码插入到add(label, BorderLayout.CENTER);
上方的public Javagame()
中,但它不起作用。对不起我的抱怨......
嗯,你可以把它放在任何地方,但我会在你把标签添加到容器之前把它放好
水平/垂直对齐方式默认为 CENTER。不需要此代码。【参考方案2】:
BorderLayout.CENTER 似乎不起作用
JPanel 的默认布局是 FlowLayout。您需要将布局设置为 BorderLayout。
另外,您需要将按钮添加到 BorderLayout 的 NORTH。
然后按钮会出现在顶部,标签会居中。
【讨论】:
【参考方案3】:添加标签时使用 FlowLayout 字段。
//Code apove
label = new JLabel("Hello World!", SwingConstants.CENTER);
label.setFont(new Font("Arial", Font.BOLD, 20));
label.setForeground(new Color(0x009900));
add(label, FlowLayout.CENTER);//!!
//Code under
因为您没有更改面板中的布局,所以不要使用 BorderLayout。
如果你真的想使用 BorderLayout 而不是 FlowLayout,请在其中添加 setLayout() 命令。
//Code apove
label = new JLabel("Hello World!", SwingConstants.CENTER);
label.setFont(new Font("Arial", Font.BOLD, 20));
label.setForeground(new Color(0x009900));
setLayout(new BorderLayout()); //!!
add(label, BorderLayout.CENTER);
add(b1,BorderLayout.????); //Edited
//Code under
@Edit - 在 setLayout() 方法之后也添加您的按钮,或者在您制作面板时在开头设置布局
【讨论】:
感谢您的回答!由于我现在不在我的主要(包含所有文件的那个)上,我无法编辑我的代码,但我稍后会检查它。 :) -1,这个答案是在 2 小时前给出的。无需用重复的答案将论坛弄得一团糟。 没有代码示例是的。我想给出一些代码示例。你的答案和我的差不多。以上是关于为啥这个 JLabel 不在这个 Java 应用程序的中心?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在 JavaFX 上收到 java.lang.IllegalStateException“不在 FX 应用程序线程上”?
急!!!!java 如何使jlabel单元格中数据不能被修改