2013-07-21 60 views
2

該代碼用於通過單擊主菜單的子菜單(sub_menu_purchase和sub_menu_sale)來清除Frame區域。如何通過單擊Java Swing中的另一個JMenuBar子菜單來清除JFrame區域?

public void clear() 
    { 

     Graphics g = getGraphics(); 

     Dimension d = getSize(); 

     g.setColor(Color.WHITE); 

     g.fillRect(0,0,d.width,d.height); 


    } 
void sale() 
    { 
     lblinvoice =new JLabel("Invoice No. : "); 
     lbldate =new JLabel("Date : "); 
     lblform =new JLabel("From Party : "); 
     lblto =new JLabel("To Party : "); 

     txtto=new JTextField(); 
     txtfrom=new JTextField(); 

     btncancel=new JButton("Cancel"); 
     btnprint=new JButton("Print"); 
     btnreset=new JButton("Reset"); 
     btnsave=new JButton("Save"); 

     lblinvoice.setBounds(50,100,80,25); 
     lbldate.setBounds(440,100,80,25); 
     lblto.setBounds(50,135,80,25); 
     txtto.setBounds(140,135,200,25); 
     lblform.setBounds(50,170,80,25); 
     txtfrom.setBounds(140,170,100,25); 
     btnreset.setBounds(50,450,80,25); 
     btnsave.setBounds(140,450,80,25); 
     btnprint.setBounds(230,450,80,25); 
     btncancel.setBounds(420,450,80,25); 

     add(lblinvoice); 
      add(lbldate); 
      add(lblto); 
       add(lblform); 
       add(txtto); 
       add(txtfrom); 
       add(btncancel); 
       add(btnprint); 
      add(btnreset); 
     add(btnsave); 

     setVisible(true); 

    } 
void purchase() 
    { 
     lblinvoice =new JLabel("Invoice No. : "); 
     lbldate =new JLabel("Date : "); 
     lblparty =new JLabel("Party Name: "); 

     txtparty=new JTextField(); 

     btncancel=new JButton("Cancel"); 
     btnprint=new JButton("Print"); 
     btnreset=new JButton("Reset"); 
     btnsave=new JButton("Save"); 

     lblinvoice.setBounds(50,100,80,25); 
     lbldate.setBounds(440,100,80,25); 
     lblparty.setBounds(50,135,80,25); 
     txtparty.setBounds(140,135,200,25); 
     btnreset.setBounds(50,450,80,25); 
     btnsave.setBounds(140,450,80,25); 
     btnprint.setBounds(230,450,80,25); 
     btncancel.setBounds(420,450,80,25); 

     add(lblinvoice); 
      add(lbldate); 
      add(lblparty); 
       add(txtparty); 
       add(btncancel); 
       add(btnprint); 
      add(btnreset); 
     add(btnsave); 

     setVisible(true); 

    } 
public void actionPerformed(ActionEvent event) //set up actionlistening 
     { 
      Object source=event.getSource(); 
      if (source.equals(sub_menu_purchase)) 
      { clear(); 
       purchase(); 
      } 
      if (source.equals(sub_menu_sale)) 
      { clear(); 
       sale(); 
      } 

    } 

但它並不清楚該區域並相互覆蓋。 我應該寫什麼代碼?

+0

見編輯回答了可運行的例子。 –

回答

4

有很多,我會做不同於你在做什麼,包括

  • 不要通過getGraphics()得到一個組件的圖形。這樣獲得的Graphics對象不會持久化,因此對GUI的外觀做出穩定的改變並不有用。
  • 不要清除GUI的圖形而是更改視圖。即使您的代碼正常工作,組件也不會被您的代碼從GUI中刪除。他們仍然存在,仍然坐在GU​​I上 - 不好。
  • CardLayout可以很好地支持您交換容器的視圖,並且通常用於交換JPanels,每個JPanel都擁有自己的GUI。
  • 避免空佈局和使用setBounds(...),因爲這將導致GUI的創建,這是一個「巫婆」升級和維護,並且在除了一個之外的所有平臺上看起來都很糟糕。更好地嵌套JPanel,每個都使用自己的簡單佈局,以實現複雜,美觀和易於維護並改進GUI。
  • 閱讀/學習Swing教程,因爲所有這些在這裏都有很好的解釋。

例如:

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Component; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class UglyGui2 { 
    private static final String SALE = "Sale"; 
    private static final String PURCHASE = "Purchase"; 

    private JMenuItem sub_menu_sale = new JMenuItem(SALE); 
    private JMenuItem sub_menu_purchase = new JMenuItem(PURCHASE); 
    private CardLayout cardLayout = new CardLayout(); 
    private JPanel cardPanel = new JPanel(cardLayout); 
    private JPanel mainPanel = new JPanel(new BorderLayout(5, 5)); 

    public UglyGui2() { 
     cardPanel.add(new JLabel(), ""); 
     cardPanel.add(createSalePanel(), SALE); 
     cardPanel.add(createPurchasePanel(), PURCHASE); 

     JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0)); 
     buttonPanel.add(new JButton("Reset")); 
     buttonPanel.add(new JButton("Save")); 
     buttonPanel.add(new JButton("Print")); 
     buttonPanel.add(new JLabel()); 
     buttonPanel.add(new JButton("Cancel")); 

     mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     mainPanel.add(cardPanel, BorderLayout.CENTER); 
     mainPanel.add(buttonPanel, BorderLayout.PAGE_END); 

    } 

    private JComponent createSalePanel() { 
     JPanel salePanel = new JPanel(new GridBagLayout()); 
     salePanel.add(new JLabel("Sales")); 
     salePanel.add(new JTextField(10)); 
     return salePanel; 
    } 

    private JComponent createPurchasePanel() { 
     JPanel topPanel = new JPanel(); 
     topPanel.add(new JLabel("Purchases")); 
     topPanel.add(new JTextField(10)); 

     JPanel purchasePanel = new JPanel(new BorderLayout()); 
     purchasePanel.add(topPanel, BorderLayout.PAGE_START); 
     purchasePanel.add(new JScrollPane(new JTextArea(30, 60)), BorderLayout.CENTER); 
     return purchasePanel; } 

    private Component getMainPanel() { 
     return mainPanel; 
    } 

    private JMenuBar getJMenuBar() { 
     ActionListener aListener = new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      cardLayout.show(cardPanel, e.getActionCommand()); 
     } 
     }; 

     sub_menu_purchase.addActionListener(aListener); 
     sub_menu_sale.addActionListener(aListener); 

     JMenu menu = new JMenu("Menu"); 
     menu.add(sub_menu_purchase); 
     menu.add(sub_menu_sale); 

     JMenuBar menuBar = new JMenuBar(); 
     menuBar.add(menu); 
     return menuBar; 
    } 

    private static void createAndShowGui() { 
     UglyGui2 uglyGui = new UglyGui2(); 

     JFrame frame = new JFrame("Ugly Gui Example"); 
     frame.setJMenuBar(uglyGui.getJMenuBar()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(uglyGui.getMainPanel()); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
相關問題