1

这让我很生气,我已经为此工作了 2 天,打开了 2 本书并浏览了它们,但仍然无法让这个程序按照我想要的方式运行。我已经到了如果这没有帮助,我会退出的地步。

我想要一个简单的框架应用程序。它在顶部有一个 JComboBox 居中。旁边是一个足够大的文本字段,可以显示数字,例如“$ 49.99”下面是一个显示服务条款的文本区域的位置下面是同意服务条款的复选框下面是2个按钮“接受”和“拒绝”

我已经为此工作了 2 天,这里是编码:

public class Bar extends JFrame implements ActionListener
{
    public Bar(final JFrame frame)
    {
        String[] tests = { "A+ Certification", "Network+ Certification", "Security+ Certification", "CIT Full Test Package" };
        JButton button = new JButton("Click Meh");
        add(new JLabel("Welcome to the CIT Test Program "));
        add(new JLabel("Please select which Test Package from the list below."));
        frame.setVisible(true);
        frame.setSize(250,250);
        JPanel pane1 = new JPanel(new FlowLayout());
        JPanel pane2 = new JPanel(new FlowLayout());

        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");
        JMenu editMenu = new JMenu("Edit");
        JMenu helpMenu = new JMenu("Help");
        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        menuBar.add(helpMenu);
        JMenuItem newMenu = new JMenuItem("New  (Ctrl+N)");
        JMenuItem openMenu = new JMenuItem("Open  (Ctrl+O)");
        JMenuItem saveMenu = new JMenuItem("Save  (Ctrl+S)");
        saveMenu.addActionListener(this);
        JMenuItem exitMenu = new JMenuItem("Exit  (Ctrl+W)");
        JMenuItem cutMenu = new JMenuItem("Cut  (Ctrl+X)");
        JMenuItem copyMenu = new JMenuItem("Copy  (Ctrl+C)");
        JMenuItem pasteMenu = new JMenuItem("Paste  (Ctrl+V)");
        JMenuItem infoMenu = new JMenuItem("Help  (Ctrl+H)");
        fileMenu.add(newMenu);
        fileMenu.add(openMenu);
        fileMenu.add(saveMenu);
        fileMenu.add(exitMenu);
        editMenu.add(cutMenu);
        editMenu.add(copyMenu);
        editMenu.add(pasteMenu);
        helpMenu.add(infoMenu);
        frame.setJMenuBar(menuBar);
        JComboBox packageChoice =  new JComboBox(tests);
        frame.add(packageChoice);


    }

     public void actionPerformed(ActionEvent e)
  {
  Object source = e.getSource();
  {
  }

}

编辑:忘记添加第二个程序

public class JFrameWithPanel
{
    public static void main(String[] args)
    {
         JPanel panel = new Bar(new JFrame("CIT Test Program"));
    }
}

我怎样才能让它拥有我想要的一切并显示出来?因此,我很困惑,现在几乎不知道 Frames 是如何工作的。

4

4 回答 4

1

缺口。我认为你必须弄清楚的第一件事就是确切地知道你想要什么。

我在这个问题上帮助了你https://stackoverflow.com/questions/3055777/how-to-...

根据您的描述,您已经拥有所需的东西。这有什么问题:

替代文字

所以,我真的认为你应该清楚地描述你想要什么,才能得到它。

我们会帮助你,但你必须清楚地定义你的问题是什么。

于 2010-06-17T14:12:25.150 回答
1

Swing 中的组件必须按一定的顺序布局。

你从一个 JFrame 开始。放置在 JFrame 中的唯一组件是 JMenuBar 和 JPanel。您不要在 JFrame 中添加任何其他组件。您在 JPanel 中添加组件。

这是 Nick 的代码,重新组织后以正确的顺序定义组件。我使用了 GridLayout,因为它更快。正如 Nivas 所说,您应该使用 GridBagLayout。

public class Bar {

    private static final long serialVersionUID = 1L;

    public Bar(final JFrame frame) {
        JMenuBar menuBar = buildMenuBar();
        frame.setJMenuBar(menuBar);

        JPanel masterPanel = new JPanel(new GridLayout(2, 1));

        JPanel pane1 = new JPanel(new GridLayout(3, 1));
        pane1.add(new JLabel("Welcome to the CIT Test Program "));
        pane1.add(new JLabel("Please select which Test Package from the list below."));
        JButton button = new JButton("Click Me");
        pane1.add(button);

        JPanel pane2 = new JPanel(new GridLayout(1, 1));
        String[] tests = { "A+ Certification", "Network+ Certification",
                "Security+ Certification", "CIT Full Test Package" };
        JComboBox packageChoice = new JComboBox(tests);
        pane2.add(packageChoice);

        masterPanel.add(pane1);
        masterPanel.add(pane2);

        frame.add(masterPanel);
        frame.pack();

        frame.setVisible(true);
//      frame.setSize(250, 250);

    }

