0

我有 2 个班级,Class2 和 Class4。我希望使用 p4.add(c2o) 和 f.add(p4) 方法将 Class2 中的油漆从 Class4 添加到 Class4 中的 JPanel 上。我添加 GUI 没有问题,但我根本无法添加图形。

第四类:

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Class4 {


    public void mainMethod(int event){
        JFrame f = new JFrame("Love Test");
        if(event == 0){

            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(500,200);
            f.setLayout(null);

            JPanel p = new JPanel(new BorderLayout());
            p.setBounds(150, 0, 350, 75);
            Class3 c3o = new Class3();
            p.add(c3o);
            f.add(p);

            JPanel p2 = new JPanel();
            Class7 c7o = new Class7();
            p2.add(c7o);
            p2.setBounds(0, 75, 500, 40);
            f.add(p2);

            JPanel p3 = new JPanel();
            p3.setBounds(0, 0, 150, 75);
            Class5 c5o = new Class5();
            p3.add(c5o);
            f.add(p3);

            f.setVisible(true);

        }

        if(event == 5){

            JPanel p4 = new JPanel();
            Class2 c2o = new Class2();
            p4.add(c2o);
            p4.setBounds(0,115,500,55);
            f.add(p4);
        }

    }


}

类2:

import javax.swing.JOptionPane;
import javax.swing.JPanel;

import java.util.Random;
import java.awt.*;



public class Class2 extends JPanel{

    public void paint(Graphics g){
        super.paint(g);
        this.setBackground(Color.WHITE);
        g.setColor(new Color(0,0,0));
        String str = "";
        String str2 = "";
        Random rlove = new Random();
        int love = rlove.nextInt(101);
        Class3 c3o = new Class3();
        str = c3o.boy.getText() + " and " + c3o.girl.getText() + "'s amount of love is " + love + "%.";
        if(love >= 0 && love < 10){         
            str2 = "Stop thinking about that person anymore!";
        }
        if(love >= 10 && love < 20){
            str2 = "1/100 percent chance...";
        }
        if(love >= 20 && love < 30){
            str2 = "Little hope...";
        }
        if(love >= 30 && love < 40){
            str2 = "Not even a kiss, stop talking about French kisses! (wise words of Rubesh)";
        }
        if(love >= 40 && love < 50){
            str2 = "Near passing";
        }
        if(love >= 50 && love < 60){
            str2 = "Just Pass";
        }
        if(love >= 60 && love < 70){
            str2 = "Some effort needed.";
        }
        if(love >= 70 && love < 80){
            str2 = "Grade A. A good chance.";
        }
        if(love >= 80 && love < 90){
            str2 = "Good pair. Very good relationship!";
        }
        if(love >= 90 && love < 100){
            str2 = "Perfect pair. Lost for words.";
        }
        if(love == 100){
            str2 = "OH MY GOD!!!!!";
        }
        g.drawString(str,10,10);
        g.drawString(str2,10,30);
    }


}

如何将paintComponent 添加到JPanel p4?谢谢!

4

2 回答 2

1
  1. 不使用JPanel#paint,推荐使用JPanel#paintComponent,查看Performing Custom Painting
  2. 使用适当的布局管理器。您遇到的问题来自两个问题。首先是,您的面板没有首选尺寸。覆盖布局管理器的getPreferredSize方法Class2并返回适当大小的布局管理器。

...

JPanel p4 = new JPanel(); // Default layout manager is FlowLayout
Class2 c2o = new Class2();
// c2o has not size (0x0 by default)...
p4.add(c2o);
p4.setBounds(0,115,500,55);
f.add(p4);
于 2013-05-11T11:08:03.997 回答
0

对此没有直接简单的答案,但我会尽力解释。

您需要做的是设置一个画布,就像放置一个按钮或标签一样,然后您需要在其中添加一个 MouseListener。MouseListener 接口用于跟踪您想要绘制项目的鼠标。我已经设置了一个完整的示例,包括颜色选择和形状选择,因为代码的共享量,我使用 pastebin 来分享这个。

在此之后,我已经解释了关键组件。看看: http: //pastebin.com/YRr0LGPX

这里的关键组件如下。

内部辅助类“Board”是画布,它实现了 MouseListener 和 MouseMotionListener,这样做是为了跟踪鼠标移动和按下的键。

private class Board extends JPanel implements 
    MouseListener, MouseMotionListener {

paintComponent(Graphics g) 是负责绘画的方法,我使用 Graphics2D 库来创建形状。

mousePressed(MouseEvent e) 接收应该绘制形状的起始坐标。

public void mousePressed(MouseEvent e) {
    startPoint = e.getPoint();
}

mouseReleased(MouseEvent e) 在 keyclick 结束时调用,该方法处理形状的绘制。我使用了一个开关盒来处理不同的形状,然后检查坐标来处理形状的绘制。有关 Shapes 的更多详细信息,请访问http://docs.oracle.com/javase/7/docs/api/java/awt/Shape.html

释放鼠标后,将运行以下代码:

shapes.add(s); //Adds the new shape to the Vector of shapes
startPoint = null; //Resets the starting ...
endPoint = null; //and ending coordinates to the system
colorList.add(color); 
repaint(); //Repaints the entire canvas with the shapes in the Vector<Shape>

我不仅想在释放鼠标键时绘制形状,当拖动鼠标时我想随时重绘形状,这是在 mouseDragged(MouseEvent e) 方法中完成的

免责声明:

这是我以前做过的一个测试项目,如果我现在要设置它,我会做得更干一些,但我希望这可以帮助您解决问题。

如果您需要使用类似铅笔的功能来“徒手”绘制,除非您可以建立在逻辑上,否则这并不能真正涵盖它。“图形”有点模糊.. :)

但这里有一些 Prine Java 提供的帮助,在 swing/awt 中制作“点/像素”,介绍如何创建点。我建议创建一个二维数组,因此您可以添加反向选项:)

于 2013-05-11T10:42:49.367 回答