Почему содержимое моего JFrame иногда не рисуется? - PullRequest
0 голосов
/ 17 февраля 2010

Я пытаюсь создать базовый элемент управления, который будет отображать недокрашенный 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 иногда не рисуется?

1 Ответ

1 голос
/ 18 февраля 2010

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

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

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

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

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

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

# 3 Если вы используете u10 или выше, запустите ваше приложение с аргументом

-Dsun.java2d.d3d=false

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

...