    public JMenuBar buildMenuBar() {
        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");
        JMenu editMenu = new JMenu("Edit");
        JMenu helpMenu = new JMenu("Help");
        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        menuBar.add(helpMenu);
        JMenuItem newMenu = new JMenuItem("New  (Ctrl+N)");
        JMenuItem openMenu = new JMenuItem("Open  (Ctrl+O)");
        JMenuItem saveMenu = new JMenuItem("Save  (Ctrl+S)");
        saveMenu.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub

            }
        });
        JMenuItem exitMenu = new JMenuItem("Exit  (Ctrl+W)");
        JMenuItem cutMenu = new JMenuItem("Cut  (Ctrl+X)");
        JMenuItem copyMenu = new JMenuItem("Copy  (Ctrl+C)");
        JMenuItem pasteMenu = new JMenuItem("Paste  (Ctrl+V)");
        JMenuItem infoMenu = new JMenuItem("Help  (Ctrl+H)");
        fileMenu.add(newMenu);
        fileMenu.add(openMenu);
        fileMenu.add(saveMenu);
        fileMenu.add(exitMenu);
        editMenu.add(cutMenu);
        editMenu.add(copyMenu);
        editMenu.add(pasteMenu);
        helpMenu.add(infoMenu);
        return menuBar;
    }
}

我将 JMenuBar 代码移到了它自己的方法中,因此希望其余的代码更容易理解。

我有一个主 JPanel,所有其他组件都添加到其中。

我使用另一个 JPanel 来保存两个 JLabel 和 JButton。

我使用第三个 JPanel 来保存 JComboBox。

基本模式如下:

  • 定义 JPanel。
  • 定义组件。
  • 将组件添加到 JPanel。
  • 将 JPanel 添加到主 JPanel
  • 将主 JPanel 添加到 JFrame。
于 2010-06-17T14:39:22.420 回答
0

1. 你的第二个程序不会编译。您正在尝试将 JFrame 分配给 JPanel。

应该是

 JFrame frame = new Bar(new JFrame("CIT Test Program")); 

2. 有用。你想要的就在那里。但不是你想要的,因为你没有告诉java你希望它如何显示。尝试使用GridBagLayout之类的LayoutManager

如果您急于创建 GUI,请尝试使用 NetBeans 之类的 IDE,它可以通过拖放使您的工作更轻松。

编辑:

一个例子:

public class TestN extends JFrame
{
    private JLabel label ;
    private JComboBox combo;
    private JButton button;
    public TestN()
    {
        label = new JLabel("Label:");
        combo = new JComboBox();
        combo.addItem("Item 1");
        combo.addItem("Item 2");
        combo.addItem("Item 3");

        setLayout(new GridBagLayout());

        GridBagConstraints c1 = new GridBagConstraints();
        c1.gridx = 0;
        c1.gridy = 0;
        c1.weightx = 1;
        c1.weighty = 1;
        add(label, c1);

        GridBagConstraints c2 = new GridBagConstraints();
        c2.gridx = 1;
        c2.gridy = 0;
        c2.weightx = 1;
        c2.weighty = 1;
        add(combo, c2);

        button = new JButton("Ok");
        GridBagConstraints c3 = new GridBagConstraints();
        c3.gridx = 2;
        c3.gridy = 0;
        c3.weightx = 1;
        c3.weighty = 1;
        add(button, c3);

        setTitle("Test");
        setSize(200,100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args)
    {
        new TestN();
    }
}

免责声明:这是一个基本示例,只是为了举例。不意味着是生产代码;-)

于 2010-06-17T14:06:26.540 回答
0

你有:

public class Bar extends JFrame implements ActionListener
{
    public Bar(final JFrame frame)
    {
        String[] tests = { "A+ Certification", "Network+ Certification", "Security+ Certification", "CIT Full Test Package" };
        JButton button = new JButton("Click Meh");
        add(new JLabel("Welcome to the CIT Test Program "));
        add(new JLabel("Please select which Test Package from the list below."));
        frame.setVisible(true);
        frame.setSize(250,250);

每个Bar对象都继承自JFrame(即Bar对象的一种JFrame),但您在构造函数中传入了不同的JFrame对象(frame参数)。然后调用Bar对象上的一些方法——比如添加两个JLabel对象——以及传入的一些方法JFrame——比如setVisibleandsetSize方法。

所以你有两个不同的JFrame对象,你对它们中的每一个都做了一些工作,并且只有一个对象被设置为可见。

看起来您将 传递JFrame给构造函数的唯一原因是设置窗口的标题。如果您将String带有标题的 a 传递给Bar构造函数,然后super(title);作为构造函数的第一行调用,Bar那么您根本不需要传入JFrame

于 2010-06-18T06:08:59.550 回答