2014-02-16 54 views
1

看看這個簡單的代碼:的Java按鈕重繪

Main.java:

package CarManager; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class Main extends JFrame { 

    private static final long serialVersionUID = 1L; 
    static int width = 400; 
    static int height = width/16 * 9; 
    static String title = "Car Manager"; 
    JButton viewTables = new JButton("View tables"); 
    JButton clients = new JButton("Clients"); 
    JButton search = new JButton("Search"); 
    JButton viewCars = new JButton("View all"); 
    JButton viewRent = new JButton("Rent a car"); 
    JButton viewBuy = new JButton("Buy a car"); 
    JButton viewAccessory = new JButton("Accessory"); 

    public Main() { 

     setLayout(null); 
     setLocationRelativeTo(null); 
     setTitle(title); 
     setSize(width, height); 
     setResizable(false); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 

     JLabel background = new JLabel(new ImageIcon("res\\background2.jpg")); 
     add(background); 
     background.setSize(width, height); 
     add(viewTables); 
     add(clients); 
     add(search); 
     viewTables.setBounds(20, 20, 110, 30); 
     clients.setBounds(20, 70, 110, 30); 
     search.setBounds(20, 120, 110, 30); 

     viewTables.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       add(viewCars); 
       viewCars.setBounds(260, 20, 110, 20); 

       add(viewRent); 
       viewRent.setBounds(260, 50, 110, 20); 

       add(viewBuy); 
       viewBuy.setBounds(260, 80, 110, 20); 

       add(viewAccessory); 
       viewAccessory.setBounds(260, 110, 110, 20); 
      } 
     }); 

     viewCars.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       View view = new View(); 
       view.addWindowListener(new WindowPlug(Main.this)); 
       setVisible(false); 
      } 
     }); 

    } 

    public static void main(String args[]) { 
     new Main(); 
    } 
} 

View.java:

package CarManager; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class View extends JFrame { 

    private static final long serialVersionUID = 1L; 
    int width = 400; 
    int height = width/16 * 9; 
    String title = "View all Cars"; 

    public View() { 
     setLayout(null); 
     setLocationRelativeTo(null); 
     setTitle(title); 
     setSize(width, height); 
     setResizable(false); 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     setVisible(true); 
     JLabel background = new JLabel(new ImageIcon("res\\background2.jpg")); 
     add(background); 
     background.setSize(width, height); 
    } 
} 

和WindowPlug.java:

package CarManager; 

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

public class WindowPlug extends WindowAdapter { 

    private Main mainFrame; 

    public WindowPlug(Main mainFrame) { // when creating an instance of this 
             // WindowAdapter, tell it with which 
             // Main Window you are working with 
     this.mainFrame = mainFrame; 
    } 

    public void windowClosing(WindowEvent e) { 
     mainFrame.setVisible(true); 
     mainFrame.revalidate(); 
    } 
} 

當我點擊查看錶,然後查看所有(這些是埠現在工作的ttons) 第一個窗口隱藏並出現一個新窗口,現在,當我關閉第二個窗口時,第一個窗口看起來可見,但按鈕不可見,我必須用鼠標懸停以便它們可見再次。香港專業教育學院試圖mainFrame.revalidate();

mainFrame.repaint(); 

,但使用的是Windows與您的代碼8.1親

+0

請參閱編輯回答。請指出你已閱讀我的答案。我有更多的東西可以補充,但如果沒有意義的話,沒有什麼意義。 –

回答

1

一個問題沒有結果 IM,我不知道這是主要的問題,因爲你的代碼工作在我的系統上細,是否在之前在主窗口上致電setVisible(true),您已添加了所有組件。只有在已添加所有組件後,才應將其稱爲

無關,你的主要問題,其他問題:

  • 您應該避免使用空佈局。儘管使用空佈局似乎是一個新手創建複雜的GUI的更好方法,但這是一個謬論,而且您創建Swing GUI的時候越多,您越能學會尊重和使用佈局管理器,並看到這些生物幫助您創建靈活,美觀如果需要的話,可以使用複雜的GUI。然後,您可以通過在設置可見之前調用pack()來適當調整它們的大小。
  • 看來,你真的想使用CardLayout交換意見一個GUI,而不是隨地吐痰多個GUI的在用戶。
  • 如果你絕對必須顯示一個對話窗口,那麼你應該使用一個JDialog,而不是一個JFrame。如果您使用了模態JDialog,則不需要WindowListener。

編輯

  • OK,一個很大的問題,我看到的是,你正在使用空佈局和增加覆蓋整個的contentPane一個JLabel,然後將組件添加到同contentPane中。
  • 取而代之,使JLabel成爲您的contentPane,然後將您的JButton等添加到
  • 但請確保JLabel的opaque屬性先設置爲true。

編輯2
如果您需要使用的圖像作爲背景圖像,您可以:

  • 將該圖片放到一個ImageIcon,把圖標在JLabel和再次使用JLabel作爲您的contentPane。再次,您需要通過調用setOpaque(true)來使JLabel不透明。如果您不想更改圖像或窗口的大小,這很有效。
  • 如果您確實需要更改圖像的大小,最好讓JPanel在其paintComponent(Graphics g)方法中繪製圖像,然後使用此JPanel作爲您的contentPane。
  • 一旦你創建了你的contentPane,然後設置它的佈局並添加你的組件。
  • 然後調用setContentPane(newContentPane)您的頂層窗口,並通過新的contentPane。
+0

woooooow,不不不不不,謝謝如何形成一個程序,但現在我看到什麼錯的所有其他提示:d 第一按鈕繪製,然後背景:d ,這就是爲什麼它適用於所有的人,但我的: d 沒有人有背景,但我:d 我帶一點如何佈局使用提示程序,但現在我該如何設置,如果有這樣的事情AZ指數? – Shago

+0

@ user3316177:看**編輯2 **。 –