gpt4 book ai didi

java - 使用 JButton、JSpinner 等在 JPanel 上绘图

转载 作者:行者123 更新时间:2023-12-02 04:29:38 24 4
gpt4 key购买 nike

所以我正在尝试为学校制作一个图形界面,其中涉及一个 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;
}

}

最佳答案

您的问题在这里:

frame.setLayout(new FlowLayout());

通过执行此操作,您的 lePanel JPanel 将调整为其首选尺寸,该尺寸太小而无法显示矩形。删除此行,JFrame 的 contentPane 将使用其默认的 BorderLayout,并且绘图 JPanel 将根据 BordrLayout 规则填充 GUI 的下部,然后您将看到绘图。

请注意,一种有用的调试技术是在感兴趣的组件周围添加边框,以查看它的位置和大小。例如,我将其放置在您的 lepanel 构造函数中

setBorder(BorderFactory.createTitledBorder("le panel"));

它直观地向我展示了你的问题。

<小时/>

其他不相关的问题:

  • 您将想要学习和使用 Java naming conventions 。变量名应全部以小写字母开头,而类名应以大写字母开头。学习并遵循这一点将使我们能够更好地理解您的代码,并且将使您更好地理解其他人的代码。
  • 请记住在您认为可能会覆盖另一个方法(例如 paintComponent 方法)的任何方法上方使用 @Override 注释。如果您实际上错误地覆盖了某些内容,这将使编译器能够通知您。

关于java - 使用 JButton、JSpinner 等在 JPanel 上绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31639937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com