如何使JFrame外观和感知

时间:2016-12-01 14:27:55

标签: java swing look-and-feel

当我通过UIManager.setLookAndFeel设置外观时,框架的内容会按预期更改其外观。 E.g。

public static void main(String[] args) throws Exception {
  UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");

  JFrame frame = new JFrame();
  Container contentPane = frame.getContentPane();
  contentPane.setLayout(new FlowLayout());
  contentPane.add(new JButton("Some Button"));

  frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  frame.setSize(200, 80);
  frame.setLocationRelativeTo(null);
  frame.setVisible(true);
}

Nimbus Look and Feel Frame

但框架仍然使用操作系统默认设置(在我的情况下为Windows)。

如何使框架外观和感觉清晰,使其看起来像灵气的外观和感觉?

Look and feel aware frame

通常使用ComponentUI来实现外观,但JFrame不是JComponent,因此我无法实现自己的ComponentUI和{{3}它。

1。溶液

我的第一个想法是使用一个以set为主要成分的未修饰JFrame

public class LAFAwareJFrame extends JFrame {

  private JInternalFrame lafFrame = new JInternalFrame("", true, true, true, true);
  private JDesktopPane desktopPane = new JDesktopPane();


  public LAFAwareJFrame() {
    super.setUndecorated(true);
    desktopPane.add(lafFrame);
    lafFrame.setVisible(true);
    Container contentPane = super.getContentPane();
    contentPane.add(desktopPane);
  }

  @Override
  public void setUndecorated(boolean undecorated) {
    throw new UnsupportedOperationException("Can't change the undecorated property for a LAFAwareJFrame");
  }

  @Override
  public void setSize(int width, int height) {
    super.setSize(width, height);
    lafFrame.setSize(width, height);
  }

  @Override
  public Container getContentPane() {
    return lafFrame.getContentPane();
  }

  @Override
  public void setTitle(String title) {
    lafFrame.setTitle(title);
  }

    public static void main(String[] args) throws Exception {
      UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");

      JFrame frame = new LAFAwareJFrame();
      Container contentPane = frame.getContentPane();
      contentPane.setLayout(new FlowLayout());
      contentPane.add(new JButton("Some Button"));

      frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      frame.setSize(200, 80);
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
    }
}

但后来我与事件处理和委派有很多关系。例如,当JInternalFrame被移动时,我真的不想移动内部框架。相反,我想移动未装饰的框架。

2。溶液

仅将JInternalFrame用作渲染器。就像ListCellRender

由于所有解决方案都需要大量工作,我想先问你是否有更好的解决方案。例如。一个库或者它已经可以使用标准Java而且我错过了一些东西。

修改 我尝试使用JInternalFrame但它不适用于nimbus而不适用于motif。

0 个答案:

没有答案