允许多个JLabel中的文本重叠

时间:2016-08-03 14:06:45

标签: java swing jlabel

如果需要任何答案,这是上下文。我正在构建一个引擎,我将制作一个视频游戏。它包含一个96 x 54(列x行)字母表,以保持它们之间的均匀间距。因此,如果任何解决方案可以像合理可行的那样资源密集度最低,那将是非常有用的。我为这个引擎做了一个网络演示,除了有点慢之外,它完全按照预期工作。现在我正在将项目迁移到Java,有些东西没有按预期工作。

模仿HTML <table>我在一对GridLayout内使用JLabelJPanel来保持大小不变​​,所有这些都在JFrame内}。我面临的问题是,由于改变了表的大小以改善外观,JLabels略有重叠。在网络演示中,这很好,因为字母只是进入下一个框。这就是我想用Java实现的,而不能为我的生活找到方法。

这是一张图片,向您展示我的意思:

Here's an image to show you what I mean.

在左侧的网络演示中,我们在“a”的圆圈内有一圈下划线,右边有字母“pqyjg”。其中一个下划线上还有一个小灰盒子。这是下划线下方下方突出显示的框,显示下划线与其重叠1个像素。

当我们将相同的代码放入Java版本时,下划线无处可见,字母“pqyjg”上的尾部被切断。期望的效果是它像左边的例子一样工作。

我搜索了这个网站,互联网的其余部分,并通过许多Java类页面搜索了一个有用的方法,但无济于事。

任何人都可以指向我可以在JLabel或任何其他组件上调用的类或方法来实现此效果,而不会更改表的大小吗?

以下是我目前设置所有内容的代码,以防万一。

import javax.swing.*;
import static java.lang.Math.*;
import java.awt.*;

public class transparencyExample{

    //Declaring constants
    public static final Color[] MAINFRAME = {new Color(0x35ce4a), new Color(0x111111)};

    //Creating static variables and methods
    private static JLabel tempLabel;
    private static JLabel[][] table = new JLabel[54][96];
    private static JPanel layout = new JPanel(new GridLayout(54,96));
    private static JPanel background = new JPanel();
    private static BoxLayout box = new BoxLayout(background, 0);
    private static JFrame frame = new JFrame("Transparency Example");
    private static void initialise(){

        //Adding labels to table
        for (int i = 0; i < 5184; i++){
            tempLabel = new JLabel("M", SwingConstants.CENTER);
            tempLabel.setFont(new Font("Courier", Font.PLAIN, 15));
            table[(int) floor((double) i / 96)][i % 96] = tempLabel;
        }

        //Laying out the table
        layout.setPreferredSize(new Dimension(1056, 594));
        layout.setOpaque(false);
        for(int i = 0; i < 5184; i++){
            layout.add(table[(int) floor((double) i / 96)][i % 96]);
        }
        background.setBackground(MAINFRAME[1]);
        background.add(layout);

        //Laying out the frame
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(background);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    //Fill table
    public static void fill(String s){
        for(int i = 0; i < 5184; i++){
            table[(int) floor((double) i / 96)][i % 96].setText(String.valueOf(s.charAt(i)));
        }
    }
    public static void main(String[] args){
        initialise();
        transparencyExample.fill("                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         aaaaaaaa                                                                                       a   a    aa                                                                                    a _____     a                                                                                  a _     ___  a                                                                                 a_         __  a                                                                               a _           _ a     pqyjg                                                                   aa _            _ a                                                                             a  _             _ a                                                                           a   _             _ a                                                                           a   _             _ a                                                                           a   _             _ a                                                                           a    _           _  a                                                                           a    __          _ a                                                                            a      __      __  a                                                                             a       _______   a                                                                             a                a                                                                              a               aa                                                                               aa            a                                                                                   aa       aa                                                                                       aa aaaa                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  ");
    }
}

2 个答案:

答案 0 :(得分:3)

根据我的评论:

  

...我并不是100%关于你尝试创造的效果以及你可能遇到的问题,但是这类问题经常是由于试图人为地限制组件和容器的尺寸

是的,您的问题是您使用layout.setPreferredSize(new Dimension(1056, 594));人为地限制了布局JPanel的大小,这样可以防止它所拥有的所有组件都得到很好的显示。如果你摆脱了这一行,然后你打包并设置了Vframe(true)你的JFrame, 填充数据之后,你就会看到全文。

您的评论:

  

我试图保持表的大小相同,但是让JLabel重叠,以便它们的文本可以从一个溢出到另一个。

考虑选项2:不要使用JLabel,而是直接将您想要的文本绘制到JPanel的paintComponent方法中显示的BufferedImage中,或者直接在JPanel的paintComponent方法本身中。

答案 1 :(得分:1)

如果我很好理解,你的问题的一部分是如何设置JLabel的背景颜色?如果是,那么:

label.setOpaque(true);
label.setBackground(Color.lightGray);// Background color

我修改了你的代码以允许调整整个窗口的大小。然后,当字体大小适合标签空间时,问题是可见的。在我看来,你应该根据标签大小计算字体大小,类似于:https://stackoverflow.com/a/19194949/4448511

import javax.swing.*;
import static java.lang.Math.*;
import java.awt.*;



public class testG {

    //Declaring constants
    //public static final Color[] MAINFRAME = {new Color(0x35ce4a), new Color(0x111111)};
    public static final Color[] MAINFRAME = {Color.GREEN, Color.BLACK};

    //Creating static variables and methods
    private static JLabel tempLabel;
    private static JLabel[][] table = new JLabel[54][96];
    private static JPanel layout = new JPanel(new GridLayout(54,96));
    private static JPanel background = new JPanel(new BorderLayout());
    private static BoxLayout box = new BoxLayout(background, 0);
    private static JFrame frame = new JFrame("Transparency Example");
    private static void initialise(){

        //Adding labels to table
        for (int i = 0; i < 5184; i++){
            tempLabel = new JLabel("M", JLabel.CENTER);
            //tempLabel.setFont(new Font("Courier", Font.PLAIN, 15));
            tempLabel.setForeground(Color.GREEN);
            tempLabel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
            table[(int) floor((double) i / 96)][i % 96] = tempLabel;

        }

        //Laying out the table
        //layout.setPreferredSize(new Dimension(1056, 594));
        layout.setOpaque(false);
        for(int i = 0; i < 5184; i++){
            layout.add(table[(int) floor((double) i / 96)][i % 96]);
        }
        background.setBackground(MAINFRAME[1]);
        background.add(layout, BorderLayout.CENTER);

        //Laying out the frame
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(background);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    //Fill table
    public static void fill(String s){
        for(int i = 0; i < 5184; i++){
            JLabel labelTemp = table[(int) floor((double) i / 96)][i % 96];
            labelTemp.setText(String.valueOf(s.charAt(i)));
        }
    }
    public static void main(String[] args){
        initialise();
        testG.fill("                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         aaaaaaaa                                                                                       a   a    aa                                                                                    a _____     a                                                                                  a _     ___  a                                                                                 a_         __  a                                                                               a _           _ a     pqyjg                                                                   aa _            _ a                                                                             a  _             _ a                                                                           a   _             _ a                                                                           a   _             _ a                                                                           a   _             _ a                                                                           a    _           _  a                                                                           a    __          _ a                                                                            a      __      __  a                                                                             a       _______   a                                                                             a                a                                                                              a               aa                                                                               aa            a                                                                                   aa       aa                                                                                       aa aaaa                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  ");
    }

}