2014-01-13 4 views
0

Каждый раз, когда я запускаю этот фрагмент кода, вывод представляет собой диалоговое окно, которое появляется в верхнем левом углу экрана, и заголовок не отображается.JDialog popup too small

Есть ли способ изменить это, чтобы диалоговое окно отображалось в середине и допустимом размере?

Код:

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

«Есть ли способ, что я могу изменить это так, что появится диалоговое окно, в середине и приемлемого размера?»

Если вы просто добавить компоненты к нему, упаковать его и установить его местоположение относительно нулевой, он должен работать нормально

Предпочтительно .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); 

     } 
    } 
} 

В качестве примечания , вы должны запускать приложения Swing из Event Dispatch Thread (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