2014-01-13 7 views
0

이 코드를 실행할 때마다 출력은 화면의 왼쪽 상단 모서리에 나타나고 제목이 표시되지 않는 대화 상자입니다.JDialog 팝업이 너무 작습니다.

대화 상자가 중간 크기와 허용 가능한 크기로 표시되도록 변경할 수있는 방법이 있습니까?

코드 : 물론

public class Test { 

public static void main(String[] args) { 

    JFrame f = new JFrame(); 

    final JDialog dialog = new JDialog(f, "Hello world", true); 
    Timer timer = new Timer(10000, new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      dialog.setVisible(false); 
      dialog.dispose(); 
     } 
    }); 
    timer.setRepeats(false); 
    timer.start(); 

    dialog.setVisible(true); 
    System.out.println("Dialog closed"); 

} 
} 

JDialog only appears at the top right hand corner instead of center of screen

답변

3

. 기본적으로 JDialog (또는 JFrame)이 이와 같이 표시됩니다. 범위를 설정해야합니다 :

dialog.setBounds(xPosition, yPosition, width, height); 

그러나 일부 마법 번호를 설정하면 다른 시스템으로 확장되지 않습니다. 대신, 그 오프 스크린 치수를 얻고, 설정 :

//static and final because no reason not to be. Insert this at the class definition 
static final Dimension SCREEN_DIMENSION = Toolkit.getDefaultToolkit().getScreenSize(); 
... 
//I'd also make this static and final and insert them at the class definition 
int dialogWidth = SCREEN_DIMENSION.width/4; //example; a quarter of the screen size 
int dialogHeight = SCREEN_DIMENSION.height/4; //example 
... 
int dialogX = SCREEN_DIMENSION.width/2 - dialogWidth/2; //position right in the middle of the screen 
int dialogY = SCREEN_DIMESNION.height/2 - dialogHeight/2; 

dialog.setBounds(dialogX, dialogY, dialogWidth, dialogHeight); 

을 다른 방법으로, 대화는 이제을 수용 할 수있는 최소 크기입니다 당신은 다음의 JDialog에 구성 요소를 추가

dialog.pack(); 

를 호출하는 경우 구성 요소. 단단히 묶어야하는 구성 요소를 사용하는 경우이 방법을 사용하십시오. 손으로 올바른 너비와 높이를 고심하게 만들 필요가 없습니다.

0

하는이 라인

dialog.setBounds(0, 0, 1000, 500); 
2

추가 "나는 대화가 중간에서 수용 가능한 크기로 표시되도록 변경할 수있는 방법이 있습니까?"

당신은 단지에 구성 요소를 추가하는 경우, 그것을 포장하고, 그것을 null로 상대적인 위치를 설정, 그것은 그것은 .pack() 대신 크기를 설정하는 것이 바람직하다

잘 작동합니다. 팩이 작동하려면 실제로 구성 요소를 추가해야합니다. .pack()은 이름에서 알 수 있듯이 정확히 수행됩니다. 추가 된 모든 구성 요소의 기본 크기를 고려하여 프레임을 포장하십시오.

setLocationRelativeTo()도 구성 요소에 상대적으로 대화 상자를 설정합니다. null을 사용하면 화면 중앙에 항상 표시됩니다. 그러나 부모를 기준으로 위치를 설정하면 프레임 위에 프레임의 중앙에 표시됩니다.

나는 당신이 타이머를 달성하기 위해 노력하는지 전혀 생각이 없다, 그래서 난 그냥 사이드 참고로 예를

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.Timer; 

public class Test { 

    public static void main(String[] args) { 

     JFrame f = new JFrame(); 
     final MyDialog dialog = new MyDialog(f, "Title", true); 
     Timer timer = new Timer(10000, new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       dialog.setVisible(false); 
       dialog.dispose(); 
      } 
     }); 
     timer.setRepeats(false); 
     timer.start(); 

     dialog.setVisible(true); 
     System.out.println("Dialog closed"); 

    } 

    private static class MyDialog extends JDialog { 

     public MyDialog(JFrame frame, String title, boolean modal) { 
      super(frame, title, modal); 

      setLayout(new BorderLayout()); 
      add(new JButton("NORTH"), BorderLayout.NORTH); 
      add(new JButton("SOUTH"), BorderLayout.SOUTH); 
      add(new JButton("EAST"), BorderLayout.EAST); 
      add(new JButton("WEST"), BorderLayout.WEST); 
      add(new JButton("CENTER"), BorderLayout.CENTER); 

      pack(); 
      setLocationRelativeTo(null); 

     } 
    } 
} 

참조 노 코멘트

선호 , 당신은이 같은 이벤트 발송 스레드 (EDT)에서 스윙 애플 리케이션을 실행해야합니다

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable(){ 
     public void run() { 
      // the code from your main method here 
     } 
    }); 
} 
+0

또는 ['SwingUtilities.invokeLater'] (http://stackoverflow.com/questions/8847083/swingutilities-invokelater-vs-eventqueue-invokelater). – Justin

1

timer.start();dialog.setVisible(true); 문 사이에 코드 줄을 추가 -

timer.start(); 

    dialog.setPreferredSize(new Dimension(50, 150));//set your desired size 
    dialog.pack(); 
    Toolkit toolkit = Toolkit.getDefaultToolkit(); 
    Dimension screenSize = toolkit.getScreenSize(); 
    int iWidth = (screenSize.width - dialog.getWidth())/2; 
    int iHeight = (screenSize.height - dialog.getHeight())/2; 
    dialog.setLocation(iWidth, iHeight); 

    dialog.setVisible(true); 

이 코드는 화면의 중앙에 대화를 설정합니다.

+0

'ToolKit'은 작업 표시 줄과 같은 것을 고려하지 않으므로 화면 크기를 결정하는 데 그리 좋지 않습니다. 일반적으로 윈도우를 중앙에 놓기 위해'setLocationRelativeTo (null)'을 사용하는 것이 더 좋다. 또한 컨텐츠가 원하는 크기를 스스로 결정하고 대화 상자에 직접 설정하는 대신에'pack'을 사용하는 것이 더 좋다. – MadProgrammer

관련 문제