2011-02-22 63 views
3

我有一个JDesktopPane其中包含一些JInternalFrame s。我希望能够将任何JInternalFrame放在前面,覆盖任何其他活动框架。我发现了许多代码示例来执行此操作,但似乎没有任何工作 - 该框架不会在其他活动的JInternalFrame之上。例如。将JInternalFrame带到前面

 
public static void moveToFront(final JInternalFrame fr) { 
     if (fr != null) { 
      processOnSwingEventThread(new Runnable() { 
       public void run() { 
        fr.moveToFront(); 
        fr.setVisible(true); 
        try { 
         fr.setSelected(true); 
         if (fr.isIcon()) { 
          fr.setIcon(false); 
         } 
         fr.setSelected(true); 
        } catch (PropertyVetoException ex) { 
         ex.printStackTrace(); 
        } 
        fr.requestFocus(); 
        fr.toFront(); 
       } 
      }); 
     } 
    } 

回答

5

根据API toFront或moveToFront应该工作(虽然toFront看起来是从我的API读取两个更好)。这些JInternalFrame坐在JDesktopPane中吗?根据你的帖子,它似乎是。我想知道这个错误是否在别处。

考虑创建并发布一个SSCCE(请点击链接),这是一个小型可编译,可运行的程序,展示了您解决此问题的最佳尝试。然后我们可以检查你的代码,运行它,修改它,最好能够帮助你修复它。

这是我的一个SSCCE的示例:,结果发现我没有必须的setSize一个呼叫(W,H)在创建帧时

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.util.Random; 

import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class InternalFrameToFront extends JPanel { 
    private static final int FRAME_MAX = 21; 
    private static final int DT_WIDTH = 700; 
    private static final int DT_HEIGHT = 500; 
    private static final Dimension DESKTOP_SIZE = new Dimension(DT_WIDTH, DT_HEIGHT); 
    private static final int IF_WIDTH = 150; 
    private static final int IF_HEIGHT = 100; 
    private static final Dimension INT_FRAME_SIZE = new Dimension(IF_WIDTH, IF_HEIGHT); 
    private Random random = new Random(); 
    private JInternalFrame[] internalFrames = new JInternalFrame[FRAME_MAX]; 

    public InternalFrameToFront() { 
     JDesktopPane desktop = new JDesktopPane(); 
     desktop.setPreferredSize(DESKTOP_SIZE); 
     for (int i = 0; i < internalFrames.length; i++) { 
     JInternalFrame intFrame = new JInternalFrame("Frame Number " + i); 
     intFrame.setSize(INT_FRAME_SIZE); 
     int x = random.nextInt(DT_WIDTH - IF_WIDTH); 
     int y = random.nextInt(DT_HEIGHT - IF_HEIGHT); 
     intFrame.setLocation(x, y); 
     intFrame.setVisible(true); 
     desktop.add(intFrame); 

     internalFrames[i] = intFrame; 
     } 

     JSlider slider = new JSlider(0, FRAME_MAX - 1, 0); 
     slider.setMajorTickSpacing(5); 
     slider.setMinorTickSpacing(1); 
     slider.setPaintLabels(true); 
     slider.setPaintTicks(true); 
     JPanel sliderPanel = new JPanel(); 
     sliderPanel.add(slider); 
     slider.addChangeListener(new ChangeListener() { 
     public void stateChanged(ChangeEvent ce) { 
      JSlider slider = (JSlider) ce.getSource(); 
      if (!slider.getValueIsAdjusting()) { 
       int value = slider.getValue(); 
       internalFrames[value].toFront(); 
      } 
     } 
     }); 

     setLayout(new BorderLayout()); 
     add(desktop, BorderLayout.CENTER); 
     add(sliderPanel, BorderLayout.SOUTH); 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("InternalFrameToFront"); 
     frame.getContentPane().add(new InternalFrameToFront()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowUI(); 
     } 
     }); 
    } 
} 
+0

感谢。 DUH!为什么不摆动这些事情有一个sensibile默认? – Saideira 2011-02-24 19:14:57