2014-08-29 47 views
2

我想创造出没有比JLabel的图像的我把它的其他边界或背景,使用OverlayLayout和扩展的JPanel半透明窗口...如何更改JLabel或其他任何我添加的组件的位置?

我的问题是,当我尝试通过添加更多组件我最初添加的这将是背景,我不知道如何启用更改新的组件位置.. x,y等...

如果可能请告诉我我可以做什么,不要只是指向布局经理,如果有人愿意给我看,我需要一个例子。

或者更好的是,让我看看我需要做些什么来达到预期的效果。比如将“text”(A JLabel)的位置改为10,10 ... x和y。

package core; 

import java.awt.AlphaComposite; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.LayoutManager; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JWindow; 
import javax.swing.OverlayLayout; 

public class App { 
    // Window & Panel... 
    public JWindow frame; 
    public TranslucentPanel panel; 

    // OverlayLayout 
    public LayoutManager overlay; 

    // Components 
    public JLabel bg; 
    public JLabel test; 

    // Constructor 
    public App() { 
     try { 
      // Basics... 
      frame = new JWindow(); 
      frame.setBackground(new Color(0, 0, 0, 0)); 

      // Overlay 
      panel = new TranslucentPanel(); 
      overlay = new OverlayLayout(panel); 
      panel.setLayout(overlay); 
      frame.setContentPane(panel); 

      // initComponents 
      initComponents(); 

      // Finalize Frame 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    // Initialize Additional Components 
    public void initComponents() throws Exception { 
     test = new JLabel("test"); 
     test.setForeground(Color.WHITE); 
     frame.add(test); 

     bg = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/ball.png")))); 
     frame.add(bg); 

     // What must I do to be able to do this??? 
     test.setLocation(10, 0); 
    } 

    // TranslucentPanel Class... 
    public class TranslucentPanel extends JPanel { 
     private static final long serialVersionUID = 1L; 

     public TranslucentPanel() { 
      setOpaque(false); 
     } 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      Graphics2D g2d = (Graphics2D)g.create(); 
      g2d.setComposite(AlphaComposite.SrcOver.derive(0.0f)); 
      g2d.setColor(getBackground()); 
      g2d.fillRect(0, 0, getWidth(), getHeight()); 
     } 
    } 
} 
+0

创建另一个'JPanel'(使其透明) ,适当地设置它的布局管理器,并为其添加组件。考虑根据需要使用复合布局来获得所需的效果。 – MadProgrammer 2014-08-29 11:34:41

+0

*“..以获得所需的效果”*提供ASCII艺术或简单的图形说明GUI如何以默认尺寸显示,并且(如果可调整大小)以额外的宽度/高度显示。 – 2014-08-29 11:38:01

+0

这是我想要的:http://imgur.com/ULxyKv8 我被卡住了顶部的图像。 – 2014-08-29 11:42:35

回答

3

一种方法是放弃Overlayout管理者,TranslucentPanel的布局管理器设置为类似BorderLayout并使用JLabelbg作为自身的容器......

bg = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/ball.png")))); 
frame.add(bg); 

// Set the layout of the JLabel  
bg.setLayout(new GridBagLayout()); 
test = new JLabel("test"); 
test.setForeground(Color.WHITE); 
// Add the test label to the bg JLabel... 
bg.add(test); 

就我个人而言,我不喜欢这个,因为JLabel在计算它的首选大小时没有考虑到组件(或布局管理器)。

个人而言,我会创建一个负责绘制背景图像的自定义背景组件。然后,我将放置其他组件,使用我需要的任何组件和布局管理器组合来生成所需的结果。

像素完美布局是现代UI设计中的幻想。影响组件的个体大小的因素太多,其中没有一个可以控制。摇摆设计为核心与布局管理工作,丢弃这些会导致没有问题,问题是,你将花费更多的时间,试图结束整顿

+0

@Charl Du Plessis,按照这个答案,你的问题解决了。 – 2014-08-29 11:59:34

+0

我试着实现上面的代码,我不知道如何做什么说,请尽可能让我看看如何。 – 2014-08-29 12:29:50

0

从您的代码阅读下面的作品后:

// What must I do to be able to do this??? 
    test.setLocation(10, 0); 

如果我理解正确,您想根据自定义坐标来安排组件的位置。如果是这样,那么你可以使用Insetshttp://docs.oracle.com/javase/7/docs/api/java/awt/Insets.html来实现这一点。 所以,你可以根据位置设置您的组件的位置,你想

 Insets insets = panel.getInsets(); 
    Dimension size =test.getPreferredSize(); 

    // just replace 10 & 0 according to X & Y postion you want. 
    test.setBounds(10 + insets.left, 0 + insets.top,size.width, size.height); 

这里是你修改的版本:

*请注意,我没有你的图标,所以我只是把你的文字标签上帮助你看到结果。

import java.awt.*; 
import javax.swing.*; 


public final class App{ 
    // Window & Panel... 
    public JWindow frame; 
    public TranslucentPanel panel; 

    // OverlayLayout 
    public LayoutManager overlay; 

    // Components 
    public JLabel bg; 
    public JLabel test; 

    // Constructor 
    public App() { 
     try { 
      // Basics... 
      frame = new JWindow(); 
      // Overlay 
      // Overlay 
      panel = new TranslucentPanel(); 
      overlay = new OverlayLayout(panel); 
      panel.setLayout(overlay); 
      frame.add(panel); 


      initComponents(); 
      // Finalize Frame 
      frame.pack(); 
      frame.setSize(400,400); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
     catch(Exception e) { e.printStackTrace();} 

    } 

    // Initialize Additional Components 
    public void initComponents() throws Exception { 
     test = new JLabel("test"); 
     test.setForeground(Color.RED); 

     panel.setLayout(null); 
     panel.add(test); 

     Insets insets = panel.getInsets(); 
     Dimension size =test.getPreferredSize(); 
     test.setBounds(10 + insets.left, 0 + insets.top, 
       size.width, size.height); 


     frame.add(panel); 

    } 

    // TranslucentPanel Class... 
    class TranslucentPanel extends JPanel { 
     private static final long serialVersionUID = 1L; 

     public TranslucentPanel() { 
      setOpaque(false); 
     } 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      Graphics2D g2d = (Graphics2D)g.create(); 
      g2d.setComposite(AlphaComposite.SrcOver.derive(0.0f)); 
      g2d.setColor(getBackground()); 
      g2d.fillRect(0, 0, getWidth(), getHeight()); 
     } 
    } 


public static void main (String args []){ 

    App ap = new App();  

} 
} 

输出:

enter image description here

如果声明为test.setBounds(500 + insets.left, 10 + insets.top,size.width, size.height);你的位置,然后输出将是:

enter image description here

+0

这看起来像一个相当不错的答案 - 你为什么要删除它? – Flexo 2014-11-15 23:34:29

相关问题