我正在尝试创建一个简单的JFrame菜单,其中有一个很好的背景,它可以和一些文本一起使用。文字有点儿麻烦。以下是它的外观(http://imgur.com/nRpzA30)
如您所见,文本中只有一行不是第二行。
随之而来。运行程序时会出现两个GUI。一个是完全空的,一个看起来像上面的图片。
最后我不能使用方法logo.setHorizontalAlignment(JLabel.NORTH);没有得到错误,与其他一些错误相同。我测试和工作的两个只有.CENTER和.LEFT。
任何帮助都会很棒!
哦,差点忘了,这是我的代码:)
package character;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
/**
* Created by Niknea on 6/28/14.
*/
public class characterSelector extends JFrame{
JPanel cselectorText;
JFrame cselectorButtons;
JLabel logo, characterName, label;
JButton previous, next;
public characterSelector(String title){
super(title);
this.createCharacterSelector();
this.setSize(1920, 1033);
this.setResizable(true);
this.setVisible(true);
}
public void createCharacterSelector(){
try {
label = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/resources/Grass_Background.jpg"))));
cselectorButtons = new JFrame();
logo = new JLabel("SoccerKidz [REPLACE W/ COOL LOGO]");
characterName = new JLabel("<Character Name>");
logo.setPreferredSize(new Dimension(50, 50));
logo.setFont(new Font(logo.getFont().getName(), Font.HANGING_BASELINE, 50));
characterName.setFont(new Font(characterName.getFont().getName(), Font.HANGING_BASELINE, 50));
cselectorButtons.add(logo);
cselectorButtons.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cselectorButtons.setContentPane(label);
cselectorButtons.setLayout(new BorderLayout());
characterName.setForeground(Color.CYAN);
characterName.setHorizontalAlignment(JLabel.CENTER);
cselectorButtons.add(characterName);
logo.setForeground(Color.CYAN);
logo.setHorizontalAlignment(JLabel.LEFT);
cselectorButtons.add(logo);
cselectorButtons.pack();
cselectorButtons.setLocationRelativeTo(null);
cselectorButtons.setVisible(true);
} catch (IOException exp) {
exp.printStackTrace();
}
}
}
再次感谢! :)
答案 0 :(得分:1)
如您所见,文本中只有一行不是第二行。
您将cselectorButtons
的布局设置为BorderLayout
。然后你添加JLabel("<Character Name>");
,这很好。但是你添加了JLabel("SoccerKidz [REPLACE W/ COOL LOGO]");
。这是正在发生的事情。对于BorderLayout
,当您只是add(component)
时,通常您希望将BorderLayout.[POSITION]
指定为add
的第二个参数。如果不这样做,那么在没有指定位置的情况下添加的每个组件都将默认隐式添加BorderLayout.CENTER
。这个问题是每个位置只能有一个组件。所以在你的情况下,第一个标签被踢出中心,只显示你添加的第二个标签。
运行程序时会出现两个GUI。一个是完全空的,一个看起来像上面的图片。
查看代码时。您的课程是JFrame
,您不在其中添加任何内容,this.setVisible(true)
。还有JFrame cselectorButtons;
你做添加组件,还有cselectorButtons.setVisible(true);
。你能猜出哪一个是你所看到的那个不是空的。不要扩展JFrame
。只需使用您当前使用的实例。
最后,我不能使用方法
logo.setHorizontalAlignment(JLabel.NORTH);
而不会收到错误。
查看the API for JLabel并不需要太多。话虽这么说,是什么让你觉得水平对齐,应该包括一个位置向北的选项。没有意义
public void setHorizontalAlignment(int alignment)
设置标签内容沿X轴的对齐方式。
<强>参数:强>
alignment
- SwingConstants中定义的以下常量之一:LEFT
,CENTER
(仅限图片标签的默认设置),RIGHT
,LEADING
(纯文字标签的默认设置)或TRAILING
。
如果BorderLayout
不适合您,建议您查看Layout out Components Within a Container和A Visual Guide to Layout Managers以了解可以使用的其他可能的布局管理器。另外请记住,您可以使用不同的布局管理器嵌套不同的面板,以获得所需的结果。但首先你需要了解它们是如何工作的。
<强>更新强>
我做了一些改动,这是有效的。我也在查看你的pastebin代码,并没有真正看到任何区别。您可能需要调查我的代码以尝试查找差异
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
/**
* Created by Niknea on 6/28/14.
*/
public class CharacterSelector {
JPanel cselectorText;
JFrame cselectorButtons;
JLabel logo, characterName, label;
JButton previous, next;
public CharacterSelector() {
createCharacterSelector();
}
public void createCharacterSelector() {
try {
label = new JLabel(new ImageIcon(ImageIO.read(getClass()
.getResource("/resources/Grass_Background.jpg"))));
cselectorButtons = new JFrame();
logo = new JLabel("SoccerKidz [REPLACE W/ COOL LOGO]");
characterName = new JLabel("<Character Name>");
logo.setPreferredSize(new Dimension(50, 50));
logo.setFont(new Font(logo.getFont().getName(),
Font.HANGING_BASELINE, 50));
characterName.setFont(new Font(characterName.getFont().getName(),
Font.HANGING_BASELINE, 50));
cselectorButtons.add(logo);
cselectorButtons.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cselectorButtons.setContentPane(label);
cselectorButtons.setLayout(new BorderLayout());
characterName.setForeground(Color.CYAN);
characterName.setHorizontalAlignment(JLabel.CENTER);
cselectorButtons.add(characterName);
logo.setForeground(Color.CYAN);
logo.setHorizontalAlignment(JLabel.LEFT);
cselectorButtons.add(logo, BorderLayout.NORTH);
cselectorButtons.pack();
cselectorButtons.setLocationRelativeTo(null);
cselectorButtons.setVisible(true);
} catch (IOException exp) {
exp.printStackTrace();
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
new CharacterSelector();
}
});
}
}