如果jFrame.setLocation之后的屏幕(点p),jFrame会在中间跳转

时间:2014-01-30 15:51:46

标签: java swing jframe

我在这里遇到了一个小小的问题。

我尝试保存jFrame的实际位置,并在再次创建此帧后恢复此位置。

继承人“保存”程序:

private void formWindowClosing(java.awt.event.WindowEvent evt) {                                   
    Parent.Throttle_vorhanden = 0;
    root.Hauptfenster.LastPositionThrottlePlate=this.getLocation();
    this.dispose();
} 

在这里,我尝试再次设置旧位置:

public Throttle(Hauptfenster parent, root.rs232.rs232Connection Conn, Integer throttlePosition) {
    super();
    Parent = parent;
    conn = Conn;
    actualThrottlePosition = throttlePosition;
    initComponents();

    jScrollBar2.setValue(root.Hauptfenster.MPR);
    this.setTitle("Throttle");

    this.setVisible(true);
    if (root.Hauptfenster.LastPositionThrottlePlate!=null) {
        this.setLocation(root.Hauptfenster.LastPositionThrottlePlate); 
    }

对于一点点伤害,我看到Frame处于旧位置,但随后它在屏幕中间“跳跃”......

有谁可以想象为什么jFrame这样的行为? 对不起我的英文...

3 个答案:

答案 0 :(得分:0)

将JFrame正确放置后,将其设置为可见。

这只是颠倒你上一次操作的顺序的问题:

if (root.Hauptfenster.LastPositionThrottlePlate!=null) {
    this.setLocation(root.Hauptfenster.LastPositionThrottlePlate); 
}

this.setVisible(true);

答案 1 :(得分:0)

这可能是因为你在移动JFrame之前显示了你的窗口。

您的代码说:

this.setVisible(true);
if (root.Hauptfenster.LastPositionThrottlePlate!=null) {
    this.setLocation(root.Hauptfenster.LastPositionThrottlePlate); 
}

我建议撤消订单:

if (root.Hauptfenster.LastPositionThrottlePlate!=null) {
    this.setLocation(root.Hauptfenster.LastPositionThrottlePlate); 
}
this.setVisible(true);

这会在显示之前将其设置为“最终”位置。

答案 2 :(得分:0)

为什么不只是setLocationRelativeTo(parent)而不是手动设置位置。


旁注:

  • 使用Java命名约定。变量名以lowecase字母开头。我看到你有Parentparent。这就是this派上用场的地方

    this.parent = parent
    

    而不是

    Parent = parent
    
  • 看起来您正在尝试使用两个JFrame为什么的?还有其他更加用户友好的选项,例如模型JDialogCardLayout。请参阅The Use of Multiple JFrames, Good/Bad Practice?


<强>更新

虽然我反对使用多个帧,但我仍然会给你一个答案,只是因为我花了很多时间来实际测试它。以下是我在GUI Builder中采取的步骤,它看起来就像你正在使用的那样。

  1. 我制作了两个JFrame表单FrameOneFrameTwo
  2. 我将defaultCloseOperation的{​​{1}}更改为FrameOne
  3. DISPOSE中,我删除了FrameTwo方法,因为该应用程序已在main类中运行。我保留了外观和感觉代码。只需警察并将其粘贴到构造函数中。
  4. 我这样做,设置相对于第一帧的位置

    FrameOne
  5. FrameOne frameOne; public FrameTwo(FrameOne frameOne) { initComponents(); this.frameOne = frameOne; // look and feel code here setLocationRelativeTo(frameOne); setVisible(true); }

    中添加了WindowListener
    FrameOne
  6. 工作正常。


    FrameOne.java

    使用GU Builder中的代码

    更新

    我没有向FrameOne添加任何组件,只是关闭框架。我所做的唯一事情就是我在上面的步骤中提到的

    public FrameOne() {
        initComponents();
    
        addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent e) {
                new FrameTwo(FrameOne.this);
                FrameOne.this.dispose();
           }
        });
    }
    

    FrameTwo.java

    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import javax.swing.GroupLayout;
    import javax.swing.WindowConstants;
    
    public class FrameOne extends javax.swing.JFrame {
    
        public FrameOne() {
            initComponents();
    
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    new FrameTwo(FrameOne.this);
                    FrameOne.this.dispose();
                }
            });
        }
    
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
    
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    
            GroupLayout layout = new GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGap(0, 400, Short.MAX_VALUE)
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGap(0, 300, Short.MAX_VALUE)
            );
    
            pack();
        }// </editor-fold>                        
    
        public static void main(String args[]) {
    
            try {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ClassNotFoundException ex) {
                java.util.logging.Logger.getLogger(FrameOne.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                java.util.logging.Logger.getLogger(FrameOne.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                java.util.logging.Logger.getLogger(FrameOne.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (javax.swing.UnsupportedLookAndFeelException ex) {
                java.util.logging.Logger.getLogger(FrameOne.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            }
            //</editor-fold>
    
            /* Create and display the form */
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new FrameOne().setVisible(true);
                }
            });
        }
    
        // Variables declaration - do not modify                     
        // End of variables declaration                   
    }
    

    enter image description here