我在这里遇到了一个小小的问题。
我尝试保存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这样的行为? 对不起我的英文...
答案 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字母开头。我看到你有Parent
和parent
。这就是this
派上用场的地方
this.parent = parent
而不是
Parent = parent
看起来您正在尝试使用两个JFrame
。 为什么的?还有其他更加用户友好的选项,例如模型JDialog
或CardLayout
。请参阅The Use of Multiple JFrames, Good/Bad Practice?
<强>更新强>
虽然我反对使用多个帧,但我仍然会给你一个答案,只是因为我花了很多时间来实际测试它。以下是我在GUI Builder中采取的步骤,它看起来就像你正在使用的那样。
JFrame
表单FrameOne
和FrameTwo
。defaultCloseOperation
的{{1}}更改为FrameOne
DISPOSE
中,我删除了FrameTwo
方法,因为该应用程序已在main
类中运行。我保留了外观和感觉代码。只需警察并将其粘贴到构造函数中。我这样做,设置相对于第一帧的位置
FrameOne
在FrameOne frameOne;
public FrameTwo(FrameOne frameOne) {
initComponents();
this.frameOne = frameOne;
// look and feel code here
setLocationRelativeTo(frameOne);
setVisible(true);
}
WindowListener
FrameOne
工作正常。
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
}