JFrame添加Text无效。两个GUI出现

时间:2014-06-28 23:28:47

标签: java swing user-interface jframe jlabel

我正在尝试创建一个简单的JFrame菜单,其中有一个很好的背景,它可以和一些文本一起使用。文字有点儿麻烦。以下是它的外观(http://imgur.com/nRpzA30

如您所见,文本中只有一行不是第二行。

随之而来。运行程序时会出现两个GUI。一个是完全空的,一个看起来像上面的图片。

最后我不能使用方法logo.setHorizo​​ntalAlignment(JLabel.NORTH);没有得到错误,与其他一些错误相同。我测试和工作的两个只有.CENTER和.LEFT。

任何帮助都会很棒!

哦,差点忘了,这是我的代码:)

    package character;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;

/**
 * Created by Niknea on 6/28/14.
 */
public class characterSelector extends JFrame{


    JPanel cselectorText;

    JFrame  cselectorButtons;

    JLabel logo, characterName, label;

    JButton previous, next;


    public characterSelector(String title){
        super(title);

        this.createCharacterSelector();

        this.setSize(1920, 1033);
        this.setResizable(true);
        this.setVisible(true);
    }


    public void createCharacterSelector(){

      try {
            label = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/resources/Grass_Background.jpg"))));


            cselectorButtons = new JFrame();

            logo = new JLabel("SoccerKidz [REPLACE W/ COOL LOGO]");

            characterName = new JLabel("<Character Name>");

            logo.setPreferredSize(new Dimension(50, 50));



            logo.setFont(new Font(logo.getFont().getName(), Font.HANGING_BASELINE, 50));

            characterName.setFont(new Font(characterName.getFont().getName(), Font.HANGING_BASELINE, 50));

            cselectorButtons.add(logo);

            cselectorButtons.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            cselectorButtons.setContentPane(label);
            cselectorButtons.setLayout(new BorderLayout());
            characterName.setForeground(Color.CYAN);
            characterName.setHorizontalAlignment(JLabel.CENTER);
            cselectorButtons.add(characterName);
          logo.setForeground(Color.CYAN);
          logo.setHorizontalAlignment(JLabel.LEFT);
            cselectorButtons.add(logo);
            cselectorButtons.pack();
            cselectorButtons.setLocationRelativeTo(null);
            cselectorButtons.setVisible(true);
        } catch (IOException exp) {
            exp.printStackTrace();
        }
    }
}

再次感谢! :)

1 个答案:

答案 0 :(得分:1)

  

如您所见,文本中只有一行不是第二行。

您将cselectorButtons的布局设置为BorderLayout。然后你添加JLabel("<Character Name>");,这很好。但是你添加了JLabel("SoccerKidz [REPLACE W/ COOL LOGO]");。这是正在发生的事情。对于BorderLayout,当您只是add(component)时,通常您希望将BorderLayout.[POSITION]指定为add的第二个参数。如果不这样做,那么在没有指定位置的情况下添加的每个组件都将默认隐式添加BorderLayout.CENTER。这个问题是每个位置只能有一个组件。所以在你的情况下,第一个标签被踢出中心,只显示你添加的第二个标签。

  

运行程序时会出现两个GUI。一个是完全空的,一个看起来像上面的图片。

查看代码时。您的课程是JFrame,您不在其中添加任何内容,this.setVisible(true)。还有JFrame cselectorButtons;添加组件,还有cselectorButtons.setVisible(true);。你能猜出哪一个是你所看到的那个不是空的。不要扩展JFrame。只需使用您当前使用的实例。

  

最后,我不能使用方法logo.setHorizontalAlignment(JLabel.NORTH);而不会收到错误。

查看the API for JLabel并不需要太多。话虽这么说,是什么让你觉得水平对齐,应该包括一个位置向北的选项。没有意义

  
      
  • public void setHorizontalAlignment(int alignment)

         

    设置标签内容沿X轴的对齐方式。

         

    <强>参数:   alignment - SwingConstants中定义的以下常量之一: LEFT CENTER (仅限图片标签的默认设置), RIGHTLEADING(纯文字标签的默认设置)或TRAILING

  •   

如果BorderLayout不适合您,建议您查看Layout out Components Within a ContainerA Visual Guide to Layout Managers以了解可以使用的其他可能的布局管理器。另外请记住,您可以使用不同的布局管理器嵌套不同的面板,以获得所需的结果。但首先你需要了解它们是如何工作的。


<强>更新

我做了一些改动,这是有效的。我也在查看你的pastebin代码,并没有真正看到任何区别。您可能需要调查我的代码以尝试查找差异

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
 * Created by Niknea on 6/28/14.
 */
public class CharacterSelector {

    JPanel cselectorText;
    JFrame cselectorButtons;
    JLabel logo, characterName, label;
    JButton previous, next;

    public CharacterSelector() {
        createCharacterSelector();
    }

    public void createCharacterSelector() {

        try {
            label = new JLabel(new ImageIcon(ImageIO.read(getClass()
                    .getResource("/resources/Grass_Background.jpg"))));
            cselectorButtons = new JFrame();
            logo = new JLabel("SoccerKidz [REPLACE W/ COOL LOGO]");
            characterName = new JLabel("<Character Name>");
            logo.setPreferredSize(new Dimension(50, 50));
            logo.setFont(new Font(logo.getFont().getName(),
                    Font.HANGING_BASELINE, 50));
            characterName.setFont(new Font(characterName.getFont().getName(),
                    Font.HANGING_BASELINE, 50));
            cselectorButtons.add(logo);
            cselectorButtons.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            cselectorButtons.setContentPane(label);
            cselectorButtons.setLayout(new BorderLayout());
            characterName.setForeground(Color.CYAN);
            characterName.setHorizontalAlignment(JLabel.CENTER);
            cselectorButtons.add(characterName);
            logo.setForeground(Color.CYAN);
            logo.setHorizontalAlignment(JLabel.LEFT);
            cselectorButtons.add(logo, BorderLayout.NORTH);
            cselectorButtons.pack();
            cselectorButtons.setLocationRelativeTo(null);
            cselectorButtons.setVisible(true);
        } catch (IOException exp) {
            exp.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new CharacterSelector();
            }
        });
    }
}