Java-图标未对齐的JLabel(向右)

Java-图标未对齐的JLabel(向右),java,swing,jtable,jlabel,Java,Swing,Jtable,Jlabel,我正在尝试为纸牌游戏制作一个牌组管理器(Yu-Gi Oh:D),目前我只有一张桌子,上面有可用的牌,还有一个面板,上面显示了用户选择的更大尺寸的牌以及牌的描述。 MVCE: 但事实就是这样: 在MVCE中: 卡片区域向右,我不明白为什么 我在表中选择的卡会毫无问题地进入所选卡面板。 为什么JLabel会走向正确?问题在于BoxLayout。相反,我建议使用BorderLayout,去掉所有set[Preferred]大小。对于文本区域,使用构造函数JTextArea(行、列)。对于可以保留为0

我正在尝试为纸牌游戏制作一个牌组管理器(Yu-Gi Oh:D),目前我只有一张桌子,上面有可用的牌,还有一个面板,上面显示了用户选择的更大尺寸的牌以及牌的描述。 MVCE:

但事实就是这样: 在MVCE中:

卡片区域向右,我不明白为什么

我在表中选择的卡会毫无问题地进入所选卡面板。
为什么JLabel会走向正确?

问题在于BoxLayout。相反,我建议使用
BorderLayout
,去掉所有
set[Preferred]大小。对于文本区域,使用构造函数
JTextArea(行、列)
。对于可以保留为0的列,使用BorderLayout,它将拉伸以匹配图像的宽度

import java.awt.*;
import javax.swing.*;

public class SelectCardPanel extends JPanel{
    private final JLabel cardArea;
    private final JTextArea cardInfo;

    public static void main(String args[]){
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Yu-Gi-Oh!");
                SelectCardPanel panel = new SelectCardPanel();
                panel.setImage(new ImageIcon(SelectCardPanel.class.getResource("images.jpg")));
                frame.add(panel);
                frame.pack();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }

    public SelectCardPanel(){
        super();

        setLayout(new BorderLayout());
        //setPreferredSize(new Dimension(200, 400));

        cardArea = new JLabel();
        cardArea.setOpaque(true);
        cardArea.setBackground(Color.white);
        //cardArea.setPreferredSize(new Dimension(200, 300));
        //cardArea.setSize(cardArea.getPreferredSize());
        cardArea.setBorder(BorderFactory.createLineBorder(Color.black));

        cardInfo = new JTextArea(5, 0);
        cardInfo.setEditable(false);
        cardInfo.setWrapStyleWord(true);
        cardInfo.setLineWrap(true);
        //cardInfo.setPreferredSize(new Dimension(200, 100));
        cardInfo.setBorder(BorderFactory.createLineBorder(Color.black));

        add(cardArea);
        add(cardInfo, BorderLayout.PAGE_END);
    }

    public final void setImage(ImageIcon icon){
        cardArea.setIcon(icon);
    }
}


为了更快地获得更好的帮助,发布一个(最简单的完整和可验证的示例)。“我不知道在同一篇文章中问这两个问题是否合适”哇!你在一篇文章中处理了两个问题,其中没有一个“?”。。它们是什么?@AndrewThompson关于JLabel向右移动和表格没有添加新行的问题……我认为,由于标题中没有指定第二行,这可能是一种不好的方式……“我想知道如何解决这两个问题,提前感谢。”呵呵,我真的应该问你,不是吗?请把问题缩小到一个范围。@AndrewThompson很抱歉,谢谢你的指导:)
import java.awt.*;
import javax.swing.*;

public class SelectCardPanel extends JPanel{
    private final JLabel cardArea;
    private final JTextArea cardInfo;

    public static void main(String args[]){
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Yu-Gi-Oh!");
                SelectCardPanel panel = new SelectCardPanel();
                panel.setImage(new ImageIcon(SelectCardPanel.class.getResource("images.jpg")));
                frame.add(panel);
                frame.pack();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }

    public SelectCardPanel(){
        super();

        setLayout(new BorderLayout());
        //setPreferredSize(new Dimension(200, 400));

        cardArea = new JLabel();
        cardArea.setOpaque(true);
        cardArea.setBackground(Color.white);
        //cardArea.setPreferredSize(new Dimension(200, 300));
        //cardArea.setSize(cardArea.getPreferredSize());
        cardArea.setBorder(BorderFactory.createLineBorder(Color.black));

        cardInfo = new JTextArea(5, 0);
        cardInfo.setEditable(false);
        cardInfo.setWrapStyleWord(true);
        cardInfo.setLineWrap(true);
        //cardInfo.setPreferredSize(new Dimension(200, 100));
        cardInfo.setBorder(BorderFactory.createLineBorder(Color.black));

        add(cardArea);
        add(cardInfo, BorderLayout.PAGE_END);
    }

    public final void setImage(ImageIcon icon){
        cardArea.setIcon(icon);
    }
}