【问题标题】:bring JInternalFrame to the front将 JInternalFrame 放在最前面
【发布时间】:2011-07-02 04:18:43
【问题描述】:

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

公共静态无效moveToFront(最终JInternalFrame fr){ 如果(fr!= null){ processOnSwingEventThread(新可运行(){ 公共无效运行(){ fr.moveToFront(); fr.setVisible(true); 尝试 { fr.setSelected(true); 如果(fr.isIcon()){ fr.setIcon(假); } fr.setSelected(true); } 捕捉(PropertyVetoException ex){ ex.printStackTrace(); } fr.requestFocus(); fr.toFront(); } }); } }

【问题讨论】:

    标签: java swing


    【解决方案1】:

    根据 API toFront 或 moveToFront 应该可以工作(尽管从我对 API 的阅读来看, toFront 看起来是两者中更好的)。这些 JInternalFrames 是否位于 JDesktopPane 中?根据你的帖子,他们似乎是。我想知道错误是否在其他地方。

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

    这是我的 SSCCE 示例:

    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();
             }
          });
       }
    }
    

    【讨论】:

    • 谢谢,原来我在创建框架时没有调用 setSize(w,h)。呃!为什么 swing 对这些东西没有敏感的默认值??
    • 啊。很高兴你弄明白了。有时只需要一两天的时间就可以用新的眼光看待问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2019-07-20
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2022-06-28
    相关资源
    最近更新 更多