【问题标题】:Drawing on JPanel with JButton, JSpinner, etc使用 JButton、JSpinner 等在 JPanel 上绘图
【发布时间】:2015-07-26 17:32:40
【问题描述】:

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

}

【问题讨论】:

    标签: java swing jframe jpanel


    【解决方案1】:

    你的问题在这里:

    frame.setLayout(new FlowLayout());
    

    通过这样做,您的 lePanel JPanel 会调整到其首选大小,该大小太小而无法显示矩形。删除此行,您的 JFrame 的 contentPane 将使用其默认的 BorderLayout,并且绘图 JPanel 将根据 BordrLayout 规则填充您的 GUI 的下部,您将看到绘图。

    请注意,一种有用的调试技术是在感兴趣的组件周围添加边框,以查看它在哪里以及它有多大。例如,我把它放在你的 lepanel 构造函数中

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

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


    其他不相关的问题:

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

    【讨论】:

    • 非常感谢,非常感谢:D
    猜你喜欢
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    相关资源
    最近更新 更多