gpt4 book ai didi

java - 为什么我的 JFrame 内容有时不被绘制?

转载 作者:行者123 更新时间:2023-12-01 16:07:47 26 4
gpt4 key购买 nike

我正在尝试构建一个基本控件,当单击按钮时,该控件将在其正下方显示一个未修饰的 JFrame。我试图模仿下拉式功能,但使用我自己的框架而不是面板。我的组件包含我希望它显示的 JFrame 派生控件的类成员。在某些情况下,当调用 setVisible 时,不会绘制此 JFrame 的内容。当我尝试在最左边的显示器上显示 JFrame 时,似乎会发生这种情况,该显示器使用负 x 坐标(我的主显示器是中间显示器)。奇怪的是这个问题只出现在我的 Windows 7 机器上,而没有出现在 XP 机器上。

这是一个演示该问题的非常基本的示例。正如您所看到的,这是一个非常基本的示例,应该简单地隐藏和显示 DropFrame。我省略了 initComponents 中的代码,在本例中,它所做的只是向每个框架添加一个按钮,并为每个按钮添加必要的 ActionListener。

代码:

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您运行的 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 moving),它遍历组件层次结构设置每个组件的边界。

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

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

-Dsun.java2d.d3d=false

这会禁用 DirectX 管道。如果这样可以解决问题,请更新您的显示驱动程序。

关于java - 为什么我的 JFrame 内容有时不被绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2282302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com