2014-07-05 94 views
1

我是Java新手,並且有一些關於swing的問題。當用戶通過菜單欄調用時,我需要一個具有一些內部框架的應用程序。我無法訪問java中的對象

import java.awt.Color; 

import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class uygulama { 

public static void main(String[] args) { 

    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 

      JFrame frame = new JFrame("uygulama adı"); 

      JDesktopPane desktop = new JDesktopPane(); 
      frame.add(desktop); 

      menubar mb = new menubar(); //Jmenubar inst. 
      frame.setJMenuBar(mb); 

      frame.setBounds(300,100,500,300); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 
      System.out.println(desktop.getTopLevelAncestor()); 

     } 
    }); 
    } 

} 

在上面的代碼(偵聽器代碼塊)中;我不能訪問'桌面'對象。如果可以的話,我會使用'desktop.add()'添加一個JInternalFrame。

import java.awt.Desktop; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JInternalFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JOptionPane; 
import javax.swing.JPopupMenu; 


public class menubar extends JMenuBar { 

    JMenu Dosya; 
    JMenuItem DosyaItem; 

    menubar() { 
     Dosya = new JMenu("Dosya"); 


     DosyaItem = new JMenuItem("Dosya1"); 
     DosyaItem.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       //desktop. here is the problem 
      System.out.println(); 
      } 
     }); 
     Dosya.add(DosyaItem); 
     add(Dosya); 


    } 

} 
+0

'desktop'變量位於匿名內部類中,因此它只能在該範圍內引用。您需要將該變量放在公共可訪問的範圍內。 –

回答

1

你可以傳遞的JDesktopPane到JMenuBar類的:

 JDesktopPane desktop = new JDesktopPane(); 
     frame.add(desktop); 

     menubar mb = new menubar(desktop); // pass in the reference 

然後在菜單欄類:

public class menubar extends JMenuBar { 
    private JDesktopPane desktop; 

    JMenu Dosya; 
    JMenuItem DosyaItem; 

    menubar (JDesktopPane desktop) { 
     this.desktop = desktop; 
     Dosya = new JMenu("Dosya"); 

這樣的菜單欄有顯示的JDesktopPane

參考

一些附註:

  • 您將需要學習並遵守Java命名約定。類名應該全部以大寫字母開頭,方法名和變量名以小寫字母開頭。按照這個和其他人將能夠更好地遵循你的代碼。
  • 我不確定爲什麼你的菜單欄類擴展了JMenuBar,因爲它沒有覆蓋這個類的任何方法。
  • 您在主要方法正在啓動的Runnable中有太多的代碼。您可能希望將大部分代碼放入類中,並將其從靜態領域中移出。
+0

那麼我應該改變最終的修飾符? [鏈接](http://s27.postimg.org/ntxoxn3ar/aaa.png) – fuatkaraca

+0

@ user2778565:final幾乎總是一個很好的修飾符來使用。如果你需要在構造函數的匿名內部使用它,那麼是的,它需要是最終的參數。 –

+0

現在我的程序運行。謝謝。 我的菜單欄擴展了jmenubar,因爲我想簡單地使用我的代碼。縮短主要方法 – fuatkaraca