【问题标题】:Jcomponents display issue in Native look and feelJcomponents 在本机外观中显示问题
【发布时间】:2014-06-17 12:20:59
【问题描述】:

我有一个简单的 GUI,其中包含 JButton、JMenuBar。这在正常情况下工作正常(显示和对齐)但如果我在 UIManager 代码下面使用它不正确,

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

我面临的问题的 SSSCE 发布在下面,

import java.awt.HeadlessException;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class UiManagerEx extends JFrame{
    JMenuBar menuBar;
    JTextField textField;
    JLabel labl;
    JButton btn;

    public static void main(String[] args) {
        new UiManagerEx();
    }

    public UiManagerEx() throws HeadlessException {
        init();
    }
    private void init(){
        JPanel panel = new JPanel();

        menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("Example");
        menuBar.add(fileMenu);

        JMenuItem menuAction = new JMenuItem("ONE");
        fileMenu.add(menuAction);

        JMenuItem menu1Action = new JMenuItem("TWO");
        fileMenu.add(menu1Action);

        labl = new JLabel("Test");
        textField = new JTextField("example Program");
        btn = new JButton("enable");
        btn.setEnabled(false); // Make it true and the text will be visible.

        GroupLayout settingsLayout = new GroupLayout(panel);
        panel.setLayout(settingsLayout);
        settingsLayout.setAutoCreateGaps(true);
        settingsLayout.setAutoCreateContainerGaps(true);
        GroupLayout.SequentialGroup hGroup = settingsLayout.createSequentialGroup();
        hGroup.addGroup(settingsLayout.createParallelGroup()
                .addComponent(labl));
        hGroup.addGap(10);
        hGroup.addGroup(settingsLayout.createParallelGroup()
                .addComponent(textField,GroupLayout.PREFERRED_SIZE, 200, GroupLayout.PREFERRED_SIZE));
        hGroup.addGap(10);
        hGroup.addGroup(settingsLayout.createParallelGroup()
                .addComponent(btn,GroupLayout.PREFERRED_SIZE, 100, GroupLayout.PREFERRED_SIZE));
        hGroup.addGap(10);
        settingsLayout.setHorizontalGroup(hGroup);
        GroupLayout.SequentialGroup vGroup = settingsLayout.createSequentialGroup();
        vGroup.addGap(10);
        vGroup.addGroup(settingsLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(labl)
                .addComponent(textField)
                .addComponent(btn));
        vGroup.addGap(10);

        settingsLayout.setVerticalGroup(vGroup);
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); //Comment this to make "alignement of JmenuItem" work properly
        } catch (ClassNotFoundException ex) {}
        catch (InstantiationException ex) {}
        catch (IllegalAccessException ex) {}
        catch (UnsupportedLookAndFeelException ex) {}

        add(panel);
        setJMenuBar(menuBar);
        setTitle("Stack overflow");
        setResizable(true);
        setSize(400, 200);
        setLocationRelativeTo(this);
        setVisible(true);
    }
}

在原生外观中,

  1. 如果我设置Jbutton.SetEnabled(false),Jbutton 的文本(启用)不可见
  2. JmenuBar 显示不正确。(单击菜单栏时菜单项未正确对齐)。

在处理这些问题的 java 应用程序中是否有任何方法可以让我获得原生外观。

我是新手..请帮忙!

【问题讨论】:

    标签: java look-and-feel jcomponent


    【解决方案1】:

    在创建对象之前设置 LookAndFeel。然后显示按钮文本: 但我无法解释为什么。也许有一些依赖于 LookAndFeel 的初始化

    private void init(){
     try {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); // Comment this to make
                                                                               // "alignement of JmenuItem" work
                                                                               // properly
        }
        catch (ClassNotFoundException ex) {
          ex.printStackTrace();
        }
        catch (InstantiationException ex) {
          ex.printStackTrace();
        }
        catch (IllegalAccessException ex) {
          ex.printStackTrace();
        }
        catch (UnsupportedLookAndFeelException ex) {
          ex.printStackTrace();
        }
        JPanel panel = new JPanel();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 2012-09-13
      • 2017-12-17
      相关资源
      最近更新 更多