Java 当我运行JApplet时,同一代码会有不同的颜色
我写了一个JApplet,并在初始化中设置了Nimbus L&F的颜色 当我通过Netbeans或Google Chrome运行小程序时,有9/10次按钮背景设置为深色,但有时Nimbus无法设置颜色 以下是SSCCE:Java 当我运行JApplet时,同一代码会有不同的颜色,java,swing,applet,look-and-feel,nimbus,Java,Swing,Applet,Look And Feel,Nimbus,我写了一个JApplet,并在初始化中设置了Nimbus L&F的颜色 当我通过Netbeans或Google Chrome运行小程序时,有9/10次按钮背景设置为深色,但有时Nimbus无法设置颜色 以下是SSCCE: import java.awt.Color; import java.lang.reflect.InvocationTargetException; import javax.swing.UIManager; public class NimbusColors extends
import java.awt.Color;
import java.lang.reflect.InvocationTargetException;
import javax.swing.UIManager;
public class NimbusColors extends javax.swing.JApplet {
// colors and look and feel
Color buttonBackgroundColor;
Color buttonTextColor;
Color textAreaBackgroundColor;
Color textAreaTextColor;
Color skinColor;
Color defaultButtonBackgroundColor = Color.decode("#4a4a4a");
Color defaultButtonTextColor = Color.decode("#cecece");
Color defaultTextAreaBackgroundColor = Color.decode("#414141");
Color defaultTextAreaTextColor = Color.decode("#cecece");
Color defaultSkinColor = Color.decode("#353535");
Color progressColor = Color.decode("#00FFFF");
@Override
public void init() {
getContentPane().setBackground(defaultSkinColor);
UIManager.put("TextArea.background", defaultTextAreaBackgroundColor);
UIManager.put("TextArea.foreground", defaultTextAreaTextColor);
UIManager.put("control", defaultTextAreaBackgroundColor);
UIManager.put("nimbusLightBackground", defaultSkinColor);
UIManager.put("background", defaultSkinColor);
UIManager.put("text", defaultButtonTextColor);
UIManager.put("ComboBox.background", defaultSkinColor.darker().darker());
UIManager.put("Button.background", defaultSkinColor);
UIManager.put("info", defaultSkinColor.brighter().brighter());
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(NimbusColors.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
/* Create and display the applet */
try {
java.awt.EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
initComponents();
}
});
} catch (InterruptedException | InvocationTargetException ex) {
System.exit(11);
}
}
private void initComponents() {
jButtonBrowseFS = new javax.swing.JButton();
jButtonBrowseFS.setText("Browse");
jButtonBrowseFS.setToolTipText("Browse your filesystem to select files to upload");
jButtonBrowseFS.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jButtonBrowseFS.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jButtonBrowseFS)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jButtonBrowseFS)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
}
private javax.swing.JButton jButtonBrowseFS;
}
我在Netbeans 7.3.1中尝试了这段代码,创建了一个新的Java项目并添加了一个新的JApplet文件。如果我从Netbeans运行该文件十几次,有时按钮背景是黑色的,有时不是
有人能复制这种奇怪的行为吗?发生了什么事
更新1:我正在运行Windows 8 Pro我尝试了你的代码,但它总是显示相同的颜色。我认为您的Netbeans或jdk版本有问题。我使用的是NetBeans7.3和JDK1.6。
我尝试了你的代码,但它总是显示相同的颜色。我认为您的Netbeans或jdk版本有问题。我使用的是NetBeans7.3和JDK1.6。
- 对于JButton,是否使用了
- Java6/7之间没有变化
- 并不是所有的钥匙都像我们预期的那样工作,Nimbus有很多的价格(基于Nimbus的两个三个定制L&F解决了这个问题)
- 其中一种方法在所有情况下都适用于我,例如,通过使用Swing定时器故意延迟
Color.decode(#3535”)代码>返回
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.LookAndFeel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
public class NimbusTest3 {
private static final long serialVersionUID = 1L;
private javax.swing.JButton button;
private JFrame frame = new JFrame();
private Timer t;
public NimbusTest3() {
button = new javax.swing.JButton();
button.setText("Text");
frame.add(button);
frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
t = new Timer(1000, new ActionListener() {
private Random r = new Random();
@Override
public void actionPerformed(ActionEvent e) {
Color c = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
try {
LookAndFeel lnf = UIManager.getLookAndFeel().getClass().newInstance();
UIDefaults uiDefaults = lnf.getDefaults();
uiDefaults.put("nimbusBase", c);
UIManager.getLookAndFeel().uninitialize();
UIManager.setLookAndFeel(lnf);
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
UIDefaults defaults = UIManager.getDefaults();
defaults.put("Button.background", c);
SwingUtilities.updateComponentTreeUI(button);
t.stop();
}
});
t.start();
}
public static void main(String args[]) {
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
return;
}
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
NimbusTest3 nimbusTest3 = new NimbusTest3();
}
});
}
}
- 对于JButton,是否使用了
- Java6/7之间没有变化
- 并不是所有的钥匙都像我们预期的那样工作,Nimbus有很多的价格(基于Nimbus的两个三个定制L&F解决了这个问题)
- 其中一种方法在所有情况下都适用于我,例如,通过使用Swing定时器故意延迟
Color.decode(#3535”)代码>返回
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.LookAndFeel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
public class NimbusTest3 {
private static final long serialVersionUID = 1L;
private javax.swing.JButton button;
private JFrame frame = new JFrame();
private Timer t;
public NimbusTest3() {
button = new javax.swing.JButton();
button.setText("Text");
frame.add(button);
frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
t = new Timer(1000, new ActionListener() {
private Random r = new Random();
@Override
public void actionPerformed(ActionEvent e) {
Color c = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
try {
LookAndFeel lnf = UIManager.getLookAndFeel().getClass().newInstance();
UIDefaults uiDefaults = lnf.getDefaults();
uiDefaults.put("nimbusBase", c);
UIManager.getLookAndFeel().uninitialize();
UIManager.setLookAndFeel(lnf);
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
UIDefaults defaults = UIManager.getDefaults();
defaults.put("Button.background", c);
SwingUtilities.updateComponentTreeUI(button);
t.stop();
}
});
t.start();
}
public static void main(String args[]) {
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
return;
}
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
NimbusTest3 nimbusTest3 = new NimbusTest3();
}
});
}
}
我终于找到了解决办法
在netbeans中,我将按钮的background属性设置为某个值(不同于我想要的值,但也不同于默认的240240)
当我运行小程序时,现在我总是得到我所期望的,即使用Nimbus在代码中设置的颜色。我终于找到了解决方法
在netbeans中,我将按钮的background属性设置为某个值(不同于我想要的值,但也不同于默认的240240)
当我运行小程序时,现在我总是得到我所期望的,那就是使用Nimbus的代码中设置的颜色。@hellzone我使用的是jdk1.7.025。请尝试调整窗口大小,单击按钮等,然后重试。我不认为这取决于netbeas的版本,因为我在Google Chrome中运行CompletApplet时遇到了类似的问题。我尝试了所有的方法,但没有任何改变。安装JDK1.6并尝试使用它。jdk 1.7可能是问题所在。@hellzone在实际的小程序中我使用Java 7功能,因此如果它是Java 7缺陷,我必须接受它。@PaoloM:Stackoverflow上99.9%的人甚至不会尝试测试您的案例,因为一个原因,他们可能会犹豫构建一个html文件来测试您的代码。为了让别人更容易地测试您的代码,在发布与JApplet/Applet
相关的代码时,必须在.java文件
中插入这一小行,这样就不必编写html文件/***/
现在人们只需编写javac NimbusColors.java
来编译,然后appletviewer NimbusColors.java
来运行它:-)@PaoloM:这里也是一样,只是这一次,在多次尝试中,我得到了这个白色按钮,尽管大多数时候它是灰色的,可能是Nimbus
中的一个bug,它总是有一些问题:(@hellzone我正在使用jdk1.7.0_25。请尝试调整窗口大小,单击按钮等,然后重试。我不认为这取决于netbeas版本,因为我在Google Chrome中运行Complete小程序时遇到类似问题。我尝试了所有方法,但没有任何更改。安装jdk 1.6并尝试使用它。jdk 1.7可能是问题所在。@hell在实际的applet中,我使用Java 7功能,因此如果它是Java 7缺陷,我必须接受它…@PaoloM:Stackoverflow上99.9%的人可能甚至不会尝试测试您的案例,因为一个原因,他们可能会犹豫构建一个html文件来测试您的代码。为了让某人在发布代码时以更简单的方式测试您的代码与JApplet/Applet
相关,必须在.java文件中插入这一小行,这样就不必编写html文件。/***/
现在只需编写javac NimbusColors.java
进行编译,然后appletviewer NimbusColors.java
运行它:-)@PaoloM:这里也一样,只是这一次,在多次尝试中,我得到了这个白色按钮,尽管大多数时候它是灰色的,可能是因为它是Nimbus
中的一个bug,它总是有一些问题:(@mKorbel代码对我来说很有用。我不知道它与netbeans或JDK有什么关系,但代码工作得很好:)@hellzone代码不适用于您…正在工作的一组按钮背景颜色为深色。@mKorbel代码适用于我,伙计们。我不知道它与netbeans或JDK的关系,但代码工作正常:)@hellzone代码不适用于您。。。工作按钮将背景颜色设置为深色。默认情况下忽略背景是什么意思?如果我评论设置按钮的行。背景,我总是有一个灯光按钮,否则它只是偶尔发生。画家负责应用,绘制渐变背景抱歉,但我不明白。每次发生这种情况时,OPs从不阅读,也从不检查:-,如果您更改了Nimbus覆盖
(并非所有键都与覆盖对应),那么按钮。后台
可以被Java compilerOk接受,谢谢。出于好奇。。。你有没有试着在我的问题中重现这种奇怪的行为?我不明白为什么相同的代码(即使没有重新编译)在上的行为不同