在JFrame中居中放置图像?

问题描述:

我正在为我的程序创建一个关于JFrame。我有一个用于该程序的图标,而且我已将它作为关于JFrame的第一件事物显示出来,但我在尝试将图像居中时出现问题。如果我做了一些中心调整,就会把所有其他事物的整个对齐关起来。在JFrame中居中放置图像?

我试图让所有的JLabels,除了图标,左对齐。然后让图标对齐中心。

我不得不删除一些个人信息,无论我删除了什么,我把它们放在“[]”之间。

import java.awt.Dimension; 
import java.awt.Font; 

import javax.swing.BorderFactory; 
import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class About extends JFrame { 

    public About() { 
     super("About [PROGRAM]"); 
     setIconImage([PROGRAM].getInstance().setIcon()); 

     JPanel main = new JPanel(); 

     main.setLayout(new BoxLayout(main, BoxLayout.Y_AXIS)); 
     main.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); 

     JLabel icon = new JLabel("", new ImageIcon(getClass().getResource(Constants.ICON_FULL)), JLabel.CENTER);   
     JLabel name = new JLabel("[PROGRAM]"); 
     JLabel expandedName = new JLabel("[PROGRAM DESCRIPTION]"); 
     JLabel copyright = new JLabel("[COPYRIGHT JUNK]"); 
     JLabel credits = new JLabel("[CREDITS]"); 

     name.setFont(new Font(name.getFont().getFamily(), Font.BOLD, 18)); 

     copyright.setBorder(BorderFactory.createEmptyBorder(0,0,10,0)); 

     main.add(icon); 
     main.add(Box.createRigidArea(new Dimension(0, 10))); 
     main.add(name); 
     main.add(expandedName); 
     main.add(copyright); 
     main.add(credits); 

     add(main); 

     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

} 
+1

要在后台为中心的图标?或只是围绕它的文字居中? – Soronthar

+0

都不是。我想要将图像和情侣标签堆叠在一起,但图像居中。 – samwell

考虑使用一些布局来帮助你。想到的内容包括BorderLayout和BorderLayout.CENTER位置上的图标。您可以使用使用JPanel的BoxLayout在一侧堆叠东西,该JPanel被添加到主BorderLayout中 - 使用JPanel。

例如,

import java.awt.BorderLayout; 
import java.awt.Font; 
import java.awt.event.ActionEvent; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class About extends JDialog { 
    public static final String IMAGE_PATH = "http://upload.wikimedia.org/wikipedia/" 
     + "commons/thumb/3/39/European_Common_Frog_Rana_temporaria.jpg/" 
     + "800px-European_Common_Frog_Rana_temporaria.jpg"; 

    public About(JFrame frame) { 
     super(frame, "About [PROGRAM]", true); 

     ImageIcon myIcon = null; 
     try { 
     URL imgUrl = new URL(IMAGE_PATH); 
     BufferedImage img = ImageIO.read(imgUrl); 
     myIcon = new ImageIcon(img); 
     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
     } 

     JPanel main = new JPanel(new BorderLayout()); 

     main.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 

     JLabel centerLabel = new JLabel(myIcon); 
     JLabel name = new JLabel("[PROGRAM]"); 
     JLabel expandedName = new JLabel("[PROGRAM DESCRIPTION]"); 
     JLabel copyright = new JLabel("[COPYRIGHT JUNK]"); 
     JLabel credits = new JLabel("[CREDITS]"); 

     name.setFont(new Font(name.getFont().getFamily(), Font.BOLD, 18)); 

     copyright.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); 

     int eb = 20; 
     centerLabel.setBorder(BorderFactory.createEmptyBorder(eb, eb, eb, eb)); 

     JPanel leftPanel = new JPanel(); 
     leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.PAGE_AXIS)); 
     leftPanel.add(name); 
     leftPanel.add(Box.createVerticalGlue()); 
     leftPanel.add(expandedName); 
     leftPanel.add(copyright); 
     leftPanel.add(credits); 
     leftPanel.add(Box.createVerticalGlue()); 

     main.add(centerLabel, BorderLayout.CENTER); 
     main.add(leftPanel, BorderLayout.LINE_START); 

     add(main); 

     pack(); 
    } 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame("GUI"); 
     JPanel panel = new JPanel(); 
     panel.add(new JButton(new AbstractAction("About") { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      About about = new About(frame); 
      about.setLocationRelativeTo(frame); 
      about.setVisible(true); 
     } 
     })); 
     frame.add(panel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 
+1

@ chudapati09:不客气!希望你喜欢青蛙。 –

+0

哈哈,我没注意到。我只是将你的代码概念应用到我的代码中。但是,这很有趣。 – samwell