gpt4 book ai didi

java - JFrame 和 JPanel 问题

转载 作者:行者123 更新时间:2023-11-30 07:34:41 26 4
gpt4 key购买 nike

我正在尝试为本地一家销售糕点、百吉饼和咖啡的百吉饼店制作程序。我在实现我在 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();
}



}

我没有错误,但除了页面顶部的标签,我看不到任何其他内容。

这是我的其他类的代码

按钮面板

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);

}
}

产品面板

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);
}
}

尺寸面板

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);
}
}

类型面板

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);
}
}

附加面板

 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);
}
}

最佳答案

编写 Swing GUI 时要采用的一些良好做法:

1) 您的 Panel 类构建错误。您需要重写 buttonPanel 和所有其他按钮面板,以便它们像这样阅读:

public buttonPanel() {
super(new GridLayout(1,3));
bg = new ButtonGroup();
enterItemButton = new JButton("Enter Item");
totalButton = new JButton("Total");
newOrderButton = new JButton("New Order");

this.setSize(150, 780);
this.add(enterItemButton);
bg.add(enterItemButton);
this.add(totalButton);
bg.add(totalButton);
this.add(newOrderButton);
bg.add(newOrderButton);
this.setVisible(true);

}
}

按照您当前的编写方式,您有一个 ButtonPanel 类(始终大写类),它拥有一个带有按钮的 JPanel,但它从不显示它拥有的这个 JPanel。您需要 ButtonPanel 成为一个 JPanel,而不仅仅是拥有一个。这是主要问题。您可以改进的小问题:

2) JFrame 有一个名为 contentPane 的 JPanel。正如 jzd 所说,在使用 JFrame.add 时,您实际上是在调用 JFrame.getContentPane.add(Component c)。这是一个方便的方法,但它隐藏了你真正在做什么。尤其是当您刚刚开始学习时,捷径是不好的。

我个人更进一步,开始我的 JFrames

JPanel content = new JPanel(new BorderLayout());
content.add(...);
....
this.setContentPane(content);

3) 扩展类(如 JFrame)时,最好先调用 super()。同样,您可以将其作为速记形式省略,但开始时迂腐一点是有好处的。这将调用父类(super class)的构造函数(使用您需要的任何参数),这基本上是在说“让我们创建基本的 JFrame,然后将我的扩展应用到它”。

4) 将类大写并以小写动词开头所有函数也是一个好习惯。即 ButtonPanel 或 build()

5) 看来您只是刚刚开始使用 GUI,但我可能会推荐外部库“MigLayout”(谷歌搜索)。它的额外功能和易用性令人惊奇,让您可以克服所有 Java 内置的、糟糕的布局类型。

关于java - JFrame 和 JPanel 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5036637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com