JAVA弹窗会卡住_java – 模态JDialog的最佳位置,以避免卡住

这让我想起了我最喜欢的帖子,在StackOverflow上使用Window.setLocationByPlatform(true).

编辑1:

你可以在你的JDialog和focusGained(…)方法中添加一个FocusListener,你可以对JFrame和JDialog使用setLocationRelativeTo(null),这样无论它们在哪里,它们都会到达屏幕的中心. .

import java.awt.*;

import java.awt.event.FocusEvent;

import java.awt.event.FocusListener;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.*;

/**

* Created with IntelliJ IDEA.

* User: Gagandeep Bali

* Date: 1/14/13

* Time: 7:34 PM

* To change this template use File | Settings | File Templates.

*/

public class FrameFocus

{

private JFrame mainwindow;

private CustomDialog customDialog;

private void displayGUI()

{

mainwindow = new JFrame("Frame Focus Window Example");

customDialog = new CustomDialog(mainwindow, "Modal Dialog", true);

mainwindow.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

JPanel contentPane = new JPanel();

JButton mainButton = new JButton(

"Click me to open a MODAL Dialog");

mainButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

if (!customDialog.isShowing())

customDialog.setVisible(true);

}

});

contentPane.add(mainButton);

mainwindow.setContentPane(contentPane);

mainwindow.pack();

mainwindow.setLocationByPlatform(true);

mainwindow.setVisible(true);

}

public static void main(String... args)

{

EventQueue.invokeLater(new Runnable()

{

@Override

public void run()

{

new FrameFocus().displayGUI();

}

});

}

}

class CustomDialog extends JDialog

{

private JFrame mainWindow;

public CustomDialog(JFrame owner, String title, boolean modal)

{

super(owner, title, modal);

mainWindow = owner;

JPanel contentPane = new JPanel();

JLabel dialogLabel = new JLabel(

"I am a Label on JDialog.", JLabel.CENTER);

contentPane.add(dialogLabel);

setContentPane(contentPane);

pack();

addFocusListener(new FocusListener() {

@Override

public void focusGained(FocusEvent e) {

mainWindow.setLocationRelativeTo(null);

setLocationRelativeTo(null);

}

@Override

public void focusLost(FocusEvent e) {

/*

* Nothing written for this part yet

*/

}

});

}

}

编辑2:

我在这里和那里搜索了一下,在我看来,实际上你的应用程序在第一个实例的哪个监视器屏幕上将确定它是GraphicsConfiguration.虽然我漫游API,但只有一个getter方法对于所述GraphicsConfiguration东西并没有相同的setter方法(仍然可以通过任何顶级窗口的构造函数指定一个,即JFrame(…)/JDialog(…)).

现在,您可以使用此代码占用您的头部,这些代码可用于确定您想要设置的适当位置,在我看来,您可能必须使用focusGain()方法来满足您的问题的条件2.看一下附加的代码,虽然不需要创建一个新的JFrame / JDialog,只需看看如何获??取屏幕的坐标(可以在focusGain()方法中添加以确定整个Application的位置.)

GraphicsEnvironment ge = GraphicsEnvironment.

getLocalGraphicsEnvironment();

GraphicsDevice[] gs = ge.getScreenDevices();

for (int j = 0; j < gs.length; j++) {

GraphicsDevice gd = gs[j];

GraphicsConfiguration[] gc =

gd.getConfigurations();

for (int i=0; i < gc.length; i++) {

JFrame f = new

JFrame(gs[j].getDefaultConfiguration());

Canvas c = new Canvas(gc[i]);

Rectangle gcBounds = gc[i].getBounds();

int xoffs = gcBounds.x;

int yoffs = gcBounds.y;

f.getContentPane().add(c);

f.setLocation((i*50)+xoffs, (i*60)+yoffs);

f.show();

}

}

编辑3:

试着改变这个:

int x = loc.getX() + (mainWindow.getWidth() - getWidth()) / 2;

int y = loc.getY() + (mainWindow.getHeight() - getHeight()) / 2;

setLocation(x, y);

只是:

setLocationRelativeTo(mainWindow);

为了测试上面的东西,我按原样使用了我的FrameFocus类,虽然我已经将我的更改添加到我的CustomDialog方法中,如此修改后的CustomDialog类所示.

class CustomDialog extends JDialog

{

private JFrame mainWindow;

public CustomDialog(JFrame owner, String title, boolean modal)

{

super(owner, title, modal);

mainWindow = owner;

JPanel contentPane = new JPanel();

JLabel dialogLabel = new JLabel(

"I am a Label on JDialog.", JLabel.CENTER);

contentPane.add(dialogLabel);

setContentPane(contentPane);

pack();

addFocusListener(new FocusListener() {

@Override

public void focusGained(FocusEvent e) {

//mainWindow.setLocationRelativeTo(null);

//setLocationRelativeTo(null);

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

GraphicsDevice[] gs = ge.getScreenDevices();

for (int j = 0; j < gs.length; j++) {

GraphicsDevice gd = gs[j];

GraphicsConfiguration[] gc = gd.getConfigurations();

for (int i=0; i < gc.length; i++) {

Rectangle gcBounds = gc[i].getBounds();

Point loc = mainWindow.getLocationOnScreen();

if (gcBounds.contains(loc)) {

System.out.println("at " + j + " screen");

int x = gcBounds.x + (gcBounds.width - mainWindow.getWidth()) / 2;

int y = gcBounds.y + (gcBounds.height - mainWindow.getHeight()) / 2;

mainWindow.setLocation(x, y);

//x = (int) (loc.getX() + (mainWindow.getWidth() - CustomDialog.this.getWidth()) / 2);

//y = (int) (loc.getY() + (mainWindow.getHeight() - CustomDialog.this.getHeight()) / 2);

//CustomDialog.this.setLocation(x, y);

CustomDialog.this.setLocationRelativeTo(mainWindow);

break;

}

}

}

}

@Override

public void focusLost(FocusEvent e) {

/*

* Nothing written for this part yet

*/

}

});

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值