问题描述
因此,我正在尝试为学校制作一个图形界面,其中涉及一个JMenuBar,JSpinner和2个JButton。 在这些对象下面,我尝试绘制一个简单的矩形。 我已经尝试过在扩展JPanel的类中使用paintComponent方法,但它不会出现。
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
public class A1 {
public final static int DEFAULT_WIDTH = 640;
public final static int DEFAULT_HEIGHT = DEFAULT_WIDTH /12*9;
public static void main(String[] args) {
JFrame frame = new JFrame("A1");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT));
frame.requestFocus();
frame.setLayout(new FlowLayout());
frame.setLocationRelativeTo(null);
frame.setResizable(false);
lePanel panel = new lePanel();
frame.add(panel);
frame.setJMenuBar(panel.getMenuBar());
frame.setVisible(true);
}
}
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
public class lePanel extends JPanel {
JMenuBar menuBar;
JButton submit;
JButton check;
JSpinner spinner;
public String test;
public lePanel() {
menuBar = new JMenuBar();
menuBar.add(createFileMenu(new JMenu("File")));
menuBar.add(createHelpMenu(new JMenu("Help")));
spinner = new JSpinner(new SpinnerNumberModel(1, 1, 10, 1));
add(spinner);
submit = new JButton("Submit");
add(submit);
check = new JButton("Check");
add(check);
submit.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == submit)
{
test = spinner.getValue().toString();
System.out.println("Spinner Submitted");
}
}
});
check.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == check)
{
JOptionPane.showMessageDialog(lePanel.this, test, "Information",JOptionPane.INFORMATION_MESSAGE);
}
}
});
}
private JMenu createHelpMenu(JMenu jMenu) {
JMenu menu = jMenu;
JMenuItem helpItem = new JMenuItem("Help");
menu.add(helpItem);
return menu;
}
private JMenu createFileMenu(JMenu jMenu) {
JMenu menu = jMenu;
JMenuItem newItem = new JMenuItem("New");
JMenuItem clearItem = new JMenuItem("Clear");
JMenuItem chooseFileItem = new JMenuItem("Open");
JMenuItem saveItem = new JMenuItem("Save");
JMenuItem exitItem = new JMenuItem("Exit");
exitItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
menu.add(newItem);
menu.add(clearItem);
menu.add(chooseFileItem);
menu.add(saveItem);
menu.add(exitItem);
return menu;
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.red);
g2.drawRect(200, 200, 50, 50);
}
public JMenuBar getMenuBar() {
return menuBar;
}
}
1楼
您的问题在这里:
frame.setLayout(new FlowLayout());
这样,您的lePanel JPanel大小将变为其首选大小,该大小太小而无法显示矩形。 删除该行,您的JFrame的contentPane将使用其默认的BorderLayout,并且图形JPanel将按照BordrLayout规则填充GUI的下部,您将看到该图形。
注意,一种有用的调试技术是在感兴趣的组件周围添加边框,以查看其位置和大小。 例如,我将其放置在您的Lepanel构造函数中
setBorder(BorderFactory.createTitledBorder("le panel"));
它从视觉上向我展示了您的问题。
其他不相关的问题:
- 您将要学习和使用 。 变量名都应以小写字母开头,而类名应以大写字母开头。 学习并遵循此规则将使我们能够更好地理解您的代码,并使您能够更好地理解其他人的代码。
-
请记住,在您认为可能会覆盖其他方法的任何方法(例如
paintComponent
方法)上方使用@Override
批注。 如果您实际上不正确地覆盖了所有内容,这将允许编译器通知您。