2014-04-18 14 views
0

하나의 프레임이 있는데, 버튼 누름으로 다른 프레임을 열 수 있습니다. 두 번째 프레임을 첫 번째 프레임과 동일한 화면 (이중 모니터 구성)에 표시하려고합니다.스윙에서 다른 모니터와 같은 모니터에서 한 프레임을 여는 방법은 무엇입니까?

어떻게 수행하나요?

UPDDATE

은 내부 올바른 screen 필드가 포함되어 있지만, 도움이되지 않는 부모 JFrame에서 getGraphicsConfiguration() 전달.

+0

GraphicsContext에서 무엇을 알 수 있습니까? –

+0

동일한 응용 프로그램에서 두 번째 JFrame을로드하는 방법이나 특정 모니터에 JFrame을 배치하는 방법을 묻는 중입니까? – AngerClown

+0

다른 솔루션 (?)을 추가했습니다. – morpheus05

답변

1

프레임의 위치에 대한 사용자의 선택을과 같이 java.util.Preferences 또는 javax.jnlp.BasicService에 저장하십시오. 기본값은 setLocationByPlatform()이며 시작시 위치를 복원하십시오. 또한보십시오 The Use of Multiple JFrames, Good/Bad Practice?

부록 : 죄송합니다, 무슨 말씀 이세요?

사용자에게으로 하여금 창을 둘 위치를 결정하게하십시오. 개요에서

  1. single frame을 사용하도록 디자인을 제한하십시오. 보조 창에 대한 대화 상자를 사용하십시오.

  2. 기본 설정이없는 경우 프레임의 기본 기본 설정 위치로 setLocationByPlatform()을 사용하십시오.

  3. 사용자가 창을 이동하면 새 위치를 preference으로 기록하십시오.

  4. 다시 시작할 때 원하는 값을 검색하여 프레임 위치를 복원하는 데 사용하십시오.

+0

죄송합니다 무슨 말씀 이세요? –

1

이렇게하는 방법에는 여러 가지가 있지만 내가 한대로 할 것입니다. 다음은 MVC 모델을 사용하여 수행 한 작업입니다.

뷰 (프레임)가 여러 개이므로보기 클래스 속성을 비 정적으로 만들고 내부 프레임 (innerView)의 필드를 추가해야 할 수 있습니다. 이렇게하면 구성 요소를 보거나 수정 한 다음 다른 구성 요소의 내부 뷰로 설정할 수 있습니다. 이는 또한보기에 컴포넌트를 추가하는 것이 뷰 클래스 자체가 아닌 주 프로그램 클래스에서 수행 될 가능성이 높다는 것을 의미합니다. 이것은 조금 바쁠 것 같지만 여전히 그럴 수 있습니다.

  • 내가 추가하려는 구성 요소를 저장할 수있는보기 클래스에 List<JComponent> 필드를 추가했습니다. 그런 다음 별도의 방법으로 패널에 추가하고 업데이트합니다.
  • 모든 뷰에서 동일한 컨트롤러를 사용했기 때문에 모든 뷰를 저장하고 현재 어느 뷰를 현재 설정하고 있는지도 설정하려면 List<View>을 추가해야합니다.

  • 다음으로 고정 크기와 그 구성 요소로 두 개의 뷰 클래스 (첫째 및 둘째)를 구성합니다. 나는 First as Second의 내면을 설정할 것입니다. 첫 번째 버튼에는 한 번 클릭하면 두 번째 버튼이 표시됩니다.

  • 마지막으로 버튼에 대한 작업 수신기를 만들었습니다. 이 청취자는 버튼을 클릭하면 Second를 표시합니다.컨트롤러 클래스의 현재보기로 Second를 설정하기 때문에 단추를 만들 수도 있습니다. 단추 자체는 주 프로그램 클래스에서 작성됩니다.

더 자세한 설명이 필요하면 알려주세요.

1

나는 이런 식으로했다 :

public static void showOnScreen(Window frame) { 
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice[] gd = ge.getScreenDevices(); 

    final GraphicsDevice frameDevice = frame.getParent().getGraphicsConfiguration().getDevice(); 
    for (GraphicsDevice graphicsDevice : gd) { 
    if (frameDevice.equals(graphicsDevice) || frameDevice.getIDstring().equals(graphicsDevice.getIDstring())) { 
     final Rectangle monitorBounds = graphicsDevice.getDefaultConfiguration().getBounds(); 
     final int x = monitorBounds.x + (monitorBounds.width - frame.getWidth()) /2; 
     final int y = monitorBounds.y + (monitorBounds.height - frame.getHeight())/2; 
     frame.setLocation(x, y); 
    } 
    } 
} 

주어진 프레임의 부모가 사용하는 장치의 코드를 검색합니다. 그런 다음 특정 모니터에 프레임을 중앙에 놓습니다.

이 코드는 듀얼 모니터 구성에서만 테스트되었습니다.

관련 문제