JFrame 和 JPanel 问题
我正在尝试为当地一家销售糕点、百吉饼和咖啡的百吉饼店制作一个程序。我在实现我在 JFrame 中制作的面板时遇到了麻烦,
任何帮助理解如何使我的 JFrame 看起来像这样都会有帮助 http://kepler.covenant.edu/COS150/Bagel_files/image002.jpg
一旦我完成这项工作,我希望中间的面板集根据选择的产品而改变。我不完全确定如何使按钮和面板相互通信。
感谢您的帮助!
这是到目前为止我的 JFrame 代码。
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class BagelOrder extends JFrame
{
JLabel topLabel;
sizePanel sp = new sizePanel();
typePanel tp = new typePanel();
productsPanel pp = new productsPanel();
buttonPanel bp = new buttonPanel();
extrasPanel ep = new extrasPanel();
public BagelOrder()
{
setTitle("Order Entry Screen");
setSize(800, 800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
topLabel = new JLabel("Order Entry Screen");
add(pp, BorderLayout.WEST);
add(topLabel, BorderLayout.NORTH);
add(bp, BorderLayout.SOUTH);
add(middleCoffeePanelSetBuild(), BorderLayout.CENTER);
add(east, BorderLayout.EAST);
setVisible(true);
}
private JPanel middleCoffeePanelSetBuild()
{
JPanel middlePanel = new JPanel(new GridLayout(3,1));
add(sp);
add(tp);
add(ep);
}
public static void main(String args[])
{
BagelOrder bo = new BagelOrder();
}
}
我没有错误,但除了页面顶部的标签之外我看不到任何其他内容。
这是我的其他类
ButtonPanel
import java.awt.GridLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JPanel;
public class buttonPanel extends JPanel
{
JButton enterItemButton;
JPanel buttonPanel;
ButtonGroup bg;
JButton totalButton;
JButton newOrderButton;
public buttonPanel()
{
buttonPanel = new JPanel(new GridLayout(1,3));
bg = new ButtonGroup();
enterItemButton = new JButton("Enter Item");
totalButton = new JButton("Total");
newOrderButton = new JButton("New Order");
buttonPanel.setSize(150, 780);
buttonPanel.add(enterItemButton);
bg.add(enterItemButton);
buttonPanel.add(totalButton);
bg.add(totalButton);
buttonPanel.add(newOrderButton);
bg.add(newOrderButton);
setVisible(true);
}
}
ProductPanel
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.Border;
public class productsPanel extends JPanel
{
public productsPanel()
{
JPanel productPanel = new JPanel(new GridLayout(3,1));
ButtonGroup bg = new ButtonGroup();
JRadioButton coffeeButton = new JRadioButton("Coffee");
JRadioButton bagelButton = new JRadioButton("Bagel");
JRadioButton pastryButton = new JRadioButton("Pastry");
productPanel.setSize(150, 780);
productPanel.add(coffeeButton);
bg.add(coffeeButton);
productPanel.add(bagelButton);
bg.add(bagelButton);
productPanel.add(pastryButton);
bg.add(pastryButton);
Border etched = BorderFactory.createEtchedBorder();
Border titled = BorderFactory.createTitledBorder(etched, "Products");
productPanel.setBorder(titled);
setVisible(true);
}
}
Size Panel
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.Border;
public class sizePanel extends JPanel{
public sizePanel()
{
JPanel sp = new JPanel(new GridLayout(3,1));
ButtonGroup bg = new ButtonGroup();
JRadioButton smallButton = new JRadioButton("Small");
JRadioButton mediumButton = new JRadioButton("Medium");
JRadioButton largeButton = new JRadioButton("Large");
sp.setSize(200, 200);
sp.add(smallButton);
bg.add(smallButton);
sp.add(mediumButton);
bg.add(mediumButton);
sp.add(largeButton);
bg.add(largeButton);
Border etched = BorderFactory.createEtchedBorder();
Border titled = BorderFactory.createTitledBorder(etched, "Size");
sp.setBorder(titled);
setVisible(true);
}
}
TypePanel
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.Border;
public class typePanel extends JPanel
{
public typePanel()
{
JPanel typePanel = new JPanel(new GridLayout(3,1));
ButtonGroup bg = new ButtonGroup();
JRadioButton regularButton = new JRadioButton("Regular");
JRadioButton decafButton = new JRadioButton("Decaf");
JRadioButton frenchRoastButton = new JRadioButton("French Roast");
typePanel.setSize(200, 200);
typePanel.add(regularButton);
bg.add(regularButton);
typePanel.add(decafButton);
bg.add(decafButton);
typePanel.add(frenchRoastButton);
bg.add(frenchRoastButton);
Border etched = BorderFactory.createEtchedBorder();
Border titled = BorderFactory.createTitledBorder(etched, "Type");
typePanel.setBorder(titled);
setVisible(true);
}
}
ExtrasPanel的代码
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
import javax.swing.border.Border;
public class extrasPanel extends JPanel
{
public extrasPanel()
{
JPanel extrasPanel = new JPanel(new GridLayout(2,1));
JCheckBox creamCheckBox = new JCheckBox("Cream");
JCheckBox sugarCheckBox = new JCheckBox("Sugar");
extrasPanel.setSize(200, 200);
extrasPanel.add(creamCheckBox);
extrasPanel.add(sugarCheckBox);
Border etched = BorderFactory.createEtchedBorder();
Border titled = BorderFactory.createTitledBorder(etched, "Extras");
extrasPanel.setBorder(titled);
setVisible(true);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
编写 Swing GUI 时需要遵循的一些良好实践:
1) 您的 Panel 类构建错误。
您需要重写 ButtonPanel 以及所有其他控件,以便它们读起来像这样:
按照您目前的编写方式,您有一个 ButtonPanel 类(始终大写类),它拥有一个带有按钮的 JPanel,但它从不显示它拥有的 JPanel。您需要 ButtonPanel 成为一个 JPanel,而不仅仅是拥有一个 JPanel。
这是主要问题。您可以改进的小点:
2) JFrame 有一个称为 contentPane 的 JPanel。正如 jzd 所说,当使用 JFrame.add 时,您实际上是在调用 JFrame.getContentPane.add(Component c)。这是一种方便的方法,但它隐藏了您真正在做什么。尤其是当你刚刚学习时,走捷径是不好的。
我个人更进一步,从
3) 开始我的 JFrame,在扩展类(如 JFrame)时以调用 super() 开始是一个很好的做法。同样,您可以将其作为速记形式省略,但在开始时迂腐一点是有好处的。这会调用超类的构造函数(带有您需要的任何参数),这基本上是在说“让我们创建基本的 JFrame,然后对其应用我的扩展”。
4) 将类大写并以小写动词开头所有函数也是一个好习惯。即 ButtonPanel 或 build()
5) 看来您才刚刚开始使用 GUI,但我可以推荐外部库“MigLayout”(google 一下)。它的额外功能和易用性令人惊叹,它使您能够克服所有 Java 内置的、可怕的布局类型。
Some good practices to get into when writing Swing GUI's:
1) Your Panel classes are built wrong.
You need to re-write buttonPanel, and all of your others, so that they read like this:
The way yours is currently written, you have a ButtonPanel class (always capitalise classes) which posseses a JPanel with the buttons on it, but it never displays this JPanel that it owns. You need ButtonPanel to BE a JPanel, not just own one.
Thats the major issue. Minor points you could improve on:
2) The JFrame has a JPanel called the contentPane. As said by jzd, when using JFrame.add you are really calling JFrame.getContentPane.add(Component c). This is a convenience method, but it hides what you are really doing. Especially when you're just learning, shortcuts are bad.
I personally go a step further, starting my JFrames off with
3) It is good practice when extending a class (like JFrame) to begin with a call to super(). Again, you can leave it out as shorthand, but its good to be pedantic when beginning. This calls the superclass's constructor (with whatever arguments you need), which is basically saying "Lets create the basic JFrame, and then apply my extensions to it".
4) Its also good practice to capitalise your classes, and begin all functions with lowercase verbs. ie ButtonPanel or build()
5) It seems like you're only just starting out with GUI, but might I recommend the external library "MigLayout" (google it). Its amazing in the extra power and ease that it gives you over struggling against all of Java's inbuilt, horrible, layout types.
它们通过
ActionListener
接口、ActionPerformed(ActionEvent e)
方法相互通信,并且为了触发这些方法,您需要<要侦听的组件to>.addActionListener(theListener);
They talk to eachother with the
ActionListener
interface,ActionPerformed(ActionEvent e)
method, and in order to fire those methods you need to<the component to be listened to>.addActionListener(theListener);