2014-04-15 1 views
2

다중 사용자 스윙 GUI 응용 프로그램을 만들고 로그 아웃하고 다시 로그인 할 때 사용자의 창 위치 및 크기 설정을 유지하려고합니다. 현재 창 위치를 얻고 있습니다. 사용자가 로그 아웃하여 파일에 저장할 때 부모 JFrame에서 getLocation()getSize() 메서드를 사용하여 다시 값을 읽은 다음 다시 setLocation()setSize()을 사용하여 창 크기와 위치를 설정합니다.JFrame getLocation 및 setLocation이 시스템 테두리를 다르게 처리합니다.

오전 데 문제는 (내가 왼쪽 상단 모서리에있는 창을 세우면 getLocation 반환하는 대신 (0,0)(1,54) 예)를 getLocation()getSize(),하지만 setLocation()setSize()하지 않는 시스템의 경계를 뺀 것으로 나타났습니다이다 . 그 결과 로그 아웃하고 다시 로그인 할 때마다 창이 닫히고 나면 약간 오프셋되고 약간 작게 나타납니다.

왜 이런 일이 일어날 지 또는 어떻게 해결할 수 있는지 누가 알 수 있습니까? 창 위치와 크기를 가져오고 설정하는 데 사용해야하는 다른 방법이 있습니까?

우분투 12.04에서 Java 1.7.0_45가 실행되고 있습니다.

감사합니다.

편집 : 나는 getLocationOnScreen() 대신 getLocation()를 사용하는 경우도

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Point; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.WindowConstants; 


public class JFrameTest 
{ 
    private JFrame frame; 
    private JButton button; 

    private Point lastLocation; 
    private Dimension lastSize; 

    private void run() 
    { 
    button = new JButton("Test"); 
    button.addActionListener(listener); 

    lastLocation = new Point(0, 0); 
    lastSize = new Dimension(200, 200); 

    initFrame(); 
    } 

    private void initFrame() 
    { 
    frame = new JFrame(); 
    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 

    frame.getContentPane().add(button); 

    frame.setLocation(lastLocation); 
    frame.setPreferredSize(lastSize); 

    frame.pack(); 
    frame.setVisible(true); 
    } 

    private ActionListener listener = new ActionListener() 
    { 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     if (e.getSource() == button) 
     { 
     lastLocation = frame.getLocationOnScreen(); 
     lastSize = frame.getSize(); 

     frame.dispose(); 

     initFrame(); 
     } 
    } 
    }; 

    public static void main(String[] args) 
    { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() 
     { 
     new JFrameTest().run(); 
     } 
    }); 
    } 
} 

, 나는이 같은 문제를 참조하십시오

다음 예는 문제가 내가보고하고 복제합니다.

+2

실제로 [실행 가능한 예를 보여줍니다 그 문제 (https://stackoverflow.com/help/mcve) (참) setLocationByPlattform'난에 있다고 생각 당신은'사용하면 적은 추측 작업과 더 나은 응답 – MadProgrammer

+0

을 포함하는 것 우분투는 화면을 0,0 상단에 놓습니다. – nachokk

+0

@MadProgrammer - 내 문제를 복제하는 실행 가능한 예제가 포함되어 있습니다. 제안에 감사드립니다. @nachokk - 의견을 보내 주셔서 감사합니다. 위의 예제 코드에서'frame.setLocationByPlatform (true) '를 호출해도 문제가 해결되지 않는 것 같습니다. – dpkoch

답변

0

당신은

는 화면의 좌표 공간에서 컴포넌트의 왼쪽 상단을 지정하는 포인트의 형식으로이 컴포넌트의 위치를 ​​가져옵니다 getLocationOnScreen()를 사용할 수 있습니다.

+0

치수를 처리하기 위해'getContentPane(). getSize();'/'setSize()'. –

+0

이것은 우분투에서 작동하지만 윈도우 "위치"는 화면상의 위치입니다. 다른 문맥이 없습니다 ... 그냥 말하면됩니다 ... – MadProgrammer

관련 문제