Почему мое содержимое JFrame иногда не рисуется?

Я пытаюсь создать базовый элемент управления, который будет отображать неукрашенный JFrame прямо под ним при нажатии кнопки. Я пытаюсь имитировать функциональность выпадающего типа, но с моей собственной рамкой вместо панели. Мой компонент содержит член класса элемента управления, производного от JFrame, который я хотел бы отобразить. В определенных ситуациях при вызове setVisible содержимое этого JFrame не рисуется. Похоже, это происходит, когда я пытаюсь отобразить JFrame на моем крайнем левом мониторе, который использует отрицательные координаты x (мой основной монитор — средний монитор). Странно то, что эта проблема появляется только на моем компьютере с Windows 7, но не на компьютере с XP.

Вот очень простой пример, демонстрирующий проблему. Как видите, это очень простой пример, который должен просто скрывать и отображать DropFrame. Я опустил код из initComponents, в данном случае все, что он делает, это добавляет кнопку к каждому кадру и необходимые ActionListeners для каждой кнопки.

Код:

public class NewJFrame extends javax.swing.JFrame {
private javax.swing.JButton jButton2;
private DropFrame f = new DropFrame();

/** Creates new form NewJFrame */
public NewJFrame() {
    initComponents();
}

private void initComponents() {
    //Create button and add it to the frame...
    pack();
}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt)        {                                         
    SwingUtilities.invokeLater(new Runnable() 
    {
        public void run() {
            Point p = jButton2.getLocationOnScreen();
            f.setLocation(p.x, p.y + 25);
            f.setVisible(true);
        }
    });

}                                        

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new NewJFrame().setVisible(true);
        }
    });
} }

public class DropFrame extends javax.swing.JFrame {
private javax.swing.JButton jButton1;  

/** Creates new form NewJFrame1 */
public DropFrame() {
    initComponents();
}

private void initComponents() {
    //Create button and add to frame...
    pack();
}                   

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)    {                                         
    this.setVisible(false);
} }                                                  

Проблема не существует, если я создаю новый DropFrame при каждом нажатии кнопки, в отличие от повторного использования и настройки видимости одного и того же фрейма, но это нежелательно. Любые идеи о том, почему мой DropFrame иногда не рисуется?


person MMann    schedule 17.02.2010    source источник


Ответы (1)


Вот несколько вещей, на которые стоит обратить внимание:

#1 Какую версию JVM вы используете? Sun внесла много изменений в графический конвейер в различных версиях 1.6. Выпуски до обновления 10 ведут себя совершенно иначе, чем более поздние выпуски. (Примечание: Firefox 3.6+ требует обновления 10 или выше для работы апплетов.)

#2 В ваши компоненты инициализации добавьте следующие строки:

    Point location = getLocation();
    setLocation(new Point(0, 0));
    setLocation(location);
    pack();

Вызов setLocation() в конечном итоге Component.notifyNewBounds(boolean resized, boolean moved), который пересекает иерархию компонентов, устанавливая границы каждого компонента.

По умолчанию это делается «лениво», что, кажется, вызывает у Java некоторые проблемы при вычислении того, где находится компонент (или где он должен быть). Приведенный выше код заставляет вычислять границы заранее.

#3 Если вы используете версию 10 или более позднюю, запустите приложение с аргументом

-Dsun.java2d.d3d=false

Это отключает конвейер DirectX. Если это устранит проблему, обновите драйверы дисплея.

person Devon_C_Miller    schedule 18.02.2010
comment
Я использую 1.6 u18. Принудительное вычисление границ, похоже, не работает, однако отключение Direct3D работает! Я полагаю, пришло время обновить мои драйверы, чтобы посмотреть, решат ли они проблему. Спасибо за помощь! - person MMann; 18.02.2010