我正在尝试制作纸牌游戏的套牌管理器(Yu-Gi-Oh:D),现在我只有一张带有可用纸牌的表格和一个面板,该面板以更大的尺寸显示用户选择的纸牌卡的说明。
MVCE:

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

    public class SelectedCardPanel 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!");
                    frame.add(new SelectedCardPanel());
                    frame.pack();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                }
            });
        }

        public SelectedCardPanel(){
            super();

            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            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();
            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);
        }

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


但这就是发生的情况:

在MVCE中:



cardArea位置正确,我不明白为什么。

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

最佳答案

问题出在BoxLayout上。相反,我建议使用BorderLayout并摆脱所有set[Preferred]Sizes。至于文本区域,请使用构造函数JTextArea(rows, cols)。对于可以保留为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);
    }
}

09-11 18:09