【发布时间】:2011-05-24 21:25:30
【问题描述】:
你好
我是一名业余爱好者,试图通过编写射箭记分卡来学习/提高我对 Java 的理解。我正在尝试制作一个 GUI,到目前为止,我已经在 JPanel 上成功制作了一排 18 个不同大小和颜色的标签,适合打一打。
然后,我尝试将其中五个“标签面板”添加到另一个面板以构建网格,并且在某些情况下无需创建和添加多达 150 个标签。没有成功,因为原始标签面板不会显示。所有面板都显示在 JFrame 上
我已经尝试了许多不同的方法来让代码工作,使用 Java 教程和谷歌搜索互联网并在这个网站上研究类似的问题,但我正在兜圈子。我一定是在什么地方漏掉了什么,希望你能提供帮助。
我使用 Java 6 和 JGrasp v1.8.8_01 作为 IDE
标签面板的以下代码已被删减,因为其中大部分是重复的。
import javax.swing.*;
import java.awt.*;
public class ArrowScoreLabels extends JPanel{
public JPanel createContentPane(){
JPanel panelForLabels = new JPanel();
panelForLabels.setLayout(null);
//Code creates 18 labels, sets the size, position, background colours, border and
//font and adds the labels to the’panelForLabels
JLabel scorelabel1;
scorelabel1 = new JLabel("",JLabel.CENTER);
scorelabel1.setBorder(BorderFactory.createLineBorder(Color.black));
scorelabel1.setFont(new Font("Arial", Font.ITALIC, 26));
scorelabel1.setLocation(0, 0);//first value differs for each label
scorelabel1.setSize(35, 35);
scorelabel1.setOpaque(true);
panelForLabels.add(scorelabel1);
panelForLabels.setOpaque(true);
return panelForLabels;
}
}
运行以下类会显示面板上的 18 个标签
import javax.swing.*;
import java.awt.*;
public class TestArrowScoreLabels {
private static void createAndShowArrowLabels() {
//Create and set up the window.
JFrame frame = new JFrame("To score one dozen");
//Create and set up the content pane.
ArrowScoreLabels asl = new ArrowScoreLabels();
frame.setContentPane(asl.createContentPane());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(676, 73);
frame.setVisible(true);
}
//Main method to show the GUI/
public static void main(String[] args) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
createAndShowArrowLabels();
}
});
}
}
第二个面板的以下代码类似,可编译但仅显示第二个绿色 JPanel 而不是带有标签的面板。
import javax.swing.*;
import java.awt.*;
public class FiveDozenScorePanel{
public JPanel createContentPane(){
//A bottom JPanel on which to place five dozenpanels.
JPanel fivedozenpanel = new JPanel();
fivedozenpanel.setLayout(null); //requires absolute spacing
fivedozenpanel.setSize(676,185);
fivedozenpanel.setBackground(Color.green);
//Label panels for five dozen
ArrowScoreLabels dozenscorepanel1, dozenscorepanel2,
dozenscorepanel3,dozenscorepanel4,dozenscorepanel5;
//Create the 5 dozenscorelabels.
dozenscorepanel1 = new ArrowScoreLabels();
dozenscorepanel1.setLocation(5,5);//y value changes for each panel
fivedozenpanel.add(dozenscorepanel1);//plus the other 4
fivedozenpanel.setOpaque(true);
return fivedozenpanel;
}
private static void createAndShowDozenPanels() {
JFrame frame = new JFrame("To score five dozen");
FiveDozenScorePanel fdsp = new FiveDozenScorePanel();
frame.setContentPane(fdsp.createContentPane());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Display the window
frame.setSize(700, 233);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
createAndShowDozenPanels();
}
});
}
}
我也试过 frame.getContentPane().add(fdsp); - 框架.pack();并阅读了很多关于绘画方法的信息,以至于我完全糊涂了。 我可以让 ArrowScoreLabels 图像直接出现在 JFrame 而不是 JPanel 上,但只有其中一个而不是五个。
如果能指出正确的方向,我将不胜感激。谢谢你的时间。
更新 - 2010 年 12 月 14 日 我设法在 JFrame 上的另一个 Jpanel 上显示 panelForLabels Jpanel。这是通过将以下代码添加到类 ArrowScoreLabels 来完成的。原来的 createContentPane() 方法被重命名为 createRowOne()。 panelForLabels 是红色的,而五个面板是黄色的,以确定哪个正在显示。然而,尽管进行了大量的实验和研究,我还是只能说服程序显示一行标签。
public static JPanel createContentPane(){
//Bottom panelto hold rows of labels
JPanel fivedozenscorepanel = new JPanel();
fivedozenscorepanel.setLayout(null);//requires absolute spacing
fivedozenscorepanel.setSize(660,180);
fivedozenscorepanel.setBackground(Color.yellow);
fivedozenscorepanel.add(createRowOne());
fivedozenscorepanel.setOpaque(true);
return fivedozenscorepanel;
}
我显示 5 行 18 个标签的唯一方法是在 ArrowScoreLabels 类中创建所有 90 个标签,然后使用绝对间距将它们添加到一个 JPanel,然后再添加到 JFrame。 我已经注意到 pstantons 的建议 - 谢谢你 - 我正在考虑使用 MigLayout 管理器。
【问题讨论】:
-
您是否在面板或标签上致电
setVisible(true);? -
不,我一直在调用 setOpaque(true);
-
标签和面板上的 setVisible(true) 似乎没有什么区别。