我正在做一项家庭作业,我应该制作一个程序,使您可以绘制自定义形状和线条,并在屏幕上移动它们。
最初,我使用公共空隙paint(g)进行绘画,但是当我调用重绘时,形状会闪烁。
paint(g)
因此,我切换到paintComponent(g)。但是,当我尝试绘制形状时,没有任何显示。我相信这是因为它不在顶部绘画JPanel。
paintComponent(g)
JPanel
框架在3行中有3个面板BorderLayout。
BorderLayout
[Button JPanel] [Draw Box JPanel] [Coordinate Jpanel]
我想绘制的面板自然是Draw Box面板。
这是我目前拥有的代码:
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenuBar; import javax.swing.JPanel; public class Main extends JPanel implements ActionListener, MouseListener, MouseMotionListener { private String colors[] = { "Black", "Red", "Orange", "Yellow", "Green", "Blue" }; private String shapes[] = { "Ellipse", "Line", "Rectangle" }; private JMenuBar toolBar; // flow layout? OR box layout x-Axis private JPanel drawBox; private JPanel coordBox; private JLabel coords; private JButton undo = new JButton("Undo"); private JButton clear = new JButton("Clear"); private JComboBox color = new JComboBox(colors); private JComboBox shape = new JComboBox(shapes); private JCheckBox fill = new JCheckBox("Filled"); public Main() { JFrame frame = new JFrame("Paint"); frame.setSize(400, 600); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.setLayout(new BorderLayout()); /* * SETUP TOOLBAR */ toolBar = new JMenuBar(); toolBar.setLayout(new GridLayout(1, 5)); toolBar.add(undo); toolBar.add(clear); toolBar.add(color); toolBar.add(shape); toolBar.add(fill); /* * ADD ACTION LISTENERS TO BUTTONS */ undo.addActionListener(this); clear.addActionListener(this); color.addActionListener(this); shape.addActionListener(this); fill.addActionListener(this); /* * SETUP DRAW BOX */ drawBox = new JPanel(); drawBox.setOpaque(true); drawBox.setPreferredSize(new Dimension(600, 400)); drawBox.addMouseListener(this); drawBox.addMouseMotionListener(this); /* * SETUP COORDINATES */ coords = new JLabel(); coordBox = new JPanel(); coordBox.setBackground(new Color(211, 211, 211)); coordBox.setPreferredSize(new Dimension(drawBox.getWidth(), 25)); coords.setText("Coords: [0,0]"); coords.addMouseMotionListener(this); coordBox.add(coords); /* * ADD TO FRAME */ frame.add(toolBar, BorderLayout.NORTH); frame.add(drawBox, BorderLayout.CENTER); frame.add(coordBox, BorderLayout.SOUTH); frame.pack(); } public static void main(String[] args) { Main m = new Main(); } public void paintComponent(Graphics g) { // super.paintComponent(g); g.setColor(Color.BLACK); g.fillRect(300, 300, 100, 100); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == undo) { System.out.println("Undo Last"); } if (e.getSource() == clear) { System.out.println("clearing screen"); } // COLOR DROP DOWN BOX if (e.getSource() == color) { JComboBox cb = (JComboBox) e.getSource(); String selected = (String) cb.getSelectedItem(); switch (selected) { case "Red": System.out.println("switching to color red"); //ellipse.setColor(Color.RED); break; case "Orange": System.out.println("switch to coor orange"); //ellipse.setColor(Color.ORANGE); break; case "Yellow": System.out.println("switching to color yellow"); break; case "Green": System.out.println("Switching to green"); //ellipse.setColor(Color.GREEN); break; case "Blue": System.out.println("Switching to blue"); break; default: System.out.println("NOthing selected"); break; } } // SHAPE DROP DOWN BOX if (e.getSource() == shape) { JComboBox cb = (JComboBox) e.getSource(); String selected = (String) cb.getSelectedItem(); switch (selected) { case "Ellipse": System.out.println("switching to ellipse"); break; case "Line": System.out.println("switch to line"); break; case "Rectangle": System.out.println("switching to rectangle"); break; default: System.out.println("NOthing selected"); break; } } if (e.getSource() == fill) { JCheckBox cb = (JCheckBox) e.getSource(); if (cb.isSelected()) { System.out.println("Fill shape"); //ellipse.setFilled(true); } else { System.out.println("Empty shape"); //ellipse.setFilled(false); } } } @Override public void mouseClicked(MouseEvent arg0) { // System.out.println("Mouse clicked"); } @Override public void mouseEntered(MouseEvent e) { System.out.println("Mouse entered"); } @Override public void mouseExited(MouseEvent arg0) { coords.setText("Coords: N/A"); } @Override public void mousePressed(MouseEvent arg0) { System.out.println("Mouse pressed"); } @Override public void mouseReleased(MouseEvent arg0) { System.out.println("Mouse Released"); } @Override public void mouseDragged(MouseEvent e) { coords.setText("Coords: [" + e.getX() + "," + e.getY() + "]"); } @Override public void mouseMoved(MouseEvent e) { coords.setText("Coords: [" + e.getX() + "," + e.getY() + "]"); // repaint(); // revalidate(); } }
您的Main类扩展了JPanel,具有paintComponent方法-但 您从未在GUI上添加Main的实例 ,而是 在GUI上 添加了普通香草的JPanel,drawBox,因此,paintComponent永远不会被调用。
解决方案:添加Main或thisGUI,而不是普通的JPanel。
this