在 jbutton 中排序图像和文本

2022-01-24 00:00:00 java swing jbutton jframe chess

我试图将 JButton 上的文本覆盖在其后面的 ImageIcon 上.但是,当添加 imageIcon 时,文本会消失.有没有办法指定它的显示顺序?下面,我尝试分别添加图像和文本,看看是否会影响它,但没有运气.谁能帮帮我?

private void initButtons() {int 位置 X = 0,位置 Y = 525;for (int y = 0; y < 8; y++) {for (int x = 0; x < 8; x++) {boardArray[x][y] = new ChessButton();boardArray[x][y].setSize(75, 75);boardArray[x][y].setLocation(locationX, locationY);boardArray[x][y].setXAndY(x, y);如果 ((x % 2 == 0 && y % 2 == 1) || (x % 2 == 1 && y % 2 == 0)) {boardArray[x][y].setColour("white");boardArray[x][y].setIcon(new ImageIcon("Assets/white_null_null.png"));} 别的 {boardArray[x][y].setColour("black");boardArray[x][y].setIcon(new ImageIcon("Assets/black_null_null.png"));}//这以交替模式添加图像chessFrame.add(boardArray[x][y]);位置 X = 位置 X + 75;}位置 X = 0;位置 Y = 位置 Y - 75;}}无效的initPieces(){for (int y = 0; y < 8; y++) {for (int x = 0; x < 8; x++) {如果 ((x % 2 == 0 && y % 2 == 1) || (x % 2 == 1 && y % 2 == 0)) {boardArray[x][y].setFont(new Font("Arial Unicode MS", Font.PLAIN, 40));boardArray[x][y].setText("u2654");//将特定棋子设置为文本,现在只是测试它.} 别的 {boardArray[x][y].setFont(new Font("Arial Unicode MS", Font.PLAIN, 40));boardArray[x][y].setText("u2654");//将特定棋子设置为文本,现在只是测试它.//这应该将图像覆盖在文本上,但事实并非如此.}}}}

解决方案

首先,我看到你在调用这个方法:boardArray[x][y].setLocation(locationX, locationY);

.setLocation(...) 表示您使用的是 null 布局,请阅读

对于您未来的问题,请阅读如何制作一个有效的最小、完整且可验证的示例 (MCVE) 来证明您的问题并且您最好尝试自己解决它,我发布的代码就是一个很好的例子,因为您可以复制粘贴它并看到与我相同的结果

I am attempting to overlay the text on a JButton over an ImageIcon that is behind it. However, when the imageIcon is added, the text dissapears. Is there any way to specify the order in which it displays? Below, i have tried to separately add the images and text to see if that would affect it, but no luck. Can anyone help me out?

private void initButtons() {

    int locationX = 0, locationY = 525;

    for (int y = 0; y < 8; y++) {
        for (int x = 0; x < 8; x++) {
            boardArray[x][y] = new ChessButton();
            boardArray[x][y].setSize(75, 75);
            boardArray[x][y].setLocation(locationX, locationY);
            boardArray[x][y].setXAndY(x, y);

            if ((x % 2 == 0 && y % 2 == 1) || (x % 2 == 1 && y % 2 == 0)) {
                boardArray[x][y].setColour("white");
                boardArray[x][y].setIcon(new ImageIcon("Assets/white_null_null.png"));

            } else {

                boardArray[x][y].setColour("black");
                boardArray[x][y].setIcon(new ImageIcon("Assets/black_null_null.png"));

            }
//this adds the images in an alternating pattern

            chessFrame.add(boardArray[x][y]);
            locationX = locationX + 75;

        }
        locationX = 0;

        locationY = locationY - 75;

    }

}

void initPieces() {
    for (int y = 0; y < 8; y++) {
        for (int x = 0; x < 8; x++) {

            if ((x % 2 == 0 && y % 2 == 1) || (x % 2 == 1 && y % 2 == 0)) {
                boardArray[x][y].setFont(new Font("Arial Unicode MS", Font.PLAIN, 40));
                boardArray[x][y].setText("u2654");//sets a particular chess piece as text, just testing it now.

            } else {

                boardArray[x][y].setFont(new Font("Arial Unicode MS", Font.PLAIN, 40));
                boardArray[x][y].setText("u2654");//sets a particular chess piece as text, just testing it now.
//this is suposed to overlay the image over the text, but it is not.
            }

        }
    }
}

解决方案

First of all, I see you're calling this method: boardArray[x][y].setLocation(locationX, locationY);

.setLocation(...) indicates you're using a null layout, please read Null layout is evil and Why is it frowned upon to use a null layout in Swing? to know why you should avoid its use.

For creating a Chess board, I'd be using GridLayout, please read how to use the different layout managers

Now, to overlay text over the icon, you only need to call JButton#setHorizontalAlignment(...) method and pass SwingConstants.CENTER as the parameter.

For example:

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

import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

public class ButtonWithImageAndText {
    private JFrame frame;
    private JButton button;
    private Icon icon;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new ButtonWithImageAndText().createAndShowGui());
    }

    private void createAndShowGui() {
        frame = new JFrame(getClass().getSimpleName());
        try {
            icon = new ImageIcon(ImageIO.read(getClass().getResource("up.jpg")));
        } catch (IOException e) {
            e.printStackTrace();
        }
        button = new JButton();

        button.setIcon(icon);

        button.setText("Click me!");
        button.setHorizontalTextPosition(SwingConstants.CENTER);
        button.setFont(new Font("Arial", Font.PLAIN, 40));
        button.setForeground(Color.RED);

        frame.add(button);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

Which gives the following output:

For your future questions, please read how to make a valid Minimal, Complete and Verifiable Example (MCVE) that demonstrates your issue and your best try to solve it yourself, the code I posted is a good example of it, as you can copy-paste it and see the same result as I

相关文章