2012-09-21 4 views
6

Если я создаю не изменяемые по размеру JFrames, а окна Aero включены, setLocation, похоже, не учитывает границы окна правильно.Неизменяемая граница окна и позиционирование

В следующем коде я ожидаю, что второй кадр будет расположен справа от первого кадра, вместо этого границы будут перекрываться. Если Aero отключен или я удаляю вызовы на setResizable, это делается так, как ожидалось.

import java.awt.Rectangle; 
import javax.swing.JFrame; 
public class FrameBorders { 
public static void main(String[] args) { 
    JFrame frame1 = new JFrame("frame 1"); 
    JFrame frame2 = new JFrame("frame 2"); 

    frame1.setResizable(false); 
    frame2.setResizable(false); 

    frame1.setVisible(true);   
    Rectangle bounds = frame1.getBounds();  
    frame2.setLocation(bounds.x+bounds.width, bounds.y); 
    frame2.setVisible(true); 

} 
} 

Я делаю что-то неправильно или это ошибка? Как я могу отображать 2 неразрешимых диалоговых окна рядом друг с другом без перекрытия границ?

Редактирование: добавлены скриншоты (также изменен frame2 к JDialog вместо JFrame)

Aero On: Aero On

Aero Off: Aero Off

Aero включен, но изменяемыми: Aero On but resizable

+0

Почему вы хотите, чтобы отобразить 2 unresizable диалоги бок о бок, не перекрывающихся границ? –

+0

Я хочу отобразить 2 окна, которые изначально расположены бок о бок – msam

+2

Пожалуйста, не устанавливайте произвольные границы в контейнере, не подлежащем изменению. См. [* Использование нескольких JFrames, Хорошая/Плохая Практика *] (http://stackoverflow.com/a/9554657/230513)? – trashgod

ответ

7

В чем проблемы с se привязки к контейнерам без изменения размеров?

Предположим, вы настроите границы, чтобы хорошо выглядеть на своей платформе. Предположим, что на платформе пользователя есть шрифт с разными, скажем, большими, FontMetrics. Этот пример несколько надуман, но вы получаете эту идею. Если вы изменяете границы контейнера без изменения размера, убедитесь, что любой текст отображается независимо от шрифта по умолчанию для основной платформы.

image

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

/** 
* @see http://stackoverflow.com/a/12532237/230513 
*/ 
public class Evil extends JPanel { 

    private static final String s = 
     "Tomorrow's winning lottery numbers: 42, "; 
    private JLabel label = new JLabel(s + "3, 1, 4, 1, 5, 9", JLabel.LEFT); 

    public Evil() { 
     this.add(label); 
    } 

    private void display() { 
     JFrame f = new JFrame("Evil"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this, BorderLayout.WEST); 
     f.pack(); 
     int w = SwingUtilities.computeStringWidth(
      label.getFontMetrics(label.getFont()), s); 
     int h = f.getHeight(); 
     f.setSize(w, h); 
     f.setResizable(false); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Evil().display(); 
      } 
     }); 
    } 
} 
+1

Вы могли бы быть богатыми! – trashgod

+0

Это хороший вопрос относительно изменения размера (и был бы хорошим ответом на вопрос, который я сделал в комментариях, если он сделан сам по себе), однако моя первоначальная проблема связана с позиционированием. Предположим, что использование pack()/no text/size не будет изменять или даже пустые диалоги/кадры, как в моем собственном надуманном примере. – msam

+1

Попробуйте 'pack()', который «Заставляет это« окно »иметь размер, чтобы он соответствовал предпочтительным размерам и макетам его подкомпонентов». Извините, я не использую aero; [sscce] (http://sscce.org/), который показывает проблему, которую вы описываете, может оказаться полезным. – trashgod

5

Кажется, что это не проблема Java, а аэро AppCompat вопрос, как описано here.

Одно решение, которое я вижу в Java, чтобы позволить окна быть изменяемыми затем работать вокруг setMaximumSize bug

+0

+1 хорошая находка ... –

+0

Хорошая ссылка; платформе принадлежит декорации кадров, поэтому результат не является полностью незаурядным; 'aqua' имеет свою долю подобных аномалий. – trashgod

 Смежные вопросы

  • Нет связанных вопросов^_^