将对象放到框架上
Putting objects onto Frames
我正在创建一个简单的掷骰子模拟,它会在按下按钮时掷骰子。我还没有添加动作侦听器,因为我在将对象显示到我的框架上时遇到问题。我创建了一个 class 来生成一个骰子并获取带有滚动数字的骰子图像,但我似乎无法将对象添加到我的框架中。
public class DieFrame extends JComponent
{
private static final int FRAME_WIDTH = 500;
private static final int FRAME_HEIGHT = 240;
private JButton rollButton;
private JLabel player1Score,player2Score, playerTurn;
Die die1 = new Die(1);
Die die2 = new Die(1);
public DieFrame()
{
JPanel panel = new JPanel();
player1Score = new JLabel("Player 1 score: ");
player2Score = new JLabel("Player 2 score: ");
panel.add(player1Score);
panel.add(player2Score);
panel.setBackground(Color.yellow);
add(panel, BorderLayout.NORTH);
setSize(FRAME_WIDTH, FRAME_HEIGHT);
createPlayerTurnPanel();
createDiePanel();
}
public void createPlayerTurnPanel()
{
JPanel turnPanel = new JPanel();
playerTurn = new JLabel("Player ");
rollButton = new JButton("Roll");
turnPanel.add(playerTurn);
turnPanel.add(rollButton);
add(turnPanel, BorderLayout.SOUTH);
}
public void createDiePanel()
{
JPanel diePanel = new JPanel();
diePanel.add(die1);
diePanel.setBackground(Color.BLACK);
add(diePanel, BorderLayout.CENTER);
}
}
public class DieFrame extends JComponent
您的 class 正在扩展 JComponent。
add(panel, BorderLayout.NORTH);
您假设组件将使用 BorderLayout。好吧,事实并非如此。它不使用任何布局管理器。
默认情况下,只有 JFrame (JDialog) 的内容窗格会使用 BorderLayout。
不要扩展 JComponent。它不是为用作容器而设计的,如果您尝试将其用作容器,它将无法正常工作。
相反,您可以扩展 JPanel
,它被设计用作容器,尽管它的布局管理器是 FlowLayout,因此您需要将布局设置为 BorderLayout
。
尽管您确实也不应该扩展 JPanel,因为您没有向面板添加新功能。相反,您应该创建一个 class,它将 return 为您提供一个包含组件的面板。阅读 How to Use Menus 上的 Swing 教程部分。 MenuLookDemo
有一个使用这种方法的工作示例。
我正在创建一个简单的掷骰子模拟,它会在按下按钮时掷骰子。我还没有添加动作侦听器,因为我在将对象显示到我的框架上时遇到问题。我创建了一个 class 来生成一个骰子并获取带有滚动数字的骰子图像,但我似乎无法将对象添加到我的框架中。
public class DieFrame extends JComponent
{
private static final int FRAME_WIDTH = 500;
private static final int FRAME_HEIGHT = 240;
private JButton rollButton;
private JLabel player1Score,player2Score, playerTurn;
Die die1 = new Die(1);
Die die2 = new Die(1);
public DieFrame()
{
JPanel panel = new JPanel();
player1Score = new JLabel("Player 1 score: ");
player2Score = new JLabel("Player 2 score: ");
panel.add(player1Score);
panel.add(player2Score);
panel.setBackground(Color.yellow);
add(panel, BorderLayout.NORTH);
setSize(FRAME_WIDTH, FRAME_HEIGHT);
createPlayerTurnPanel();
createDiePanel();
}
public void createPlayerTurnPanel()
{
JPanel turnPanel = new JPanel();
playerTurn = new JLabel("Player ");
rollButton = new JButton("Roll");
turnPanel.add(playerTurn);
turnPanel.add(rollButton);
add(turnPanel, BorderLayout.SOUTH);
}
public void createDiePanel()
{
JPanel diePanel = new JPanel();
diePanel.add(die1);
diePanel.setBackground(Color.BLACK);
add(diePanel, BorderLayout.CENTER);
}
}
public class DieFrame extends JComponent
您的 class 正在扩展 JComponent。
add(panel, BorderLayout.NORTH);
您假设组件将使用 BorderLayout。好吧,事实并非如此。它不使用任何布局管理器。
默认情况下,只有 JFrame (JDialog) 的内容窗格会使用 BorderLayout。
不要扩展 JComponent。它不是为用作容器而设计的,如果您尝试将其用作容器,它将无法正常工作。
相反,您可以扩展 JPanel
,它被设计用作容器,尽管它的布局管理器是 FlowLayout,因此您需要将布局设置为 BorderLayout
。
尽管您确实也不应该扩展 JPanel,因为您没有向面板添加新功能。相反,您应该创建一个 class,它将 return 为您提供一个包含组件的面板。阅读 How to Use Menus 上的 Swing 教程部分。 MenuLookDemo
有一个使用这种方法的工作示例。