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");
}
}
4 ответа
Абсолютно. По умолчанию 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();
Диалоговое окно теперь будет минимального размера для размещения компонентов. Если вы используете компоненты, которые должны быть плотно упакованы, используйте этот метод; тогда вам не нужно тщательно подбирать правильную ширину и высоту вручную.
"Есть ли способ, которым я могу изменить это так, чтобы диалог появился в середине и приемлемого размера?"
Если вы просто добавляете к нему компоненты, упаковываете его и устанавливаете его расположение относительно нуля, он должен работать нормально
Предпочтительнее .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 из потока рассылки событий (EDT), как это
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
public void run() {
// the code from your main method here
}
});
}
Добавьте эти строки кода между 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);
Этот код установит диалог в центр вашего экрана.