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