2010-06-17 69 views
1

这让我非常生气,我已经为此工作了2天,打开了2本书并浏览了它们,并且仍然无法让该程序按照我希望的方式运行。我已经到了一个地步,如果这没有帮助,我就放弃了。JFrame不能正常工作

我想要一个简单的框架应用程序。 它有一个顶部居中的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")); 
    } 
} 

我该如何获得这件东西,让我拥有所需的一切,并显示出来?我很困惑,因为这一点,现在几乎没有帧如何工作。

+0

一般,“不正常”意味着你没有正确使用:) – Bozho 2010-06-17 13:59:35

+5

谢谢。如果我知道如何正确使用,我不会问这个问题。 – 2010-06-17 14:02:13

+0

我没有说你的问题是多余的,我的意思是它可能会被改写。 – Bozho 2010-06-17 14:04:05

回答

1

Swing中的组件必须按特定顺序排列。

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

这里是尼克的代码,重新组织,以正确的顺序定义组件。我使用GridLayout是因为它更快。正如尼瓦斯所说,你应该使用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。
0

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

应该已经

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

2。有用。你想要的是在那里。但不是你想要的,因为你没有告诉Java你想如何显示它。尝试使用LayoutManager,如GridBagLayout

如果您急于创建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(); 
    } 
} 

声明:这是一个基本的例子只是为了给出一个例子。不打算成为生产代码;-)

+0

组件仍未显示,直到我单击边框,然后JComboBox占据了整个框架。 – 2010-06-17 14:07:58

+0

我不知道你做了什么改变。我假设你还没有添加布局管理器。 使用gridbaglayout添加了一个示例。希望这可以帮助。 接下来,尝试给出一个截图,绘图或描述你想要的东西。 另外,如果您匆忙,请尝试使用IDE。 – Nivas 2010-06-17 14:17:09

+0

是的,我刚刚发现了NetBeans,我想我会尝试使用它。它的工作更好。 – 2010-06-17 14:27:13

1

尼克。我认为你必须清除的第一件事是确切地知道你想要什么。

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

从你描述你已经拥有你所需要的东西。有什么不对的:

alt text http://img194.imageshack.us/img194/7038/capturadepantalla201006x.png

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

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

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 - 例如setVisiblesetSize方法。

因此,您有两个不同的JFrame对象,并且您对每个对象都做了一些工作,并且只有其中一个被设置为可见。

它看起来像是你传递JFrame给构造函数的唯一理由是设置窗口的标题。如果您在String与冠军擦肩而过的Bar构造函数,然后调用super(title);Bar构造函数的第一行,那么你就不需要传入的JFrame所有