我正在为我的一个课程制作一个绘画程序而且我被困住了。这是我的代码的一部分(分为3个Java类)。当我点击“Ligne”按钮时,我希望能够在白色矩形中画一条线。对不起法国评论。
//cree une fenetre
public class QUESTION
{
public static void main(String[] args)
{
Paint_GUI test2 = new Paint_GUI();
}
}
import java.awt.*;
import javax.swing.*;
//class contenant le code pour dessiner
public class Paint_Dessin extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
setBackground(Color.white);
g.setColor(Color.black);
}
public void TracerLigne()
{
System.out.println("LIGNE");
}
}
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Paint_GUI extends JFrame
{
//Panels contenant tout les bouton de mon interface
private JPanel panelBtn;
//Bar d'outil Btn
private JButton BtnTracerLigne;
//object Paint_Dessin
private Paint_Dessin espaceDessin = new Paint_Dessin();
public Paint_GUI()
{
final int WINDOW_WIDTH = 650;
final int WINDOW_HEIGHT = 450;
setSize (WINDOW_WIDTH, WINDOW_HEIGHT);
setTitle("Paint v.2.0");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// Appeler la methode qui construit la barre de BTN.
buildPanelBtn();
add(panelBtn, BorderLayout.NORTH);
add(espaceDessin, BorderLayout.CENTER);
// Afficher la fenetre.
setVisible(true);
}
private void buildPanelBtn()
{
BtnTracerLigne = new JButton("Ligne");
BtnTracerLigne.addActionListener(new LigneListener());
// Creer le panel.
panelBtn = new JPanel();
// Ajouter les composantes au label
panelBtn.add(BtnTracerLigne);
}
private class LigneListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
espaceDessin.TracerLigne();
}
}
答案 0 :(得分:1)
你当前的代码有一个问题,你在LigneListener类的actionPerformed方法中创建一个新的Paint_Dessin,虽然这个对象是从与JFrame中显示的Paint_Dessin对象相同的类创建的,但它是一个完全不同的对象和调用方法将对显示的Paint_Dessin完全没有影响。你需要做的是在Paint_GUI类中声明一个私有的Paint_Dessin变量,一个类字段,在它的声明或Paint_GUI构造函数中初始化这个变量,然后在GUI中显示这个对象,并在这个GUI上调用方法在监听器类中。如,
public class Paint_GUI extends JFrame
{
private JPanel panelBtn;
private JButton BtnTracerLigne;
private Paint_Dessin espaceDessin = new Paint_Dessin();
public Paint_GUI()
{
final int WINDOW_WIDTH = 650;
//... code deleted for sake of brevity
// Paint_Dessin espaceDessin = new Paint_Dessin();
add(espaceDessin, BorderLayout.CENTER);
// Afficher la fenetre.
setVisible(true);
}
private void buildPanelBtn()
{
// ....
}
private class LigneListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
// Paint_Dessin tracerLigne = new Paint_Dessin();
// tracerLigne.TracerLigne();
espaceDessin.TracerLigne(); // call the method on the same object!
}
}
答案 1 :(得分:0)
你应该创建另一个类,例如GraphComponent,它扩展JComponent。您还应该考虑实施MouseInputListener。我不会给你解决方案,但这是一个好的开始;)。
无论如何,我看到你是法国人,所以看看site-du-zero,这里有非常好的教程(法语)。
N.B:你不应该把你的名字命名为QUESTION,把问题改为
编辑: 这里有另一个提示:
public class Paint_Dessin extends JComponent implements MouseInputListener{
private List<Point> startPoints = new ArrayList<Point>();
@Override
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
Point p = new Point(x,y);
startPoints.add(p);
repaint();
}
protected void paintComponent(Graphics g) {
g.setColor(getForeground());
Graphics2D g2 = (Graphics2D) g;
for (Point p : startPoints)
p.draw(g2);
}
public class Point{
private int x,y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
void draw(Graphics2D g2) {
//do the drawing with the right shape you want
}
}
并查看Shape。您应该从MouseInputListener实现其他方法,例如mouseDragged,....