我目前正在开发一款小游戏,但我遇到了一个问题:
我有三个类,第一个是JFrame:
public class Game
{
public static void main(String[] args)
{
new Game().gui();
}
public void gui()
{
DrawPanel panel = new DrawPanel();
JFrame frame = new JFrame("Test");
//frame.add(panel);
frame.add(new MainMenu());
frame.setSize(800, 700);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
}
}
现在我有另外两个类,一个是mainMenu,目前只包含一个JButton。 我决定将菜单设为自己的类,因为后来我想通过按下escape来调用菜单,但问题是(出于测试原因)我想在" start"被压了。我尝试了不同的方法但没有任何反应。
public class MainMenu extends JPanel implements ActionListener
{
GamePanel panel = new GamePanel();
public MainMenu()
{
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
JButton b1 = new JButton("Start");
c.fill = GridBagConstraints.HORIZONTAL;
c.ipadx = 200;
b1.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
});
add(b1, c);
}
}
public class DrawPanel extends JPanel
{
public void paint(Graphics g)
{
g.drawRect (10, 10, 200, 200);
}
}
答案 0 :(得分:1)
我在您的代码中发现了一些错误:
您没有将DrawPanel
添加到任何内容中,因为此行
frame.add(panel);
被评论,因此,这导致我们遇到下一个问题:
您将覆盖paint()
方法,而不是paintComponent()
,也不要忘记致电
super.paintComponent();
在方法的最开始。没有它,您将阻止您的代码继续绘制其余组件。请参阅Custom painting in Swing
由于您尚未为DrawPanel
宣布某个位置,因此它仍然没有显示任何内容,因此它正在使用JFrame
的默认Layout Manager,即CENTER
3}}并且未指定的默认位置为new MainMenu()
,当您在同一位置添加DrawPanel
时,它会替换DrawPanel
面板,因为只有一个组件可以存在在同一个位置上。
而是尝试将CENTER
放置到MainMenu
,将SOUTH
放置到main
。它现在应该是这样的:
请务必按照以下方式编写public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//Your constructor here
}
});
}
方法,将程序放在上:
ActionListener
您正在MainMenu
上实施actionPerformed
但未实施其方法,将其删除或实施b1
方法并将代码移至MainMenu
操作中倾听它。不过,我强烈建议您同时参加Event Dispatch Thread (EDT)
您正在使用JPanel
的{{1}}展示率,而应尝试使用Should your class implement ActionListener or use an object of an anonymous ActionListener class或考虑使用CardLayout
。
例如,我会创建一个JDialog
并将JButton
放在那里,这样就会打开JFrame
并在其中绘制Rectangle
。
现在,产生上述输出并遵循所有建议(但#6)的代码是:
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Game {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Game().gui();
}
});
}
public void gui() {
DrawPanel panel = new DrawPanel();
JFrame frame = new JFrame("Test");
frame.add(panel, BorderLayout.CENTER);
frame.add(new MainMenu(), BorderLayout.SOUTH);
frame.setSize(400, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
}
}
class MainMenu extends JPanel {
// GamePanel panel = new GamePanel();
public MainMenu() {
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
JButton b1 = new JButton("Start");
c.fill = GridBagConstraints.HORIZONTAL;
c.ipadx = 200;
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
});
add(b1, c);
}
}
class DrawPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(10, 10, 200, 200);
}
}
根据@MadProgrammer的评论中的建议,您还可以覆盖getPreferredSize()
的{{1}}方法,然后拨打DrawPanel
:
您的frame.pack()
课程现在应该如下所示:
DrawPanel