我正在学习一个小型业余项目的GUI基础知识,并且一直在学习从头开始编写代码。我有初始设置和变量等等,但是我遇到了问题。我似乎无法让JLabel类别转移到面板的左侧。我知道有更简单的方法来编写GUI。我只是在寻求GUI的最基本的基本声明。这是我的代码:
public class GUIGameFromScratch {
static String[] Classes = {
"Barbarian",
"Fighter",
"Rogue",
"Wizard"
};
static String[] Races = {
"Dwarf",
"Gnome",
"Half-Orc",
"Human"
};
static String[] Gender = {
"Male",
"Female"
};
static String cls;
static String rcs;
static String gen;
static String gameName = "RPG Text";
static Component frame = null;
static Component icon = null;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Classes(Classes);
Races(Races);
Gender(Gender);
JFrame display = new JFrame();
display.setSize(300,250);
display.setVisible(true);
display.setTitle(gameName);
display.setResizable(false);
JPanel disPane = new JPanel();
display.add(disPane);
disPane.setVisible(true);
disPane.setSize(295,245);
JLabel clas = new JLabel();
disPane.add(clas);
clas.setVisible(true);
clas.setLocation(5,5);
clas.setSize(100,50);
clas.setText("Class: " + cls);
}
public static void Classes(String[] Classes){
cls = (String)JOptionPane.showInputDialog(frame,
"Choose a Class:",
gameName,
JOptionPane.PLAIN_MESSAGE, (Icon) icon,
Classes,
Classes[0]
);
}
public static void Races(String[] Races){
rcs = (String)JOptionPane.showInputDialog(frame,
"Choose a Race:",
gameName,
JOptionPane.PLAIN_MESSAGE, (Icon) icon,
Races,
Races[0]
);
}
public static void Gender(String[] Gender){
gen = (String)JOptionPane.showInputDialog(frame,
"Choose a Gender:",
gameName,
JOptionPane.PLAIN_MESSAGE, (Icon) icon,
Gender,
Gender[0]
);
}
}
我不确定如何解决此问题。我需要能够移动标签以刷新GUI,但似乎没有任何效果。我已经尝试过位置,语言环境,水平对齐等。必须缺少一些我找不到的功能。我再次明白,我对此采取了非常严格的方法。任何帮助将不胜感激。
答案 0 :(得分:2)
Swing / AWT使用布局管理器显示子组件。每个容器(例如JPanel)都有一个布局管理器。
布局经理的工作是设置每个子组件的位置和大小。当父级的布局管理器布置其子级并确定其位置和大小时,您调用setLocation
时传递的任何值都将被丢弃。
最简单的解决方案是指定一个布局管理器,将其子组件放在左侧:
JPanel disPane = new JPanel(new FlowLayout(FlowLayout.LEFT));
我确定您打算在窗口中包含更多组件。如果希望它们以更复杂的方式进行布局,则可能需要更复杂的布局管理器,或者将许多布局管理器组合在一起。相互内部使用许多JPanel都是非常普遍的,每个JPanel都有自己的布局管理器。例如,如果您需要一排大小相同的按钮,则可以对单独包含这些按钮的JPanel使用GridLayout。
浏览文档以查看可用的布局管理器很有用:
Layout
结尾。在我看来,最有用的布局管理器是GridBagLayout(不要与GridLayout混淆)。这很难学习,主要是因为布局组件可能是一个复杂的问题,但是一旦您完全理解它,它就会变得非常有用并且非常容易使用。
其他一些常用的布局是:
但是没有一个布局管理器可以解决所有问题,这就是为什么程序员需要合并并嵌套它们的原因。
就像布局管理器控制子组件的位置一样,它也可以控制子组件的大小。
您当前正在将JLabel的尺寸设置为100×50像素。我确定它在您的计算机上看起来不错。
但是Java被设计为可以在许多计算机和许多操作系统上运行。如果您的JLabel字体是12点Lucida,那么JLabel需要高几个像素? “ 12点”字体不是12像素高。 12点实际上是 12 ⁄ 72 英寸。究竟需要多少像素才能对应该测量,取决于用户的显示器和当前的图形分辨率。
理论上,您可以自行进行所有数学运算来确定JLabel需要多大,但您不需要,因为Swing已经做到了。 JLabel的preferred size已经解决了这个问题。
根本不设置JLabel的大小,无论程序运行所在的计算机上哪种大小,父级布局管理器都将遵循其默认的首选大小。
答案 1 :(得分:1)
我建议从here开始研究Swing中可用的一些基础布局系统。通常,您要为JFrame分配一个布局管理器,然后使用布局管理器在窗口中定位组件。我还要注意的另一点是,在完成设置所有参数(如大小或标题)之前,请避免将组件或JFrame设置为可见,因为从理论上讲,它可以实时向用户展示更改。