0

我正在尝试构建一个基本控件,当单击按钮时,它将在其下方显示一个未装饰的 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,而不是重用和设置同一 Frame 的可见性,则问题不存在,但这是不希望的。关于为什么我的 DropFrame 有时不画的任何想法?

4

1 回答 1

1

这里有几件事要看:

#1 你运行的是什么版本的 JVM?Sun 在 1.6 的不同版本中对图形管道进行了大量更改。更新前 10 版本的行为与后续版本完全不同。(注意:Firefox 3.6+ 需要更新 10 或更高版本才能运行小程序。)

#2 在您的 init 组件中添加以下行:

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

setLocation()对finally的调用Component.notifyNewBounds(boolean resized, boolean moved),它遍历设置每个组件边界的组件层次结构。

默认情况下,这是“懒惰”完成的,这似乎在计算组件在哪里(或它应该在哪里)时导致 Java 出现一些问题。上面的代码强制预先计算边界。

#3 如果您正在运行 u10 或更高版本,请使用参数启动您的应用程序

-Dsun.java2d.d3d=false

这将禁用 DirectX 管道。如果这使问题消失,请更新您的显示驱动程序。

于 2010-02-18T16:53:23.980 回答