2012-11-07 76 views
2

我正在开发一个应用程序来设计一个关键系统。主界面由复选框的“矩阵”组成,显示锁和键之间的对应关系。可以给每个锁和钥匙一个名字以帮助将它们分配给适当的所有者。为了节省空间,我想倾斜文本框的锁名称。摆动重叠组件

The current mess The goal

我的初步尝试的截图所示(涂成红色边框),以及我的目标是什么的图。 JXTransformer类允许我旋转字段,现在字段只是在没有布局管理器的情况下完全定位。

问题是,旋转的文本字段似乎有一个不透明的“背景”,以随机的方式遮蔽其他文本字段。我不确定这是否是JXTransformer的工件,或者是否无法在Swing中重叠组件。

我非常感谢任何帮助或证明,这是不可能的。

编辑:只是为了澄清,布局被冻结,并不需要允许调整大小。

回答

1

它在某种程度上取决于您使用的Java版本。亚历山大Potochkin写了一个名为JXLayer库,您可以使用预Java 7中简略地介绍了这一点,你可以在这里找到: JXLayer introduction

这已演变成JLayer,你现在可以在Java 7中的一些基本的发现您可以在以下页面找到此示例: JLayer video

基本上,您可以做的是在您的组件顶部编写一个UI,执行2D旋转。过去我成功地使用了这种方法。

enter image description here

import java.awt.*; 

import javax.swing.*; 
import javax.swing.plaf.LayerUI; 

/** 
* Example of rotation using {@link JLayer} in Java7. 
*/ 
public class TiltedApproach { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame("Tilted components"); 
       LayerUI<JComponent> layerUI = new RotateUI(); 
       JPanel panel = new MyPanel(); 
       JLayer<JComponent> jLayer = new JLayer<JComponent>(panel, layerUI); 
       frame.getContentPane().add(jLayer); 
       frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
       frame.setMinimumSize(new Dimension(800, 450)); 
       frame.setLocationRelativeTo(null); // Center 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    static class MyPanel extends JPanel { 

     MyPanel() { 
      add(new JLabel("Hello")); 
      add(new JLabel("World")); 
     } 
    } 

    static class RotateUI extends LayerUI<JComponent> { 
     @Override 
     public void paint(Graphics g, JComponent c) { 
      Graphics2D g2 = (Graphics2D) g.create(); 
      g2.rotate(0.4); 
      super.paint(g2, c); 
      g2.dispose(); 
     } 
    } 
} 
+0

谢谢!我会尝试一下。 – jforberg