2016-05-15 32 views
1

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; 
} 
+0

'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. –

+0

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. –

Répondre

3

Problèmes:

  • Ne donnez pas vos graphiques de classe ou des champs Graphics2D, comme faisant cela est presque garanti pour donner à vos graphiques graphiques défectueux en raison d'un graphique instable objet ou avoir une NullPointerException pour essayer d'utiliser un objet null Graphics. Vous ne devriez pas essayer de dessiner l'icône directement en appelant le paintIcon(...). Laissez Java lui-même faire cela. Au lieu de cela, appelez repaint() sur le JLabel qui contient l'icône après avoir changé la largeur de votre icône - c'est tout!

Voici comment je l'ai testé:

import java.awt.*; 
import java.awt.geom.*; 
import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

@SuppressWarnings("serial") 
public class ResizeIcon extends JPanel { 
    private static final int PREF_W = 800; 
    private static final int PREF_H = 650; 
    private static final int MAX_ICON_WIDTH = 400; 
    private int iconWidth = MAX_ICON_WIDTH/2; 
    private CarIcon carIcon = new CarIcon(iconWidth); 
    private JLabel carLabel = new JLabel(carIcon); 
    private JSlider slider = new JSlider(0, MAX_ICON_WIDTH, iconWidth); 

    public ResizeIcon() { 
     slider.setMajorTickSpacing(50); 
     slider.setMinorTickSpacing(10); 
     slider.setPaintLabels(true); 
     slider.setPaintTicks(true); 
     slider.setPaintTrack(true); 
     slider.setSnapToTicks(true);   
     slider.addChangeListener(new SliderListener()); 

     setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     setLayout(new BorderLayout()); 
     add(slider, BorderLayout.PAGE_START); 
     add(carLabel, BorderLayout.CENTER); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class SliderListener implements ChangeListener { 
     @Override 
     public void stateChanged(ChangeEvent e) { 
      int value = slider.getValue(); 
      carIcon.setWidth(value); 
      carLabel.repaint(); 
     } 
    } 

    private static void createAndShowGui() { 
     ResizeIcon mainPanel = new ResizeIcon(); 

     JFrame frame = new JFrame("Resize Icon"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

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; 
} 
+0

@ JordanGG123: De rien. Notez les modifications pour répondre s'il vous plaît. –