簡體   English   中英

為什么在此JPanel上顯示此JMenu?

[英]Why is the this JMenu being displayed on this JPanel?

這說明了我的問題

我試圖復制類似程序的繪畫,但是每當我單擊屏幕時,菜單欄就會顯示在面板區域中。 除非我在屏幕上單擊(繪制),否則它不會這樣做。 菜單欄被添加到面板之前,任何幫助將不勝感激。

public class Main {
public static Frame frame;
public static Panel panel;
public static MenuBar menubar;
public static void main(String[] args) {
    frame = new Frame();
    panel = new Panel();
    menubar = new MenuBar();
    frame.setJMenuBar(menubar);
    frame.addMouseMotionListener(panel);
    frame.add(panel);
    frame.setVisible(true);     
}

}

public class Frame extends JFrame {
public Frame() {
    setTitle("Paint");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setExtendedState(JFrame.MAXIMIZED_BOTH);
}

}

public class Panel extends JPanel implements MouseMotionListener {

public boolean isMouseDown = false;
public int x1,y1, x2, y2;
public Color colour = Color.BLACK;
public int size = 3;

public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(colour);
    g2.setStroke(new BasicStroke(size));
    g2.drawLine(x1 - 10, y1 - 80, x2 - 10, y2 - 80);
}

public void mouseDragged(MouseEvent arg0) {
    x1 = x2;
    y1 = y2;
    x2 = arg0.getX();
    y2 = arg0.getY();
    repaint();
}

public void mouseMoved(MouseEvent arg0) {
    x1 = x2;
    y1 = y2;
    x2 = arg0.getX();
    y2 = arg0.getY();
}

public void mouseClicked(MouseEvent arg0) {}

public void mouseEntered(MouseEvent arg0) {}

public void mouseExited(MouseEvent arg0) {}

}

public class MenuBar extends JMenuBar {

JMenu file = new JMenu("File");
JMenu brush = new JMenu("Pen");
JMenu colour = new JMenu("Colour");
Font font = new Font("Times New Romans", Font.PLAIN, 18);

public MenuBar() {  
   //JMenuBar Code here, left black as very long
}

}

問題之一:您需要調用super.paintComponent(g); 在paintComponent方法中。 否則,JPanel不能自己做房屋整理畫。

如果要使圖形持久化,則可以創建一個線的ArrayList,然后在for循環中的paintComponent中繪制這些線,或者最好將其繪制到BufferedImage上,然后將其顯示在paintComponent方法中。

例如,

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Stroke;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class MyMain {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui() {
        MyPainting mainPanel = new MyPainting();
        MenuCreator menuCreator = new MenuCreator(mainPanel);

        JFrame frame = new JFrame("MyPainting");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(mainPanel);
        frame.setJMenuBar(menuCreator.getMenubar());
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
}

@SuppressWarnings("serial")
class MyPainting extends JPanel {
    private static final int IMG_W = 600;
    private static final int IMG_H = 450;
    private static final int STROKE_W = 3;
    private static final Stroke STROKE = new BasicStroke(STROKE_W);
    private BufferedImage img = new BufferedImage(IMG_W, IMG_H, BufferedImage.TYPE_INT_ARGB);
    private Color drawColor = Color.BLACK;

    public MyPainting() {
        setPreferredSize(new Dimension(IMG_W, IMG_H));
        MyMouse myMouse = new MyMouse();
        addMouseListener(myMouse);
        addMouseMotionListener(myMouse);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (img != null) {
            g.drawImage(img, 0, 0, this);
        }
    }

    private class MyMouse extends MouseAdapter {
        private Graphics2D g2 = null;
        private Point p0;

        @Override
        public void mousePressed(MouseEvent e) {
            if (img == null) {
                return;
            }
            g2 = img.createGraphics();
            g2.setStroke(STROKE);
            g2.setColor(drawColor);
            p0 = e.getPoint();
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            if (p0 == null) {
                return;
            }
            drawLine(e);

        }

        @Override
        public void mouseReleased(MouseEvent e) {
            if (p0 == null) {
                return;
            }
            drawLine(e);
            g2.dispose();
            p0 = null;
        }

        private void drawLine(MouseEvent e) {
            Point p1 = e.getPoint();
            g2.drawLine(p0.x, p0.y, p1.x, p1.y);
            repaint();
            p0 = p1;
        }

    }

    public void setDrawColor(Color drawColor) {
        this.drawColor = drawColor;
    }

    public void clear() {
        img = new BufferedImage(IMG_W, IMG_H, BufferedImage.TYPE_INT_ARGB);
        repaint();
    }
}

class MenuCreator {
    private JMenuBar menubar = new JMenuBar();
    private MyPainting myPainting;

    public MenuCreator(MyPainting myPainting) {
        JMenuItem clearDrawing = new JMenuItem(new AbstractAction("Clear Drawing") {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                if (myPainting != null) {
                    myPainting.clear();
                }
            }
        });
        JMenu fileMenu = new JMenu("File");
        fileMenu.add(clearDrawing);

        JMenu colourMenu = new JMenu("Colour");
        for (MyColor myColor : MyColor.values()) {
            colourMenu.add(new JMenuItem(new ColorAction(myColor)));
        }

        menubar.add(fileMenu);
        menubar.add(new JMenu("Pen"));
        menubar.add(colourMenu);
        this.myPainting = myPainting;
    }

    public JMenuBar getMenubar() {
        return menubar;
    }

    private class ColorAction extends AbstractAction {
        private MyColor myColor;

        public ColorAction(MyColor myColor) {
            super(myColor.getText());
            this.myColor = myColor;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if (myPainting != null) {
                myPainting.setDrawColor(myColor.getColor());
            }
        }
    }
}

enum MyColor {
    BLACK("Black", Color.BLACK), RED("Red", Color.RED), ORANGE("Orange", Color.ORANGE), BLUE("Blue", Color.BLUE);

    private String text;
    private Color color;
    private MyColor(String text, Color color) {
        this.text = text;
        this.color = color;
    }

    public String getText() {
        return text;
    }

    public Color getColor() {
        return color;
    }

}

您未能遵守油漆鏈的要求。

public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(colour);
    g2.setStroke(new BasicStroke(size));
    g2.drawLine(x1 - 10, y1 - 80, x2 - 10, y2 - 80);
}

除了不需要publicpaintComponent的工作之一是為繪畫准備Graphics上下文。 因此,您應該做的第一件事就是super.paintComponent任何自定義繪制之前調用super.paintComponent

protected void paintComponent(Graphics g) {
    super. paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(colour);
    g2.setStroke(new BasicStroke(size));
    g2.drawLine(x1 - 10, y1 - 80, x2 - 10, y2 - 80);
}

Graphics是一個共享的上下文,它在需要繪制的其他組件之間共享,因此在繪制之前確保正確准備非常重要。

同樣重要的是,在方法存在之前,您對上下文所做的任何重大修改(例如轉換或渲染提示)都必須撤消

我建議您看一下《 在Swing執行自定義繪畫繪畫》,以更好地了解繪畫系統的實際工作原理

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM