Java 为什么外观没有得到适当的更新?
我正在开发一个swing应用程序,在这个应用程序中,我可以选择在单击按钮时更改应用程序的外观。现在我的问题是,当我点击按钮更改主题时,它没有正确更新我的应用程序的L&F,假设我以前的主题是“noire”,然后我选择“MCWin”,但黑色主题的样式仍然存在 以下是示例工作代码:Java 为什么外观没有得到适当的更新?,java,swing,look-and-feel,Java,Swing,Look And Feel,我正在开发一个swing应用程序,在这个应用程序中,我可以选择在单击按钮时更改应用程序的外观。现在我的问题是,当我点击按钮更改主题时,它没有正确更新我的应用程序的L&F,假设我以前的主题是“noire”,然后我选择“MCWin”,但黑色主题的样式仍然存在 以下是示例工作代码: package whiteboard; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.
package whiteboard;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
public class DiscussionBoard extends JFrame implements ComponentListener,ActionListener {
// Variables declaration
private JMenuItem audioMenuItem;
private JMenuItem boardMenuItem;
private JMenuItem exitMenuItem;
private JMenuItem clientsMenuItem;
private JMenuItem acryl;
private JMenuItem hifi;
private JMenuItem aero;
private JMenuItem aluminium;
private JMenuItem bernstein;
private JMenuItem fast;
private JMenuItem graphite;
private JMenuItem luna;
private JMenuItem mcwin;
private JMenuItem noire;
private JMenuItem smart;
private JMenuBar boardMenuBar;
private JMenuItem messengerMenuItem;
private JMenu openMenu;
private JMenu saveMenu;
private JMenu themesMenu;
private JMenuItem saveMessengerMenuItem;
private JMenuItem saveWhiteboardMenuItem;
private JMenu userMenu;
JLayeredPane layerpane;
/** Creates new form discussionBoard
* @param connection */
public DiscussionBoard()
{
initComponents();
setLocationRelativeTo(null);
addComponentListener(this);
}
private void initComponents() {
boardMenuBar = new JMenuBar();
openMenu = new JMenu();
themesMenu = new JMenu();
messengerMenuItem = new JMenuItem();
boardMenuItem = new JMenuItem();
audioMenuItem = new JMenuItem();
saveMenu = new JMenu();
saveMessengerMenuItem = new JMenuItem();
saveWhiteboardMenuItem = new JMenuItem();
userMenu = new JMenu();
clientsMenuItem = new JMenuItem();
exitMenuItem = new JMenuItem();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLayout(new GridBagLayout());
setResizable(false);
setTitle("Discussion Board");
openMenu.setText("Open");
saveMenu.setText("Save");
themesMenu.setText("Themes");
acryl = new JMenuItem("Acryl");
hifi = new JMenuItem("HiFi");
aero = new JMenuItem("Aero");
aluminium = new JMenuItem("Aluminium");
bernstein = new JMenuItem("Bernstein");
fast = new JMenuItem("Fast");
graphite = new JMenuItem("Graphite");
luna = new JMenuItem("Luna");
mcwin = new JMenuItem("MCwin");
noire = new JMenuItem("Noire");
smart = new JMenuItem("Smart");
hifi.addActionListener(this);
acryl.addActionListener(this);
aero.addActionListener(this);
aluminium.addActionListener(this);
bernstein.addActionListener(this);
fast.addActionListener(this);
graphite.addActionListener(this);
luna.addActionListener(this);
mcwin.addActionListener(this);
noire.addActionListener(this);
smart.addActionListener(this);
messengerMenuItem.setText("Messenger");
openMenu.add(messengerMenuItem);
openMenu.add(boardMenuItem);
audioMenuItem.setText("Audio Messenger");
openMenu.add(audioMenuItem);
exitMenuItem.setText("Exit");
exitMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
exitMenuItemActionPerformed(evt);
}
});
openMenu.add(exitMenuItem);
boardMenuBar.add(openMenu);
saveMessengerMenuItem.setText("Messenger");
saveMenu.add(saveMessengerMenuItem);
saveWhiteboardMenuItem.setText("Whiteboard");
saveMenu.add(saveWhiteboardMenuItem);
boardMenuBar.add(saveMenu);
userMenu.setText("Users");
clientsMenuItem.setText("Current Session");
userMenu.add(clientsMenuItem);
themesMenu.add(acryl);
themesMenu.add(hifi);
themesMenu.add(aero);
themesMenu.add(aluminium);
themesMenu.add(bernstein);
themesMenu.add(fast);
themesMenu.add(graphite);
themesMenu.add(luna);
themesMenu.add(mcwin);
themesMenu.add(noire);
themesMenu.add(smart);
boardMenuBar.add(userMenu);
boardMenuBar.add(themesMenu);
saveMessengerMenuItem.setEnabled(false);
saveWhiteboardMenuItem.setEnabled(false);
setJMenuBar(boardMenuBar);
setSize(1024, 740);
setVisible(true);
}
protected void exitMenuItemActionPerformed(ActionEvent evt) {
System.exit(0);
}
@Override
public void componentHidden(ComponentEvent arg0) {
}
@Override
public void componentMoved(ComponentEvent e) {
}
@Override
public void componentResized(ComponentEvent arg0) {
}
@Override
public void componentShown(ComponentEvent arg0) {
}
@Override
public void actionPerformed(ActionEvent e)
{
try
{
if(e.getSource()==hifi)
{
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
SwingUtilities.updateComponentTreeUI(getRootPane());
UIManager.setLookAndFeel("com.jtattoo.plaf.hifi.HiFiLookAndFeel");
enableTheme();
hifi.setEnabled(false);
}
else if(e.getSource()==acryl)
{
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
SwingUtilities.updateComponentTreeUI(getRootPane());
UIManager.setLookAndFeel("com.jtattoo.plaf.acryl.AcrylLookAndFeel");
enableTheme();
acryl.setEnabled(false);
}
else if(e.getSource()==aero)
{
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
SwingUtilities.updateComponentTreeUI(getRootPane());
UIManager.setLookAndFeel("com.jtattoo.plaf.aero.AeroLookAndFeel");
enableTheme();
aero.setEnabled(false);
}
else if(e.getSource()==aluminium)
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(getRootPane());
UIManager.setLookAndFeel("com.jtattoo.plaf.aluminium.AluminiumLookAndFeel");
enableTheme();
aluminium.setEnabled(false);
}
else if(e.getSource()==bernstein)
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(getRootPane());
UIManager.setLookAndFeel("com.jtattoo.plaf.bernstein.BernsteinLookAndFeel");
enableTheme();
bernstein.setEnabled(false);
}
else if(e.getSource()==fast)
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(getRootPane());
UIManager.setLookAndFeel("com.jtattoo.plaf.fast.FastLookAndFeel");
enableTheme();
fast.setEnabled(false);
}
else if(e.getSource()==graphite)
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(getRootPane());
UIManager.setLookAndFeel("com.jtattoo.plaf.graphite.GraphiteLookAndFeel");
enableTheme();
graphite.setEnabled(false);
}
else if(e.getSource()==luna)
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(getRootPane());
UIManager.setLookAndFeel("com.jtattoo.plaf.luna.LunaLookAndFeel");
enableTheme();
luna.setEnabled(false);
}
else if(e.getSource()==mcwin)
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(getRootPane());
UIManager.setLookAndFeel("com.jtattoo.plaf.mcwin.McWinLookAndFeel");
enableTheme();
mcwin.setEnabled(false);
}
else if(e.getSource()==noire)
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(getRootPane());
UIManager.setLookAndFeel("com.jtattoo.plaf.noire.NoireLookAndFeel");
enableTheme();
noire.setEnabled(false);
}
else if(e.getSource()==smart)
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(getRootPane());
UIManager.setLookAndFeel("com.jtattoo.plaf.smart.SmartLookAndFeel");
enableTheme();
smart.setEnabled(false);
}
SwingUtilities.updateComponentTreeUI(getRootPane());
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
private void enableTheme()
{
acryl.setEnabled(true);
hifi.setEnabled(true);
aero.setEnabled(true);
aluminium.setEnabled(true);
bernstein.setEnabled(true);
fast.setEnabled(true);
graphite.setEnabled(true);
luna.setEnabled(true);
mcwin.setEnabled(true);
noire.setEnabled(true);
smart.setEnabled(true);
}
public static void main(String []ar)
{
try
{
UIManager.setLookAndFeel("com.jtattoo.plaf.acryl.AcrylLookAndFeel");
}
catch (Exception e)
{
e.printStackTrace();
}
new DiscussionBoard();
}
}
这里有什么问题?为什么它没有得到更新
有一个演示应用程序,这正是我想要的,但我不能得到一个清晰的想法
编辑:
对不起,忘了指定库文件,它是我不确定是什么原因造成的,但是您查看了吗
从API文档中:
使用当前外观的值重置UI属性
我试过你的例子,效果很好:
我在命令行中使用以下文件(
DiscussionBoard.java
目录下的whiteboard
)进行了尝试:
请注意,仅对非商业用途免费使用。移动
SwingUtilities.updateComponentTreeUI(getRootPane())代码>在设置LnF的调用之后调用。它对传递的组件下面树中的所有组件调用updateUI
。现在,您正在更新UI,然后对其进行更改。您正在使用第三方L&Fs(com.jtagto
)。它们是否在类路径中,或者当您尝试切换LookAndFeels时,是否会出现ClassNotFoundException
异常?抱歉,peter,我忘了指定库文件链接。你可以在这里找到它只是一个旁注:我会通过分解出一个常用方法来清理那些else if子句。参数可以是L&F名称的常量和JMENUItem。有什么想法吗???peter??得到了jtattoo主题的答案-->在应用新主题之前,我们需要将主题重置为默认主题,这可以通过““”com.jattoo.plaf.aero.AeroLookAndFeel.setTheme(“默认”);”完成。这很好。我不确定它到底做了什么。我刚刚发现了API中的描述、您的问题和代码中缺少调用之间的联系。它不会显示任何错误,但问题是它不会正确更新主题,请尝试随机选择主题,至少10个主题,它看起来不会是应该的样子。请参见以下链接中的屏幕截图,Ya peter,我没有将该主题用于商业用途app@swift:我尝试用您提供的代码更改L&F至少30次,但一切似乎都如预期的那样更改(标题栏、图标和菜单)。。。
JTattooDemo.jar
whiteboard/DiscussionBoard.java
javac whiteboard/DiscussionBoard.java
java -cp ".;JTattooDemo.jar" whiteboard/DiscussionBoard