如何调用在非图形类(组件,框架等)的类中具有Graphics组件参数的paint方法?

时间:2017-09-05 19:24:20

标签: java swing awt

对不起我的英语,我是巴西人,我不太懂英语。

所以,我正在尝试在类似于CAD的java中执行应用程序。用户输入带有矩形的de尺寸(这会使家居和房间变得模拟),当点击按钮时,组件必须出现在窗口中。 我的问题是:我有一个名为JanelaPrincipal的类(它扩展了JFrame),它是与用户的接口,它有JTextField,JButtom等。我在类JanelaPrincipal中有一个类,它被称为AddCasa,它实现了mouseClicked。 JanelaPrincipal类有一个paint覆盖方法,这个方法在Casa类中调用一个方法。我需要在AddCasa类中调用JanelaPrincipal的paint方法。当用户单击按钮时,它处于活动状态。 JanelaPrincipal Class

Casa class

这是代码: JanelaPrincipal课程和AdicionarCasa课程:

package View;

import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import Model.Casa;

public class JanelaPrincipal extends JFrame
{
    JLabel lCasa, lComod, lPorta, lJanela, lVao, lPassagem, lLargCasa, lProfundCasa, lIDComodo, lNomeComodo, lPosComodo, lXComodo, lYComodo, lLargComodo, lProfundComodo;
    JLabel lIDVao, lPosVao, lXVao, lYVao, lOrientacao, lTamVao, lRotPorta, lAbertPorta;
    JPanel areaDesenho;
    JTextField largCasa, profundCasa;
    JButton addCasa;
    Casa casa;
    JanelaPrincipal janelaPrincipal;
    public JanelaPrincipal()
    {
        //janelaPrincipal = new JanelaPrincipal();
        //janelaPrincipal = this;
        casa = new Casa(0,0);
        this.setSize(900, 650);//define tamanho(largura/altura)
        this.setTitle("CAD");//define um titulo para janela
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.getContentPane().setLayout(null);//tem que colocar sempre

        lCasa = new JLabel("CASA");
        lCasa.setBounds(145,20,70,20);
        this.add(lCasa);

        lLargCasa = new JLabel("Largura");
        lLargCasa.setBounds(20,60,120,20);
        this.add(lLargCasa);

        largCasa = new JTextField();
        largCasa.setBounds(70,60,70,20);
        this.add(largCasa);

        lProfundCasa = new JLabel("Profundidade");
        lProfundCasa.setBounds(160, 60, 120, 20);
        this.add(lProfundCasa);

        profundCasa = new JTextField();
        profundCasa.setBounds(245, 60,80, 20);
        this.add(profundCasa);

        addCasa = new JButton("Adicionar");
        addCasa.setBounds(110, 100,110, 25);
        addCasa.addMouseListener(new AdicionarCasa());
        this.add(addCasa);

        this.setVisible(true);
    }

    public void paint(Graphics g)
    {
        super.paint(g);//
        casa.desenhar(g);
    }

    public class AdicionarCasa extends MouseAdapter
    {
        int largura, profundidade;
        public void mouseClicked(MouseEvent e)
        {
            largura = Integer.parseInt(largCasa.getText());
            profundidade = Integer.parseInt(profundCasa.getText());
        }
    }
}

Casa class:

package Model;

import java.awt.Graphics;

import javax.swing.JPanel;

public class Casa extends JPanel
{
    private int largura;
    private int profundidade;
    int numComodos;
    int numVaos;
    Comodo comodos[];
    Vao vaos[];

    public Casa(int largura, int profundidade)
    {
        this.setLargura(largura);
        this.setProfundidade(profundidade);
        comodos = new Comodo[20];
        vaos = new Vao[20];
        numComodos = 0;
        numVaos = 0;
    }
    void addComodo(Comodo c)//colocar o obj comodo no vet
    {
        comodos[numComodos] = c;
        numComodos++;
    }
    public void desenhar(Graphics g)
    {
        Comodo c;
        g.drawRect(0, 0, this.getLargura(), this.getProfundidade());
        for(int i=0;i<numComodos;i++)
        {
            c = comodos[i];
            g.drawRect(100+c.getPosX(), 10+c.getPosY(), c.getLargura(), c.getProfundidade());//desenha comodo
        }
    }
    public int getLargura() {
        return largura;
    }
    public void setLargura(int largura) {
        this.largura = largura;
    }
    public int getProfundidade() {
        return profundidade;
    }
    public void setProfundidade(int profundidade) {
        this.profundidade = profundidade;
    }
}

1 个答案:

答案 0 :(得分:0)

如果要强制重绘顶级框架,则应在该组件上调用 revalidate(),尤其是在从框架中添加或删除组件时。

在您的代码中, AdicionarCasa 侦听器没有对JFrame的引用,因此您需要在构造函数中传入引用,或者只是在JFrame上实现MouseListener接口本身。

请记住,如果您想要执行常规的 paint()操作,则需要确保在Swing事件线程上完成。 repaint() revalidate()是线程安全的,因此您无需在Swing EDT上显式运行它们。

您的代码可以像这样更改:

addCasa.addMouseListener(new AdicionarCasa(this));
...
public class AdicionarCasa extends MouseAdapter
{
    int largura, profundidade;
    JFrame frame;
    public AdicionarCasa( JFrame parent )
    {
        frame = parent;
    }
    public void mouseClicked(MouseEvent e)
    {
        largura = Integer.parseInt(largCasa.getText());
        profundidade = Integer.parseInt(profundCasa.getText());
        // add/remove/modify components as needed
        frame.revalidate();
    }
}

或将MouseListener添加到框架本身:

public class JanelaPrincipal extends JFrame implements MouseListener
{
    ...

    void mouseClicked(MouseEvent e)
    {
          // Logic from the old adapter class goes here
    }
    void mouseEntered(MouseEvent e) {}
    void mouseExited(MouseEvent e) {}
    void mousePressed(MouseEvent e) {}
    void mouseReleased(MouseEvent e) {}
}