swing怎么在一个程序中让不同的组件显示不同的外观风格呀
我自己写了一个小程序,但是运行时,当我通过点击程序中更改外观的按钮后,抛出了一大堆异常
哪位大牛能帮我看下是哪里出了问题
我总共写了两个类,一个是MainFrame:继承JFrame,主要就是创建主程序并将其显示出来
另一个是PreviewPanel:继承JPanel,用来容纳需要更改外观的组件
下面是代码:
MainFrame:public class MainFrame extends JFrame { private JPanel contentPane;
private PreviewPanel previewPanel; /**
* main方法
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
//在frame初始化之前先设置外观
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
MainFrame frame = new MainFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} /**
* Create the frame.
*/
public MainFrame() {
previewPanel = new PreviewPanel();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 452, 436);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new BorderLayout(0, 0)); //设置contentPane为BorderLayout JButton btn1 = new JButton("预览");
contentPane.add(btn1, BorderLayout.NORTH); //添加名为“预览”的按钮
btn1.addActionListener(new ActionListener() { //-
public void actionPerformed(ActionEvent e) {
previewPanel.setLookAndFeel(); //
}
}); contentPane.add(previewPanel); //添加预览面板
}
}
PreviewPanel:public class PreviewPanel extends JPanel {
JButton previewBtn; // 被预览的按钮 /**
* 构造函数: 向面板添加JTabbedPane,并在JTabbedPane中添加放置了previewBtn按钮的buttonPanel面板
*/
public PreviewPanel() {
setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
add(tabbedPane); JPanel buttonPanel = new JPanel();
tabbedPane.addTab("JButton", null, buttonPanel, null); previewBtn = new JButton("JButton");
buttonPanel.add(previewBtn);
} /**
* 设置外观的方法
*/
public void setLookAndFeel() {
try {
SynthLookAndFeel synth = new SynthLookAndFeel();
// 加载配置文件demo.xml
synth.load(new URL("file:///E:\\EEWork\\Apem\\eclipseWork1"
+ "\\synth\\src\\demo\\synth\\demo.xml"));
UIManager.setLookAndFeel(synth);
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
} SwingUtilities.updateComponentTreeUI(previewBtn);// 更新previewBtn按钮的外观
}
}
下面是程序设置外观过程中报的异常:Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.sun.java.swing.plaf.windows.WindowsTabbedPaneUI.paintContentBorder(WindowsTabbedPaneUI.java:145)
at javax.swing.plaf.basic.BasicTabbedPaneUI.paint(BasicTabbedPaneUI.java:791)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
at javax.swing.JComponent.paintComponent(JComponent.java:780)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5217)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502)
at javax.swing.RepaintManager.paint(RepaintManager.java:1272)
at javax.swing.JComponent.paint(JComponent.java:1042)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:79)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:116)
at java.awt.Container.paint(Container.java:1976)
at java.awt.Window.paint(Window.java:3906)
at javax.swing.RepaintManager$4.run(RepaintManager.java:842)
at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
我自己写了一个小程序,但是运行时,当我通过点击程序中更改外观的按钮后,抛出了一大堆异常
哪位大牛能帮我看下是哪里出了问题
我总共写了两个类,一个是MainFrame:继承JFrame,主要就是创建主程序并将其显示出来
另一个是PreviewPanel:继承JPanel,用来容纳需要更改外观的组件
下面是代码:
MainFrame:public class MainFrame extends JFrame { private JPanel contentPane;
private PreviewPanel previewPanel; /**
* main方法
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
//在frame初始化之前先设置外观
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
MainFrame frame = new MainFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} /**
* Create the frame.
*/
public MainFrame() {
previewPanel = new PreviewPanel();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 452, 436);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new BorderLayout(0, 0)); //设置contentPane为BorderLayout JButton btn1 = new JButton("预览");
contentPane.add(btn1, BorderLayout.NORTH); //添加名为“预览”的按钮
btn1.addActionListener(new ActionListener() { //-
public void actionPerformed(ActionEvent e) {
previewPanel.setLookAndFeel(); //
}
}); contentPane.add(previewPanel); //添加预览面板
}
}
PreviewPanel:public class PreviewPanel extends JPanel {
JButton previewBtn; // 被预览的按钮 /**
* 构造函数: 向面板添加JTabbedPane,并在JTabbedPane中添加放置了previewBtn按钮的buttonPanel面板
*/
public PreviewPanel() {
setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
add(tabbedPane); JPanel buttonPanel = new JPanel();
tabbedPane.addTab("JButton", null, buttonPanel, null); previewBtn = new JButton("JButton");
buttonPanel.add(previewBtn);
} /**
* 设置外观的方法
*/
public void setLookAndFeel() {
try {
SynthLookAndFeel synth = new SynthLookAndFeel();
// 加载配置文件demo.xml
synth.load(new URL("file:///E:\\EEWork\\Apem\\eclipseWork1"
+ "\\synth\\src\\demo\\synth\\demo.xml"));
UIManager.setLookAndFeel(synth);
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
} SwingUtilities.updateComponentTreeUI(previewBtn);// 更新previewBtn按钮的外观
}
}
下面是程序设置外观过程中报的异常:Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.sun.java.swing.plaf.windows.WindowsTabbedPaneUI.paintContentBorder(WindowsTabbedPaneUI.java:145)
at javax.swing.plaf.basic.BasicTabbedPaneUI.paint(BasicTabbedPaneUI.java:791)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
at javax.swing.JComponent.paintComponent(JComponent.java:780)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paint(JComponent.java:1065)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
at javax.swing.JComponent.paintChildren(JComponent.java:889)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5217)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502)
at javax.swing.RepaintManager.paint(RepaintManager.java:1272)
at javax.swing.JComponent.paint(JComponent.java:1042)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:79)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:116)
at java.awt.Container.paint(Container.java:1976)
at java.awt.Window.paint(Window.java:3906)
at javax.swing.RepaintManager$4.run(RepaintManager.java:842)
at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
而且我自己试了一下,如果在预览面板中不用JTabbedPane,直接把组件放在JPanel中就不会报异常,但是这个涉及到我的毕业设计需要预览很多组件,这样的话就又要用JTabbedPane来将组件分类