2012-06-26 18 views
5

Ich erstelle ein über JFrame für mein Programm. Ich habe ein Icon, das ich für das Programm verwendet habe und das habe ich als erstes über JFrame entdeckt, aber ich habe Probleme, das Bild zu zentrieren. Wenn ich irgendeine Art von Zentrierung mache, vermasselt es die gesamte Ausrichtung von allem anderen.Bild in einem JFrame zentrieren?

Ich versuche, alle JLabels, außer dem Symbol, links ausgerichtet zu haben. Dann muss das Symbol auf die Mitte ausgerichtet sein.

Ich musste einige persönliche Informationen entfernen, was auch immer ich entfernte, ich legte sie zwischen "[]".

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

wollen Sie das Symbol in den Hintergrund zentriert werden? oder nur mit dem Text zentriert? – Soronthar

+0

Weder. Ich wollte ein Bild und paar Etiketten übereinander gestapelt haben, aber das Bild zentriert haben. – samwell

Antwort

4

Verwenden Sie einige Layouts, um Ihnen zu helfen. In den Sinn kommen BorderLayout mit dem Symbol in der BorderLayout.CENTER-Position. Sie können das Material auf einer Seite mit einem BoxLayout mit JPanel stapeln, das zum Haupt-BorderLayout-JPanel hinzugefügt wird.

z.B.

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: Gern geschehen! Hoffe, dass du den Frosch mochtest. –

+0

Haha, das habe ich nicht bemerkt. Ich habe Ihre Code-Konzepte nur auf meinen Code angewendet. Das war aber ziemlich lustig. – samwell