2017-11-01 12 views
0

私はフレームを使用してクラスを持っているとのJPanelを削除します。ここに私はパネルを持ってJButtonの[JAVA]

import java.awt.*; 
import javax.swing.*; 

public class Menu_Frame extends JFrame{ 

    Menu_Panel menu_panel = new Menu_Panel(); 

    public Menu_Frame(){ 
     Toolkit kit = Toolkit.getDefaultToolkit();  
     Dimension screenSize = kit.getScreenSize(); 
     int screenHeight = screenSize.height; 
     int screenWidth = screenSize.width; 

     setExtendedState(JFrame.MAXIMIZED_BOTH); 
     setPreferredSize(new Dimension(screenWidth, screenHeight)); 
     setLocationByPlatform(true); 
     getContentPane().add(menu_panel); 
    } 
} 

import java.awt.*; 
import javax.swing.*; 
public class Menu_Panel extends JPanel{ 

    Play_Button play = new Play_Button(); 

    public Menu_Panel() { 

     Toolkit kit = Toolkit.getDefaultToolkit();  
     Dimension screenSize = kit.getScreenSize(); 
     int screenHeight = screenSize.height; 
     int screenWidth = screenSize.width; 
     setLayout(new BorderLayout()); 

     setSize(screenWidth, screenHeight); 
     setLocation(0,0); 
     setBackground(Color.BLACK); 

     add(play); 
    } 
} 

そして、ここで私は、ボタンのクラスがあります。

public class Play_Button extends JButton implements ActionListener{ 

    private static final long serialVersionUID = -5408317246901761857L; 

    protected int size_x = 150; 
    protected int size_y = 75; 
    protected int location_x = 0; 
    protected int location_y = 0; 

    Font f= new Font("Helvetica", Font.BOLD, 30); 
    String title = "PLAY"; 

    Menu_Frame frame; 
    Menu_Panel menu; 

    public Play_Button() { 

     setFont(new Font("Helvetica", Font.BOLD, 25)); 
     setText(title); 

     Toolkit kit = Toolkit.getDefaultToolkit();  
     Dimension screenSize = kit.getScreenSize(); 
     location_x = (screenSize.height/2)+180; 
     location_y = screenSize.width/5; 

     setBorder(new RoundedBorder(20)); 
     setSize(size_x,size_y); 
     setLocation(location_x,location_y); 
     setBackground(Color.BLACK); 
     setForeground(Color.RED); 
     setFocusPainted(false); 
     setBorderPainted(false); 
     setContentAreaFilled(false); 
     setVisible(true); 

     JPanel panel = new JPanel(); 
     panel.setSize(100,100); 
     panel.setLocation(100, 100); 
     panel.setBackground(Color.GREEN); 
     panel.setVisible(true); 

     addActionListener(this); 

     addMouseListener(new MouseAdapter() { 
      public void mouseEntered(MouseEvent e){ 
       setBorderPainted(true); 
       setForeground(Color.RED); 

      } 
      public void mouseExited(MouseEvent e){ 
       setBorderPainted(false); 
      } 
     }); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     frame.getContentPane().remove(menu); 
    } 
} 

最後に、私はplay_buttonの境界の周りのクラスを持っています:

import java.awt.Component; 
import java.awt.Graphics; 
import java.awt.Insets; 

import javax.swing.border.Border; 

public class RoundedBorder implements Border { 

    private int radius; 


    RoundedBorder(int radius) { 
     this.radius = radius; 
    } 


    public Insets getBorderInsets(Component c) { 
     return new Insets(this.radius+1, this.radius+1, this.radius+2, this.radius); 
    } 


    public boolean isBorderOpaque() { 
     return true; 
    } 
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { 
     g.drawRoundRect(x, y, width-1, height-1, radius, radius); 
    } 
} 

今、ボタンをクリックするとパネルが消えず、理由がわかりません。 setVisible(false)を使ってCarLayoutを試してみましたが、うまくいきません。どうすれば修正できますか?

+0

ではない私がよう、 'ツールキット#getScreenSize'を使用しないことをこの方法をアドバイスうタスクバーやドックのような追加のOS要素は考慮されていません。一般的なユーザの推奨事項として、メインフレームのサイズを設定しないでください。代わりに、好ましいサイズをパックされたサイズにして、 'setExtendedState'を使用してOSを最大に拡張してください。 – MadProgrammer

+0

' setSize'、 'setBounds '、' setLocation'は、コンポーネントがレイアウトマネージャの制御下に置かれている間はすべて無関係です。また、コンポーネントはデフォルトで表示されます – MadProgrammer

+0

あなたの質問に対する最も一般的な答えは、「[CardLayout'](https://docs.oracle.com/javase/tutorial/uiswing/layout/card.html)を使用して、 – MadProgrammer

答えて

0

Preambule ...

それは考慮にタスクバーやドックなどの追加的なOS要素を取らないように私は、Toolkit#getScreenSizeこの方法を使用しないことをアドバイスします。一般ユーザの勧告として、代わりに単に推奨サイズは梱包サイズにすることができ、メインフレームのサイズを設定し、それはあなたが持っているようにsetExtendedStateを使用してOSの最大だとフレームを展開しません

setSizesetBoundssetLocationコンポーネントはレイアウトマネージャの管理下にありますが、すべて無関係です。また、コンポーネントはデフォルトで表示されます。

コア...成分を除去

は、一つの追加の反対側(NO、真剣)です。コンポーネントを含むコンテナにremoveを呼び出し、削除するコンポーネントの参照を渡します。 UIの更新が完了したら、コンテナのrevalidaterepaintを呼び出して、レイアウトとペイント・パスをトリガーします。

一般的に言えば、CardLayoutを使用する方がはるかに優れており、異なるビュー間を簡単に切り替えることができます。

は詳細

0

問題が

public void actionPerformed(ActionEvent e) 
{ 
    frame.getContentPane().remove(menu); 
} 

framemenuPlay_Buttonのフィールドを宣言されていますが、プリントアウトした場合は何も

に設定されることはありませんあなたのactionPerformed方法であるためHow to Use CardLayoutを参照してください。彼らは何であるか、彼らはnullでなければなりません

あなたは、ボタンを作成すると、これらの二つのフィールドを設定してください:これは働くかもしれないが

Menu_Panel menu_panel = new Menu_Panel(); 
menu_panel.play.menu = menu_panel; 
menu_panel.play.frame = this; 

を、それは素晴らしいプログラムの流れ