2017-04-23 4 views
0

JDesktopPaneをボタンのトリガーで非表示にしたいと考えました。しかし、これは自分自身を隠すことはありません。私はフレームを隠し、actionPerformedでこれを呼び出す静的voidメソッドを作成しました。フレームを隠すために別のEDTを実行する必要がありますか?どのようなヒントも高く評価されます。JDesktopPaneはフレームを非表示にしません

import java.awt.Dimension; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.SwingUtilities; 

public class JDesktoppane extends JFrame 
{ 
JDesktopPane desktop; 
JMenu menu; 

public JDesktoppane() 
{ 
    super("TITLE"); 
    int inset = 80; 
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

    setBounds(inset, inset, 
      screenSize.width - inset*2, 
      screenSize.height - inset*2); 

    //Set up the GUI 
    desktop = new JDesktopPane(); 
    //Setting JDesktopPane as Container 
    setContentPane(desktop); 
    setJMenuBar(createMenuBar()); 
    //Make dragging a little faster but perhaps uglier. 
    desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); 
} 

public JMenuBar createMenuBar() 
{ 
    JMenuBar bar = new JMenuBar(); 

    menu = new JMenu("CLICK ME"); 

    JMenuItem item = new JMenuItem("CLICK ME AGAIN"); 
    item.addActionListener(listener); 
    menu.add(item); 

    bar.add(menu); 


    return bar; 
} 

ActionListener listener = new ActionListener() 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     createFrame(); 
    } 
}; 

public void createFrame() 
{ 
    InternalFrame frame = new InternalFrame(); 
    frame.setVisible(true); 
    desktop.add(frame); 
} 

public static void createAndShowGUI() 
{ 
    JDesktoppane p = new JDesktoppane(); 
    p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    p.setVisible(true); 
} 

public static void hideGUI() 
{ 
    JDesktoppane p = new JDesktoppane(); 
    p.setVisible(false); 
} 

public static void main(String[] args) 
{ 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 

} 

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JInternalFrame; 
import javax.swing.JPanel; 

public class InternalFrame extends JInternalFrame 
{ 
public InternalFrame() 
{ 
    addComponentsToPane(getContentPane()); 
    pack(); 
} 

ActionListener listener = new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     JDesktoppane.hideGUI(); 
    } 
}; 

private void addComponentsToPane(final Container pane) 
{ 
    JPanel panel = new JPanel(); 
    panel.setLayout(new BorderLayout()); 
    JButton btn = new JButton("HIDE ME"); 
    btn.addActionListener(listener); 
    panel.add(btn); 
    pane.add(panel); 
} 
} 

答えて

1

hideGUIでは、新しいウィンドウを作成して、隠れているもの:

public static void hideGUI() 
{ 
    // creating a new window 
    JDesktoppane p = new JDesktoppane(); 
    p.setVisible(false); 
} 

私はあなたがInternalFrameあなたがcreateAndShowGUIに作成元のウィンドウへの参照を与えて何とかやっていることを意味するものだと思います。

public class InternalFrame extends JInternalFrame 
{ 
    JDesktoppane parent; 

    public InternalFrame(JDesktoppane parent) 
    { 
     this.parent = parent; 

     addComponentsToPane(getContentPane()); 
     pack(); 
    } 

    ActionListener listener = new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      // note 
      parent.setVisible(false); 
     } 
    }; 
    ... 
} 

そして:内部ペインがその親を隠しボタンを持っているため

public void createFrame() 
{ 
    //          vvvv 
    InternalFrame frame = new InternalFrame(this); 
    frame.setVisible(true); 
    desktop.add(frame); 
} 

それは、しかし少し奇妙だ

あなたはこのような何かを行うことができます。より慣用的なやり方としては、JMenuBarなどのオプションを持つオプションがあります。 (ウィンドウを元に戻す計画はありますか?通常、ウィンドウを隠す場合は最小化するだけです)。

+0

ありがとう!それは実際に働いています。私は窓を隠すときにそれを混乱させました。ボタンをJMenuに変更します。 :) – Francisunoxx

関連する問題