在 JPanel 中看不到 JLayeredPane 中的内容
Cannot see the contents in the JLayeredPane in a JPanel
我正在尝试创建一个棋盘 class,它扩展 JPanel 用于西洋双陆棋游戏和 JLayeredPane 来为我的跳棋创建拖动区域,但我什至无法在面板上打印一个简单的矩形。它打印图像但不打印 JLabel。
这是我的 JPanel class
public class BoardPanel extends JPanel{
private JLayeredPane lp;
private BufferedImage imageBoard;
private final int WIDTH = 1000;
private final int HEIGHT = 800;
private ArrayList<Slot> slotSet1;
private ArrayList<Slot> slotSet2;
private ArrayList<Slot> slotSet3;
private ArrayList<Slot> slotSet4;
private CheckerSet ch1;
public Checker chc;
public BoardPanel(){
initComponents();
}
private void initComponents(){
lp = new JLayeredPane();
setPreferredSize(new java.awt.Dimension(1500, 1000));
//lp.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
lp.setBorder(javax.swing.BorderFactory.createTitledBorder("asdadsaddadsadasdadsa"));
lp.setMaximumSize(new java.awt.Dimension(1124, 904));
lp.setMinimumSize(new java.awt.Dimension(1124, 904));
try {
imageBoard = ImageIO.read(getClass().getResource("/images/board.jpg"));
} catch (IOException e) {
System.out.println("file error");
}
JLabel label = new JLabel();
label.setVerticalAlignment(JLabel.TOP);
label.setHorizontalAlignment(JLabel.CENTER);
label.setOpaque(true);
label.setBackground(Color.BLACK);
label.setForeground(Color.black);
label.setBorder(BorderFactory.createLineBorder(Color.black));
label.setBounds(0, 0, 50, 50);
lp.add(label,JLayeredPane.DEFAULT_LAYER);
}
public void paintComponent(Graphics g){
//g.drawImage(imageBoard,0,0,null);
}
}
还有主要的
public static void main(String[] args){
JFrame f = new JFrame();
//GamePanel gp = new GamePanel();
BoardPanel gp = new BoardPanel();
f.add(gp);
//f.getContentPane().add(gamePanel);
f.setSize(new Dimension(1500, 1000));
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
我该如何解决?谢谢大家
您必须向 JLayeredPane 添加布局,例如 GridLayout。试试这个:
GridLayout gl = new GridLayout(20, 21);
lp.setLayout(gl);
初始化后 lp
。然后你可以将你需要的所有组件添加到 GridLayout,例如 lp:
gl.add(lp)
布局将管理事物的显示方式;在这种情况下,它将填充 GridLayout 中的网格,首先是第一行(存在 20 行),然后是第二行,依此类推(我认为您实际上不需要 20 行,就像我的示例代码)
我正在尝试创建一个棋盘 class,它扩展 JPanel 用于西洋双陆棋游戏和 JLayeredPane 来为我的跳棋创建拖动区域,但我什至无法在面板上打印一个简单的矩形。它打印图像但不打印 JLabel。 这是我的 JPanel class
public class BoardPanel extends JPanel{
private JLayeredPane lp;
private BufferedImage imageBoard;
private final int WIDTH = 1000;
private final int HEIGHT = 800;
private ArrayList<Slot> slotSet1;
private ArrayList<Slot> slotSet2;
private ArrayList<Slot> slotSet3;
private ArrayList<Slot> slotSet4;
private CheckerSet ch1;
public Checker chc;
public BoardPanel(){
initComponents();
}
private void initComponents(){
lp = new JLayeredPane();
setPreferredSize(new java.awt.Dimension(1500, 1000));
//lp.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
lp.setBorder(javax.swing.BorderFactory.createTitledBorder("asdadsaddadsadasdadsa"));
lp.setMaximumSize(new java.awt.Dimension(1124, 904));
lp.setMinimumSize(new java.awt.Dimension(1124, 904));
try {
imageBoard = ImageIO.read(getClass().getResource("/images/board.jpg"));
} catch (IOException e) {
System.out.println("file error");
}
JLabel label = new JLabel();
label.setVerticalAlignment(JLabel.TOP);
label.setHorizontalAlignment(JLabel.CENTER);
label.setOpaque(true);
label.setBackground(Color.BLACK);
label.setForeground(Color.black);
label.setBorder(BorderFactory.createLineBorder(Color.black));
label.setBounds(0, 0, 50, 50);
lp.add(label,JLayeredPane.DEFAULT_LAYER);
}
public void paintComponent(Graphics g){
//g.drawImage(imageBoard,0,0,null);
}
}
还有主要的
public static void main(String[] args){
JFrame f = new JFrame();
//GamePanel gp = new GamePanel();
BoardPanel gp = new BoardPanel();
f.add(gp);
//f.getContentPane().add(gamePanel);
f.setSize(new Dimension(1500, 1000));
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
我该如何解决?谢谢大家
您必须向 JLayeredPane 添加布局,例如 GridLayout。试试这个:
GridLayout gl = new GridLayout(20, 21);
lp.setLayout(gl);
初始化后 lp
。然后你可以将你需要的所有组件添加到 GridLayout,例如 lp:
gl.add(lp)
布局将管理事物的显示方式;在这种情况下,它将填充 GridLayout 中的网格,首先是第一行(存在 20 行),然后是第二行,依此类推(我认为您实际上不需要 20 行,就像我的示例代码)