JMenu and JTabbedPane conflict

D

DenKain

Okay I know this should be very simple but my compiler, jGRASP, is not
making it so. The problem I have is that the compiler says the
following:

TabbedPaneDemo.java:131: cannot resolve symbol
symbol : method createMenuBar ()
location: class javax.swing.JComponent
frame.setJMenuBar(newContentPane.createMenuBar());

Now to be honest I really don't see what its not getting so I thought I
would get a second opinion.

Below is the code for my program so far (Yes I'm moding a demo for my
own use):

import java.awt.*;
import java.awt.event.*;
import javax.swing.JTabbedPane;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JComponent;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
//Specific AWTs that your calling
//import java.awt.BorderLayout;
//import java.awt.Dimension;
//import java.awt.GridLayout;
//import java.awt.event.KeyEvent;


public class TabbedPaneDemo extends JPanel {


public JMenuBar createMenuBar()
{
JMenuBar menuBar;
JMenu menu, submenu;
JMenuItem menuItem;

//Create the menu bar.
menuBar = new JMenuBar();

//Build the first menu.
menu = new JMenu("File");
menuBar.add(menu);

//a group of JMenuItems
menuItem = new JMenuItem("Open");
menu.add(menuItem);

//a submenu
menu.addSeparator();
submenu = new JMenu("A submenu");

menuItem = new JMenuItem("An item in the submenu");
submenu.add(menuItem);

menuItem = new JMenuItem("Another item");
submenu.add(menuItem);
menu.add(submenu);

return menuBar;
}




public TabbedPaneDemo() {
super(new GridLayout(1, 1));

JTabbedPane tabbedPane = new JTabbedPane();
ImageIcon icon = createImageIcon("middle.gif");

JComponent panel1 = makeTextPanel("Panel #1");
tabbedPane.addTab("Tab 1", icon, panel1,
"Does nothing");
tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);

JComponent panel2 = makeTextPanel("Panel #2");
tabbedPane.addTab("Tab 2", icon, panel2,
"Does twice as much nothing");
tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);

JComponent panel3 = makeTextPanel("Panel #3");
tabbedPane.addTab("Tab 3", icon, panel3,
"Still does nothing");
tabbedPane.setMnemonicAt(2, KeyEvent.VK_3);

JComponent panel4 = makeTextPanel(
"Panel #4 (has a preferred size of 410 x 50).");
panel4.setPreferredSize(new Dimension(410, 50));
tabbedPane.addTab("Tab 4", icon, panel4,
"Does nothing at all");
tabbedPane.setMnemonicAt(3, KeyEvent.VK_4);

//Add the tabbed pane to this panel.
add(tabbedPane);

//Uncomment the following line to use scrolling tabs.
//tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
}

protected JComponent makeTextPanel(String text)
{
JPanel panel = new JPanel(false);
JLabel filler = new JLabel(text);
filler.setHorizontalAlignment(JLabel.CENTER);
panel.setLayout(new GridLayout(1, 1));
panel.add(filler);
return panel;
}


/** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createImageIcon(String path)
{
java.net.URL imgURL = TabbedPaneDemo.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}

/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("TabbedPaneDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.
JComponent newContentPane = new TabbedPaneDemo();
frame.setJMenuBar(newContentPane.createMenuBar());
newContentPane.setOpaque(true); //content panes must be opaque
frame.getContentPane().add(new TabbedPaneDemo(),
BorderLayout.CENTER);

//Display the window.
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
 
L

Lee Weiner

Okay I know this should be very simple but my compiler, jGRASP, is not
making it so. The problem I have is that the compiler says the
following:

TabbedPaneDemo.java:131: cannot resolve symbol
symbol : method createMenuBar ()
location: class javax.swing.JComponent
frame.setJMenuBar(newContentPane.createMenuBar());
//Create and set up the content pane.
JComponent newContentPane = new TabbedPaneDemo();
frame.setJMenuBar(newContentPane.createMenuBar());
newContentPane.setOpaque(true); //content panes must be opaque
frame.getContentPane().add(new TabbedPaneDemo(),
BorderLayout.CENTER);
The compiler believes the newContentPane variable references a JComponent
object, and JComponents don't contain a createMenuBar method. Remember,
the compiler doesn't actually put any objects in memory. It takes its
best guess at what type of object is being referenced, and that's a
JComponent. When you use this type of "most generic variable declaration",
you're restricted to the methods contained in that class. If you declare the
variable of type TabbedPaneDemo, it works.

Lee Weiner
lee AT leeweiner DOT org
 
D

DenKain

I did tried that before setteling on what I thought was the best method
and I keep getting this error:

TabbedPaneDemo.java:124: non-static method createMenuBar() cannot be
referenced from a static context
frame.setJMenuBar(TabbedPaneDemo.createMenuBar());
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,754
Messages
2,569,525
Members
44,997
Latest member
mileyka

Latest Threads

Top