gpt4 book ai didi

java.awt.Frame.setBackground() 在 OS X 中不工作

转载 作者:行者123 更新时间:2023-11-29 09:26:18 24 4
gpt4 key购买 nike

我正试图解决我在 OS X 中的 java applet 中的一些 UI 渲染错误,但我遇到了一个我无法弄清楚的错误。

我们打开的所有扩展 java.awt.Frame 的窗口似乎都忽略了 setBackground() 调用,而是使用 OS X 默认设置(拉丝金属或灰色渐变,取决于操作系统版本)。不过,我们打开的任何扩展 Dialog 的东西都可以正常工作。

我尝试覆盖 paint() 方法并在那里绘制背景颜色。但是,这仅部分起作用。背景在某些地方确实最终变成了正确的颜色,但是框架的所有子组件仍然使用 OS X 背景绘制,而不是我设置的背景,所以现在看起来更糟。这些相同的组件类型(Panel、Checkbox 等)用在几个 Dialog-extending 窗口中,它们在那里工作得很好,所以我猜 Frame 一定有什么东西把事情搞砸了。

有没有办法为在 OS X 中工作的框架设置背景颜色?有没有其他人以前见过这个?

请注意,我一直在根据 Java 1.1 规范进行编码,因为我需要支持 Microsoft JVM(不要让我开始...)。

最佳答案

我找到了解决方法。我为 Frame 创建了一个包装类,它创建了一个子 Panel 并将其所有内容放在该面板中。 Panel 明确设置了背景颜色(而不是让它从其父 Frame 继承)。然后,我将扩展 Frame 的类更改为扩展我的新 FrameW 包装器类,问题就消失了。

我的包装器在功能上并不是真正完整的,但它处理了我需要它来处理我所拥有的用法的东西。这是我使用的代码,以防其他人遇到此问题:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Frame;
import java.awt.LayoutManager;
import java.awt.Panel;

/**
* Wrapper for java.awt.Frame that wraps the contents in a Panel. This is done
* because Frames in OS X appear to ignore the background color, but if the
* contents are wrapped in a Panel and that Panel is given the background color
* then it works fine.
*/
public class FrameW extends Frame {

private Panel wrapper;

/** Constructs the Frame wrapper */
public FrameW() {
super();
init();
}

/**
* Constructs the Frame wrapper.
* @param title The title to give the frame.
*/
public FrameW(String title) {
super(title);
init();
}

public Component add(Component comp) {
return wrapper.add(comp);
}

public Component add(String name, Component comp) {
return wrapper.add(name, comp);
}

public Component add(Component comp, int index) {
return wrapper.add(comp, index);
}

public void add(Component comp, Object constraints) {
wrapper.add(comp, constraints);
}

public void add(Component comp, Object constraints, int index) {
wrapper.add(comp, constraints, index);
}

public LayoutManager getLayout() {
return wrapper.getLayout();
}

public void setLayout(LayoutManager mgr) {
/* setLayout is called by Frame's constructor before our init runs. */
if(this.wrapper == null) { return; }
wrapper.setLayout(mgr);
}

public void setBackground(Color c) {
super.setBackground(c);
wrapper.setBackground(c);
}

/**
* Overriding the insets of the frame will cause the panel used for the
* background color to not take up the entire frame's area. Instead, override
* FrameW.getContentInsets() for setting the insets of the content.
* @return The frame's insets
*/
public Insets getInsets() {
return super.getInsets();
}

/**
* Override this instead of getInsets() in order to set the insets of the
* FrameW.
* @return The insets for the content
*/
public Insets getContentInsets() {
return new Insets(0, 0, 0, 0);
}

private void init() {
this.wrapper = new Panel() {
public Insets getInsets() {
return FrameW.this.getContentInsets();
}
};

super.setLayout(new BorderLayout());
super.add(this.wrapper, BorderLayout.CENTER);
}
}

关于java.awt.Frame.setBackground() 在 OS X 中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/951017/

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