Look and feel is not updating in Swing JTabbedPane

后端 未结 1 1265
灰色年华
灰色年华 2020-11-22 12:16

I have created an application in Java Swing. I offer the option to change the look and feel of the application from a menu, but after adding a new tab in JTabbedPane

相关标签:
1条回答
  • 2020-11-22 12:57

    Leveraging @Andrew's example and this old thing, it seems to work for me.

    enter image description here

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.Box;
    import javax.swing.BoxLayout;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTabbedPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.JToolBar;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.UIManager.LookAndFeelInfo;
    
    /**
    * @see https://stackoverflow.com/a/11949899/230513
    * @see https://stackoverflow.com/a/5773956/230513
    */
    public class JTabbedText {
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                private final JTabbedPane jtp = new JTabbedPane();
    
                @Override
                public void run() {
                    JFrame f = new JFrame();
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
                    jtp.addTab("Model", createPanel());
                    jtp.addTab("View", createPanel());
                    jtp.addTab("Control", createPanel());
    
                    f.add(createToolBar(f), BorderLayout.NORTH);
                    f.add(jtp, BorderLayout.CENTER);
                    f.pack();
                    f.setLocationRelativeTo(null);
                    f.setVisible(true);
                }
            });
        }
    
        private static JToolBar createToolBar(final Component parent) {
            final UIManager.LookAndFeelInfo[] available =
                UIManager.getInstalledLookAndFeels();
            List<String> names = new ArrayList<String>();
            for (LookAndFeelInfo info : available) {
                names.add(info.getName());
            }
            final JComboBox combo = new JComboBox(names.toArray());
            String current = UIManager.getLookAndFeel().getName();
            combo.setSelectedItem(current);
            combo.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent ae) {
                    int index = combo.getSelectedIndex();
                    try {
                        UIManager.setLookAndFeel(
                            available[index].getClassName());
                        SwingUtilities.updateComponentTreeUI(parent);
                    } catch (Exception e) {
                        e.printStackTrace(System.err);
                    }
                }
            });
            JToolBar bar = new JToolBar("L&F");
            bar.add(combo);
            return bar;
        }
    
        private static Box createPanel() {
            Box panel = new Box(BoxLayout.X_AXIS);
            JLabel label = new JLabel("Code: ", JLabel.LEFT);
            label.setAlignmentY(JLabel.TOP_ALIGNMENT);
            JTextArea text = new JTextArea(4, 16);
            text.setAlignmentY(JTextField.TOP_ALIGNMENT);
            text.append("#" + panel.hashCode());
            text.append("\n#" + label.hashCode());
            text.append("\n#" + label.hashCode());
            panel.add(label);
            panel.add(text);
            return panel;
        }
    }
    
    0 讨论(0)
提交回复
热议问题