簡體   English   中英

如何通過單擊Java Swing中JMenuBar的另一個子菜單來清除JFrame區域?

[英]How to clear JFrame area by clicking another sub menu of JMenuBar in java Swing?

通過單擊主菜單的子菜單(sub_menu_purchase和sub_menu_sale)可以清除“框架”區域中的代碼。

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();
          }

     }

但是尚不清楚該區域是否彼此覆蓋。 我應該寫什么代碼?

我會做很多與您正在做的事情不同的事情,包括

  • 不要通過getGraphics()獲得組件的Graphics。 這樣獲得的Graphics對象將不會持久存在,因此對於穩定更改GUI的外觀沒有用。
  • 不要清除GUI的圖形 ,而要更改視圖 即使您的代碼可以工作,組件也不會隨您的代碼一起從GUI中刪除。 它們仍然存在並且仍然位於GUI上-不好。
  • CardLayout可以很好地用於允許您交換容器的視圖,並且經常用於交換JPanels,每個JPanels都有自己的GUI。
  • 避免使用null布局並使用setBounds(...)因為這將導致創建GUI,這是升級和維護的“女巫”,並且在除一個平台之外的所有平台上看起來都很糟糕。 更好地嵌套JPanels,每個JPanels使用其自己的簡單布局,以實現復雜,美觀,易於維護和改進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();
         }
      });
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM