désolé si cela a déjà été demandé à un moment donné. J'essaye d'implémenter un JSlider dans Java qui augmentera et réduira une icône dans une interface graphique. Jusqu'à présent, j'ai développé l'interface graphique et mis en œuvre le curseur, etc., mais le programme retourne "AWT-EventQueue-0" NullPointerExceptions lorsque je tente de déplacer le curseur (qui appelle l'objet à nouveau.) Ci-dessous, j'ai copié le code .! GUI et pour la classe CarIcon qui y est utilisé Merci pour votre aide Désolé si j'ai fait des erreurs évidentes ici, je suis nouveau à l'interface graphique de codageJslider grandir et rétrécir icône
Voici le GUI curseur.
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.Timer;
public SliderGui(){
}
public void initGUI() {
JFrame frame = new JFrame("Slider");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setPreferredSize(new Dimension(F_WIDTH, F_HEIGHT));
frame.setLayout(new BorderLayout());
CarIcon initI = new CarIcon(DEFAULT_SIZE);
this.imagePan = new JLabel(initI);
frame.add(imagePan, BorderLayout.CENTER);
this.setSlider(frame);
}
public void setSlider(JFrame frame) {
JSlider sizeSlider = new JSlider(JSlider.VERTICAL, MIN_SIZE,
MAX_SIZE, DEFAULT_SIZE);
sizeSlider.setMajorTickSpacing(10);
sizeSlider.setMinorTickSpacing(5);
sizeSlider.setPaintTicks(true);
sizeSlider.setPaintLabels(true);
sizeSlider.addChangeListener((ChangeEvent e) -> {
JSlider source = (JSlider)e.getSource();
if (!source.getValueIsAdjusting()) {
int level = (int)source.getValue();
this.icon.setWidth(level);
this.icon.paintIcon(imagePan, this.g, x, y);
}
});
frame.add(sizeSlider, BorderLayout.WEST);
}
public static void main(String[] args) {
SliderGui test = new SliderGui();
test.initGUI();
}
public CarIcon icon;
public Graphics2D g;
private JLabel imagePan;
static final int x = 350;
static final int y = 350;
static final int F_WIDTH = 700;
static final int F_HEIGHT = 700;
static final int MAX_SIZE = 200;
static final int MIN_SIZE = 5;
static final int DEFAULT_SIZE = 75;
}
et voici la Classe CarIcon:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class CarIcon implements Icon
{
public CarIcon(int aWidth)
{
width = aWidth;
}
public void setWidth(int aWidth) {
this.width = aWidth;
}
public int getIconWidth()
{
return width;
}
public int getIconHeight()
{
return width/2;
}
public void paintIcon(Component c, Graphics g, int x, int y)
{
Graphics2D g2 = (Graphics2D) g;
Rectangle2D.Double body
= new Rectangle2D.Double(x, y + width/6,
width - 1, width/6);
Ellipse2D.Double frontTire
= new Ellipse2D.Double(x + width/6, y + width/3,
width/6, width/6);
Ellipse2D.Double rearTire
= new Ellipse2D.Double(x + width * 2/3, y + width/3,
width/6, width/6);
// The bottom of the front windshield
Point2D.Double r1
= new Point2D.Double(x + width/6, y + width/6);
// The front of the roof
Point2D.Double r2
= new Point2D.Double(x + width/3, y);
// The rear of the roof
Point2D.Double r3
= new Point2D.Double(x + width * 2/3, y);
// The bottom of the rear windshield
Point2D.Double r4
= new Point2D.Double(x + width * 5/6, y + width/6);
Line2D.Double frontWindshield
= new Line2D.Double(r1, r2);
Line2D.Double roofTop
= new Line2D.Double(r2, r3);
Line2D.Double rearWindshield
= new Line2D.Double(r3, r4);
g2.fill(frontTire);
g2.fill(rearTire);
g2.setColor(Color.red);
g2.fill(body);
g2.draw(frontWindshield);
g2.draw(roofTop);
g2.draw(rearWindshield);
}
private int width;
}
'this.g' - non, ce n'est pas la façon dont vous dessinez. Votre classe ne devrait certainement pas avoir de champ Graphics ou Graphics2D. –
De même, vous n'appelez pas 'paintIcon (...)' directement, mais plutôt Java lui-même appelle cette méthode quand il veut peindre votre Icon. –