【问题标题】:Why can't I paint on the panel为什么我不能在面板上绘画
【发布时间】:2015-07-04 15:34:58
【问题描述】:

我已经制作了南、东和北三个面板,我试图在北面板上画一个圆圈,但我就是不知道为什么它不画。这是我的代码:我想要的是一个小应用程序,它可以绘制用户选择的不同大小和颜色的圆圈。

import com.sun.prism.shader.DrawCircle_Color_Loader;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;


public class drawing extends JFrame implements MouseListener{

   private int r = 255, g = 0, b = 0;
   private JSlider colorSlider, redSlider,greenSlider,blueSlider;
   private JLabel colorLabel,redLabel,greenLabel,blueLabel;
   private int x = 50;
   private int y = 50;


public drawing(){
    JFrame frame = new JFrame("Drawing App");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setSize(800,800);

    Container contentPane = frame.getContentPane();


    JMenuBar mb = new JMenuBar();
    frame.setJMenuBar(mb);

    JMenu color = new JMenu("Colour");
    JMenu size = new JMenu("Size");

    mb.add(color);
    mb.add(size);
    JMenuItem colorRed = new JMenuItem("Red");
    JMenuItem colorBlue = new JMenuItem("Blue");
    JMenuItem colorGreen = new JMenuItem("Green");
    color.add(colorBlue);
    color.add(colorGreen);
    color.add(colorRed);

    JMenuItem one = new JMenuItem("1");
    JMenuItem two = new JMenuItem("2");
    JMenuItem three = new JMenuItem("3");
    JMenuItem four = new JMenuItem("4");
    JMenuItem five = new JMenuItem("5");
    size.add(one);
    size.add(two);
    size.add(three);
    size.add(four);

    JPanel panel = new JPanel();
    setBackground(Color.WHITE);
    contentPane.add(panel,BorderLayout.NORTH);

    JPanel panel1 = new JPanel();
    contentPane.add(panel1,BorderLayout.SOUTH);

    JPanel panel2 = new JPanel();
    contentPane.add(panel2,BorderLayout.EAST);

    panel1.setLayout(new GridLayout(0,1));

   JColorChooser colors = new JColorChooser();
    panel1.add(colors);

   frame.setVisible(true);

    panel.add(panel);
    }

  public void paint(Graphics g)
   {
     g.setColor(Color.red);
     g.fillOval(x,y,100,100);
   }
  public void mousePressed(MouseEvent e) {}
  public void mouseReleased(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e) {}

  public void mouseClicked(MouseEvent e) {
     x = e.getX();
     y = e.getY();
     repaint();

  }
  public static void main(String[] args) {

    drawing Drawing = new drawing();

 }

}

【问题讨论】:

  • 请参阅 Detection/fix for the hanging close bracket of a code block 了解我无法再费心修复的问题。
  • 你没有注意到IllegalArgumentExceptionpanel.add(panel);吗?
  • 顺便说一句 - public void paint(Graphics g) { g.setColor(Color.red); 应该是 public void paint(Graphics g) { super.paint(g); g.setColor(Color.red); 尽管理想的自定义绘画应该在 JPanel 而不是像 JFrame 这样的顶级容器中完成。

标签: java swing jpanel awt drawing


【解决方案1】:

您在构造函数 drawing() 中创建了另一个 JFrame 实例

  1. 删除该实例并替换为 this 以用于构造函数内的所有初始化。
  2. 添加 super.paint(g);到您的公共 void paint(Graphics g) 方法的第一行。

【讨论】:

    【解决方案2】:

    没有内容的面板的默认大小为 0x0,因此您可能会看到这样的面板的唯一方法是布局是否在高度和宽度上都拉伸它。最好覆盖自定义绘制面板的getPreferredSize() 方法以返回合理的大小,然后覆盖pack() 顶级容器。

    【讨论】:

    • 您好 Andrew,谢谢,我如何 ovveride getPreferedSize 然后打包顶级容器
    猜你喜欢
    • 2013-07-12
    • 2015-10-27
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多