2012-06-26 1 views
1

Да, некоторые вопросы близки :)Java - Как не закрывать панель задач неконсолированным или обычным окном LookAndFeel?

Существует ошибка на Java (была вокруг и сообщалась с 2011 года, похоже, что усилий по ее исправлению не прилагается), следует обрабатывать на внутренней стороне виртуальной машины)

То есть, когда вы максимизируете «незадекларированное» окно или окно, нарисованное с помощью внешнего вида PLAF, оно будет охватывать панель задач Windows. Хорошо - желательно , если вы этого хотите, но когда вы хотите, чтобы панель задач максимально закрывала ее. установка «всегда сверху» proerty не имеет никакого значения.

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

, и вам нужно знать, что вы максимизируете экран без панели задач, если это делается. и если на виртуальном рабочем столе мультимониторной ...

Любые идеи :)

+3

ошибка ???, пожалуйста, вы можете добавить BugParades ссылку на ваш вопрос – mKorbel

ответ

5

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

Да:

1.Look до графического устройства вы находитесь (в предположении р является Point Экрана вы ищете):

GraphicsConfiguration graphicsConfiguration = null; 
for (GraphicsDevice gd : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) { 
    if (gd.getDefaultConfiguration().getBounds().contains(p)) { 
     graphicsConfiguration = gd.getDefaultConfiguration(); 
     break; 
    } 
} 

2.Look на экране (обратите внимание на то, что некоторые границы расположены отрицательно на нескольких экранах - например, если у вас есть дополнительный экран слева от основного экрана), размер экрана и «Вставки» экрана, которые обычно являются панелью задач и/или другие графические артефакты:

Rectangle screenBounds = graphicsConfiguration.getBounds(); 
Dimension screenSize = screenBounds.getSize(); 
Insets screenInsets = Toolkit.getDefaultToolkit() 
    .getScreenInsets(graphicsConfiguration); 
+0

спасибо - я должен проверить перестановки экранов и где «панель задач окна» назначено. Будет интересно узнать, как и как я могу узнать их все. В какой-то системе виртуальные рабочие столы с панелью отображения на панели задач нет, и т. Д. – peterk

+0

Для меня я уже использовал «GraphicsConfiguration», но я не знал о 'screenInsets'. С учетом логики с шага 2 работала красиво. И у меня даже есть панель задач слева. – Pixelstix

1

Благодаря

Вот код, сделанный из выше которого является звонки сразу после того, как окно развернуто в системе. Он проверяет панели задач и соответствующим образом изменяет размеры окна.

Обратите внимание, что setBounds будет «не увеличивать» окно до Java, поэтому «getExtendedState()» вернет un maximized, и мне нужно будет поддерживать собственный флаг. Я также должен кэшировать последний предварительно максимизированный размер окна, поэтому я знаю, где восстановить окно до конца - все это слишком грязно, но оно работает.

Rectangle bounds; 
Rectangle fbounds = frame.getBounds(); 
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 

// as system maximized this at this point we test the center of the window 
// as it should be on the proper screen. 
Point p = new Point(fbounds.x + (fbounds.width/2),fbounds.y + (fbounds.height/2)); 
GraphicsConfiguration graphicsConfiguration = null; 
for (GraphicsDevice gd : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) 
{ 
    if (gd.getDefaultConfiguration().getBounds().contains(p)) { 
     graphicsConfiguration = gd.getDefaultConfiguration(); 
     break; 
    } 
} 
if(graphicsConfiguration != null) 
{ 
    bounds = graphicsConfiguration.getBounds(); 
    Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(graphicsConfiguration); 

    bounds.x += screenInsets.left; 
    bounds.y += screenInsets.top; 
    bounds.height -= screenInsets.bottom; 
    bounds.width -= screenInsets.right; 
} else { 
    bounds = env.getMaximumWindowBounds(); 
} 
if(fbounds.equals(bounds)) { 
    bounds.height -= 1; 
} 
frame.setBounds(bounds); 
Смежные вопросы