java - 在 JFrame 中居中图像?

标签 java swing jframe jlabel imageicon

我正在为我的程序创建一个 about JFrame。我有一个用于该程序的图标,它显示为关于 JFrame 的第一件事,但我在尝试使图像居中时遇到问题。如果我做某种居中操作,它会搞砸其他所有内容的整体对齐。

我试图让除图标之外的所有 JLabel 左对齐。然后让图标与中心对齐。

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

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);
    }

}

最佳答案

考虑使用一些布局来帮助您。想到的包括 BorderLayout,其图标位于 BorderLayout.CENTER 位置。您可以使用使用 JPanel 的 BoxLayout 在一侧堆叠东西,该 JPanel 添加到主要的 BorderLayout-using 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);
   }
}

关于java - 在 JFrame 中居中图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11217613/

相关文章:

java - 为什么我需要在Java Guava中实现Apply功能?

java - Linux Bootstrap 消耗内存

java 什么更重 : Canvas or paintComponent()?

java - Eclipse 不打开框架窗口

Java JButton 不会遍历容器中的 JLabel(带有图像)

java - 所有 com.android.support 库和 SDK 版本都必须相同、更高还是更低?

java - 如何让oracle db支持md5加密?

java - 从 Swing GUI 编译和运行 Java 代码

Java swing jLayeredPane

java - 如何将图像高度调整为 JFrame 高度?