更改外观后是否可以保留按钮的边框? (Java 摇摆)
Is it possible to retain button's border after changing the Look and Feel? (Java Swing)
我目前正在进行一个允许用户选择外观的项目。
但是,当用户选择另一个外观并将其更改回原来的 CrossPlatformLookAndFeel 时,按钮的边框会消失。
代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class SSCCE {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame();
final JButton button = new JButton("Button");
button.setBorder(LineBorder.createBlackLineBorder());
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ev) {
try{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(frame);
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(frame);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
});
//
frame.setLayout(new FlowLayout(FlowLayout.CENTER));
frame.add(button);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
如您所见,单击按钮后边框消失。
那么问题来了:改变Look and Feel后边框还能保留吗?我知道在 WindowsLookAndFeel 中不会出现边框,但是 Look and Feel 改回默认后是否可以"reappear"?
上次我检查时,PLAF 中存在各种错误,这些错误导致了这些类型的奇怪行为。尤其是从 MetaL LAF 进行更改时(但很多内容也与 Nimbus 相关)。
获取应用程序的唯一可靠方法。更改 PLAF 是:
- 序列化用户选择的新 PLAF(即作为完全限定的 class 名称的
String
)。
- 启动一个调用
main(String[])
的新进程,它将检查要使用的新 PLAF 的序列化字符串,然后使用它。
- (可能将当前GUI的状态传递给新的GUI。)
- 关闭当前 GUI。
如您所见,'absolutely rock solid reliable' PLAF 更改非常麻烦。
我目前正在进行一个允许用户选择外观的项目。 但是,当用户选择另一个外观并将其更改回原来的 CrossPlatformLookAndFeel 时,按钮的边框会消失。
代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class SSCCE {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame();
final JButton button = new JButton("Button");
button.setBorder(LineBorder.createBlackLineBorder());
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ev) {
try{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(frame);
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(frame);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
});
//
frame.setLayout(new FlowLayout(FlowLayout.CENTER));
frame.add(button);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
如您所见,单击按钮后边框消失。
那么问题来了:改变Look and Feel后边框还能保留吗?我知道在 WindowsLookAndFeel 中不会出现边框,但是 Look and Feel 改回默认后是否可以"reappear"?
上次我检查时,PLAF 中存在各种错误,这些错误导致了这些类型的奇怪行为。尤其是从 MetaL LAF 进行更改时(但很多内容也与 Nimbus 相关)。
获取应用程序的唯一可靠方法。更改 PLAF 是:
- 序列化用户选择的新 PLAF(即作为完全限定的 class 名称的
String
)。 - 启动一个调用
main(String[])
的新进程,它将检查要使用的新 PLAF 的序列化字符串,然后使用它。 - (可能将当前GUI的状态传递给新的GUI。)
- 关闭当前 GUI。
如您所见,'absolutely rock solid reliable' PLAF 更改非常麻烦。