2012-02-23 8 views

答えて

3

私は期待通りの作品は、あなたがJInternalFrame#isIconifiable()をチェックする必要が(eeerghtこの拒否権は****本当にある)

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import java.beans.PropertyVetoException; 
import javax.swing.*; 
import javax.swing.plaf.basic.*; 

public class InternalFrameUnMovable extends JFrame { 

    private static final long serialVersionUID = 1L; 
    public JDesktopPane desktop; 

    public InternalFrameUnMovable() { 
     desktop = new JDesktopPane(); 
     getContentPane().add(desktop); 
     desktop.add(createInternalFrame(1, Color.RED)); 
     desktop.add(createInternalFrame(2, Color.GREEN)); 
     desktop.add(createInternalFrame(3, Color.BLUE)); 
    } 

    private JInternalFrame createInternalFrame(int number, Color background) { 
     JInternalFrame internal = new JInternalFrame("Frame" + number, true, true, true, true); 
     internal.setBackground(background); 
     internal.setVisible(true); 
     int location = 50 * number; 
     internal.setBounds(location, location, 300, 300); 
     return internal; 
    } 

    public static void main(String args[]) throws PropertyVetoException { 
     InternalFrameUnMovable frame = new InternalFrameUnMovable(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setSize(600, 600); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     try {// Activate first internal frame 
      JInternalFrame[] frames = frame.desktop.getAllFrames(); 
      frames[0].setSelected(true); 
     } catch (java.beans.PropertyVetoException e) { 
     } 
     JInternalFrame[] frames = frame.desktop.getAllFrames();// Make first internal frame unmovable 
     for (int i = 0; i < frames.length; i++) { 
      JInternalFrame f = frames[i]; 
      if (f.isIconifiable()) { 
       f.setIcon(true); 
      } 
     } 
     /*JInternalFrame f = frames[0]; 
     BasicInternalFrameUI ui = (BasicInternalFrameUI) f.getUI(); 
     Component north = ui.getNorthPane(); 
     //MouseMotionListener[] actions = (MouseMotionListener[]) north.getListeners(MouseMotionListener.class); 
     MouseMotionListener[] actions = north.getListeners(MouseMotionListener.class); 
     for (int i = 0; i < actions.length; i++) { 
     north.removeMouseMotionListener(actions[i]); 
     }*/ 
    } 
} 
+0

1あなたの例で暗黙のうちに '再描画を()'呼び出します。 OPの結果を説明するかもしれませんか? – trashgod

+0

@trashgod私はあなたの質問に答えることができません、私は木のための森林を見ることができません、私はデスクトップAPIの唯一の観光客です(この場合)私はEDTの作品も、奇跡が再描画)がデスクトップに実装されました:-)、 – mKorbel

+0

奇跡はありません。私は誤解しました。 – trashgod

2

方法getAllFrames()は、「アイコン化フレームだけでなく、拡張されたフレームを返します。 " Mac OS Xでは、アイコン化されたフレームは無視されることがあります。以下の例は、異常を示し、補正するためにList<JInternalFrame>を採用しています。

Normal iconified

import java.awt.*; 
import java.awt.event.*; 
import java.beans.PropertyVetoException; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.*; 

/** 
* @see http://stackoverflow.com/q/9414728/230513 
* @see http://stackoverflow.com/a/9415197/230513 
*/ 
public class InternalFrameCount extends JFrame { 

    private static final int SIZE = 300; 
    private static final String ICONIFY = "Iconify"; 
    private static final String RESTORE = "Restore"; 
    private static final String COUNT = "Count:"; 
    private JDesktopPane desktop = new JDesktopPane(); 
    private JLabel count = new JLabel(COUNT); 
    private List<JInternalFrame> list = new ArrayList<JInternalFrame>(); 

    public InternalFrameCount() { 
     desktop.add(createInternalFrame(1, Color.RED)); 
     desktop.add(createInternalFrame(2, Color.GREEN)); 
     desktop.add(createInternalFrame(3, Color.BLUE)); 
     this.add(desktop); 
     JPanel panel = new JPanel(); 
     panel.add(new JButton(new ButtonAction(ICONIFY))); 
     panel.add(new JButton(new ButtonAction(RESTORE))); 
     panel.add(count); 
     this.add(panel, BorderLayout.SOUTH); 
     count.setText(COUNT + desktop.getAllFrames().length); 
    } 

    private class ButtonAction extends AbstractAction { 

     private boolean iconify; 

     public ButtonAction(String name) { 
      super(name); 
      iconify = ICONIFY.equals(name); 
     } 

     @Override 
     public void actionPerformed(ActionEvent ae) { 
      for (JInternalFrame jif : list) { 
       try { 
        jif.setIcon(iconify); 
       } catch (PropertyVetoException e) { 
        e.printStackTrace(System.err); 
       } 
      } 
      count.setText(COUNT + desktop.getAllFrames().length); 
     } 
    } 

    private JInternalFrame createInternalFrame(int number, Color background) { 
     JInternalFrame jif = new JInternalFrame(
      "F" + number, true, true, true, true); 
     list.add(jif); 
     jif.setBackground(background); 
     int topLeft = SIZE/10 * number; 
     jif.pack(); 
     jif.setBounds(topLeft, topLeft, SIZE/2, SIZE/2); 
     jif.setVisible(true); 
     return jif; 
    } 

    public static void main(String args[]) throws PropertyVetoException { 
     System.out.println(System.getProperty("os.name")); 
     System.out.println(System.getProperty("java.runtime.version")); 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       InternalFrameCount frame = new InternalFrameCount(); 
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setSize(SIZE, SIZE); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

この結果の確認や反論を歓迎します。 – trashgod

+0

私は+1を受けましたが、ベートがなぜそこにいるのか理解しましたか? – mKorbel

+0

私を狂っている[ここ](http://today.java.net/pub/a/today/2008/08/21/complex-table-cell-rendering.html)や[ツリー拡張リスナーを書く方法](http://docs.oracle.com/javase/tutorial/uiswing/events/treeexpansionlistener.html) – mKorbel

関連する問題