Я пытаюсь сделать диспетчер колоды для карточной игры (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);
}
}