java - 如何通过右键单击Swing中的面板来绘制形状?

标签 java swing user-interface jpanel jcomponent

我正在尝试创建一个 Swing 程序。在我的程序中,我想实现这样的目标:右键单击面板并选择菜单“绘制矩形”,程序应该在面板上绘制一个非常简单的矩形。这是我的代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.BevelBorder;

public class MainWindow extends JFrame {

    JFrame frame = null;
    AboutDialog aboutDialog = null;
    JLabel statusLabel = null;    //label on statusPanel

    public MainWindow() {
        frame = new JFrame("Project");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //MENUS
        JMenuBar menuBar = new JMenuBar();                //menubar
        JMenu menuDosya = new JMenu("Dosya");           //menus on menubar
        JMenu menuYardim = new JMenu("Yardım");               //menus in menus
        menuBar.add(menuDosya);
        menuBar.add(menuYardim);
        JMenuItem menuItemCikis = new JMenuItem("Çıkış", KeyEvent.VK_Q);        //dosya menus
        menuItemCikis.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent event) {
                System.exit(0);
            }
        });
        menuDosya.add(menuItemCikis);
        JMenuItem menuItemYardim = new JMenuItem("Hakkında", KeyEvent.VK_H);      //hakkinda menus
        menuItemYardim.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent event) {
                JDialog f = new AboutDialog(new JFrame());
                f.show();
            }
        });
        menuYardim.add(menuItemYardim);
        frame.setJMenuBar(menuBar);
        //TOOLBAR
        JToolBar toolbar = new JToolBar();
        JButton exitButton = new JButton("Kapat");
        toolbar.add(exitButton);
        //STATUSBAR
        JPanel statusPanel = new JPanel();
        statusPanel.setBorder(new BevelBorder(BevelBorder.LOWERED));
        frame.add(statusPanel, BorderLayout.SOUTH);
        statusPanel.setPreferredSize(new Dimension(frame.getWidth(), 20));
        statusPanel.setLayout(new BoxLayout(statusPanel, BoxLayout.X_AXIS));
        statusLabel = new JLabel("Ready.");
        statusLabel.setHorizontalAlignment(SwingConstants.LEFT);
        statusPanel.add(statusLabel);
        //MAIN CONTENT OF THE PROGRAM
        final JPanel mainContentPanel = new JPanel();
        //RIGHT CLICK MENU
        final JPopupMenu menuSag = new JPopupMenu("RightClickMenu");
        JMenuItem menuRightClickRectangle = new JMenuItem("draw rectangle");
        menuRightClickRectangle.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent event) {
                //CircleShape cs=new CircleShape();
                mainContentPanel.add(new CircleShape()); //trying to draw.

                mainContentPanel.repaint();
                //mainContentPanel.repaint();     boyle olacak.
            }
        });
        JMenuItem menuRightClickCircle = new JMenuItem("Daire çiz");
        menuSag.add(menuRightClickRectangle);
        menuSag.add(menuRightClickCircle);
        mainContentPanel.addMouseListener(new MouseAdapter() {

            public void mouseReleased(MouseEvent e) {
                if (e.getButton() == MouseEvent.BUTTON3) {
                    menuSag.show(e.getComponent(), e.getX(), e.getY());
                    statusLabel.setText("X=" + e.getX() + "  " + "Y=" + e.getY());


                }
            }
        });
        JButton west = new JButton("West");
        JButton center = new JButton("Center");
        JPanel content = new JPanel();   //framein icindeki genel panel. en genel panel bu.
        content.setLayout(new BorderLayout());
        content.add(toolbar, BorderLayout.NORTH);
        content.add(statusPanel, BorderLayout.SOUTH);
        content.add(west, BorderLayout.WEST);
        content.add(mainContentPanel, BorderLayout.CENTER);
        frame.setContentPane(content);
        frame.setPreferredSize(new Dimension(400, 300));
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
    }
}

问题是面板上没有画任何东西。我猜程序中有一个事件丢失,但我不知道如何解决这个问题。

最佳答案

请按以下方式修改代码。像这样添加一个新类:

  class MainPanel extends JPanel {

    private List<Rectangle> rectangles = new ArrayList<Rectangle>();

    private void addRectangle(Rectangle rectangle) {
      rectangles.add(rectangle);
    }

    public void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      for (Rectangle rectangle : rectangles) {
        g2.drawRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
      }
    }

  }

然后,代替

final JPanel mainContentPanel = new JPanel();

你应该这样做:

final MainPanel mainContentPanel = new MainPanel();

菜单项的 Action 监听器变成这样:

menuRightClickRectangle.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent event) {
    // TODO: add your own logic here, currently a hardcoded rectangle
    mainContentPanel.addRectangle(new Rectangle(10, 10, 100, 50));
    mainContentPanel.repaint();
  }
});

关于java - 如何通过右键单击Swing中的面板来绘制形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12369522/

相关文章:

java - 如何使用 JJWT 从有效负载中获取自定义字段

java - Apache POI 不应用某些颜色索引

java - JMS可以在Java Swing App中使用吗

java - 访问上下文路径(根文件夹)在 Spring Boot 应用程序中不显示登录页面

仅来自 Galaxy samsung 的 java.lang.NullPointerException 错误

java - 是否可以在 JOptionPane.showInputDialog 中放置多个输入?

java - 在 JEditorPane 中获取可见文本

python - 如何在traitsui生成的窗口中分配HSplit

swift - 当键盘存在时,选择导致 View 向上滑动的原因

python - 用于 Python GUI 的强大表格小部件