【问题标题】:JFrame adding Text not working. Two GUI appearJFrame 添加文本不起作用。出现两个GUI
【发布时间】:2014-08-19 17:52:31
【问题描述】:

我正在尝试创建一个简单的 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();
        }
    }
}

再次感谢! :)

【问题讨论】:

  • 您正在从 JFrame 类内部创建一个 JFrame。 cselectorButtons = new JFrame();class characterSelector extends JFrame 内。
  • 那么我将如何修复它?我不能让它为空。
  • 我不确定您到底想达到什么目标,因此不可能给出具体答案。从您在 JFrame 中有一个 JFrame 的事实来看,您最好的选择是考虑为您想要的内容创建单独的 JPanel,并将它们全部组合到一个 JFrame 中。

标签: java swing user-interface jframe jlabel


【解决方案1】:

如您所见,文本只出现了一行,没有出现第二行。

您将cselectorButtons 的布局设置为BorderLayout。然后你添加JLabel("&lt;Character Name&gt;");,这很好。但随后您添加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 中定义的以下常量之一:LEFTCENTER(仅图像标签的默认值)、RIGHT、@987654346 @(纯文本标签的默认值)或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();
            }
        });
    }
}

【讨论】:

  • 我无法删除“extends JFrame”行,因为我会从我的构造函数中收到一些错误(您可以在上面的代码中看到构造函数中的代码)。其次,我已将定位更改为您推荐的位置。这是我新的两行代码。 cselectorButtons.add(logo, BorderLayout.NORTH);和 cselectorButtons.add(characterName, BorderLayout.CENTER); ,但是现在都没有出现。对于我非常荒谬的问题,我深表歉意,我对 GUI 的了解才一周。
  • 这就是我要说的重点。你有一个类框架,你为它做this.someMethod(),比如this.setVisible()。但是您已经有另一个框架的另一个实例,您在其中 otherFraem.setVisible()。你不需要类框架。因此,当您删除 extends JFrame 时,请删除所有 this.someMethod,因为它们指的是 JFrame 类。
  • 啊,我明白了,它现在可以工作了。然而,遗憾的是我的另一个问题仍未解决。当我将所有定位更改为仅两行代码(cselectorButtons.add(logo, BorderLayout.NORTH); 和 cselectorButtons.add(characterName, BorderLayout.CENTER);)时,GUI 上什么也没有出现。如果您想查看,这是我的新代码:pastie.org/9336695。我想再次感谢您耐心地帮助我,我真的很感激。
  • 查看我的 UPDATE 我无法真正发现我的代码和您的代码有任何重大差异。也许你能找到它。但我的代码有效。刚刚测试过
  • 非常感谢它有效!我只有最后一个问题。这两个代码有什么区别?这是我放在主类中的代码: characterSelector character = new characterSelector();这是您使用的代码: SwingUtilities.invokeLater(new Runnable() { public void run() { new characterSelector(); } });两者都可以正常工作,但是我更经常看到您的代码。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 2019-02-04
  • 2014-04-05
  • 2011-10-06
  • 2016-08-16
  • 2012-07-30
相关资源
最近更新 更多