私は宿題に取り組んできましたが、奇妙な問題に遭遇しました。私は2つのJMenuItemsをクリックしてメソッドを呼び出そうとしていますが、何らかの理由で添付されたactionListenersが機能しません。JMenuItemのこのActionListenerが実行されないのはなぜですか?
私はそれが面白い演技だったが、そのコードも実行されないメソッド呼び出しと想定して、System.out.printlnをactionListenersに追加しました。
他のアクションリスナーと同様の問題については、私はStack Overflowを見ていました。リスナーパートを正しく実行していると思います。
私のコードをこのようにモジュール化したのは初めてのことです。
どこが間違っていますか?
完全なコード
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;
class Test100 extends JFrame implements ActionListener
{
//Setup Globals
public static JPanel panelInnerFrame = new JPanel();
public static JDesktopPane desktop = new JDesktopPane();
public static int internalFrameCounter;
public static int xOffset = 15, yOffset = 15, offSetIncrease = 15;//Windows position offset
public static JMenuBar menuTop = new JMenuBar();
public static JMenu apps = new JMenu();
public static JMenuItem fontApp, imageApp = new JMenuItem();
public Test100()
{
panelMaker(); //Make our panel
menuBuilder(); //Call menu builder to build our menu
}
public void panelMaker()
{
//Desktop Pane, this is like a virtual desktop within our pane
desktop = new JDesktopPane();
//Set Desktop Pane to act as our Content Pane
setContentPane (desktop);
//Set properties of our window
setTitle ("Test100");
setSize (1024, 768);
setVisible (true);
//Create a new JPanel,this will sit in the innerframe, we can add things here.
panelInnerFrame = new JPanel();
}
//Method - menuBuilder - A method to build JMenus
public void menuBuilder()
{
//Create a new menu bar
JMenuBar menuTop = new JMenuBar();
setJMenuBar (menuTop); //We need to use the setJMenuBar with a JDesktopPane()
//Add a JMenu
JMenu apps = new JMenu("Apps");
menuTop.add (apps); //Add Jmenu to the menu bar
//Add JMenu Item
JMenuItem fontApp = new JMenuItem("Font App");
apps.add (fontApp); //Add Menu items to our JMenu
//Add JMenu Item
JMenuItem imageApp = new JMenuItem("Image App");
apps.add (imageApp); //Add Menu items to our JMenu
//Add listeners
fontApp.addActionListener (this);
imageApp.addActionListener (this);
}
//Method - frameFontMaker - A method used to build an internal frame displaying fonts
public void frameFontMaker()
{
//Internal Frame, this is our floating box, it sits on our virtual desktop and takes multiple arguments
JInternalFrame innerframe = new JInternalFrame
( "Font App", //frame name
true, //resizable
true, //closable
true, //maximizable
true //iconifiable
);
//Set properties of our innerframe
innerframe.setSize (300, 300);
innerframe.setVisible (true);
innerframe.setLocation (xOffset, yOffset);
//Add a JPanel to our innerframe
innerframe.add (panelInnerFrame);
//Add the innerframe to the desktop
desktop.add (innerframe);
}
//Method - frameImageMaker - A method used to build an internal frame displaying images
public void frameImageMaker()
{
//Internal Frame, this is our floating box, it sits on our virtual desktop and takes multiple arguments
JInternalFrame innerframe = new JInternalFrame
( "Image App", //frame name
true, //resizable
true, //closable
true, //maximizable
true //iconifiable
);
//Set properties of our innerframe
innerframe.setSize (300, 300);
innerframe.setVisible (true);
innerframe.setLocation (xOffset, yOffset);
//Add a JPanel to our innerframe
innerframe.add (panelInnerFrame);
//Add the innerframe to the desktop
desktop.add (innerframe);
}
public void actionPerformed (ActionEvent e)
{
//If fontApp menu item selected
if (e.getSource() == fontApp)
{
frameFontMaker();
//System.out.println ("Test");
}
//If imageApp menu item selected
if (e.getSource() == imageApp)
{
frameImageMaker();
//System.out.println ("Test");
}
}
public static void main (String[] args)
{
new Test100();
}//End Main
}//End Class
これは、なぜ私がnoobであるために頻繁にdownvotedになっても、スタックオーバーフローになる理由です。 – Ninja2k
@ Ninja2k:うまくいきましたが、もっと重要なのは、元のコードがうまくいかなかった理由を今理解できますか?これをやり直すのを避けるためには、概念を理解する必要があります。 –
はい、私は本質的に、グローバルとローカルの2つのオブジェクトを作成し、ローカルのブランクオブジェクトを参照していました。 – Ninja2k