2013-11-12 3 views
1
public class FaceMain extends JFrame { 
CreateFace p1 = new CreateFace(); 
private ControlPanel panel; 

public FaceMain(ControlPanel value) { 
panel = value; 
    JFrame main = new JFrame(); 
    main.setTitle("Face Frame"); 
    main.setSize(new Dimension(600, 600)); 
    main.setLocationRelativeTo(null); 
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    main.setVisible(true); 

    Container c = main.getContentPane(); 
    main.add(p1); 
    panel.eyesSetE(true); 
    JFrame control = new JFrame(); 
    control.setTitle("Control Panel"); 
    control.setSize(new Dimension(300, 300)); 
    control.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    control.setLocationRelativeTo(main); 
    control.setVisible(true); 

    ControlPanel p2 = new ControlPanel(p1); 
    control.add(p2); 

} 
} 

public class ControlPanel extends JPanel { 
boolean eyesSetEdit = false, faceSetEdit = false, mouthSetEdit = false, 
     editEyes; 
private Color purple = new Color(133, 22, 145); 
private CreateFace face; 
private CreateFace p1; 

public ControlPanel(CreateFace value) { 
    face = value; 
    p1 = value; 
    setLayout(new GridLayout(4, 0)); 
    JButton change = new JButton("Click"); 
    add(change); 
    JLabel info = new JLabel("Click Above To Change Features", 
      JLabel.CENTER); 
    add(info); 
    JLabel info1 = new JLabel("Slide Below To Change Size", JLabel.CENTER); 
    add(info1); 
    JScrollBar slider = new JScrollBar(Scrollbar.HORIZONTAL, 0, 100, 0, 300); 
    add(slider); 
public void eyesSetE(boolean x) { 
    eyesSetEdit = x; 
} 

public boolean getEyesSet() { 
    return eyesSetEdit; 
} 

Я расширил свой класс, чтобы попытаться изменить логическое значение, которое будет использоваться exstensivly в классе ControlPanel принимать решения, однако каждый раз, когда я начинаю программу я получаю NullPointerException в строке «панель .eyesSetE (истина);» Даже если я попытаюсь позвонить getEyesSet(), я все равно получаю nullpointerИспользование JScrollBar для обновления компонентов

ответ

3

Вы никогда не меняете экземпляр circle в классе CreateCircle, поэтому он никогда не меняет размер.

Не используйте static для того, что должно быть переменной экземпляра, а не использовать экземпляр класса, который вы создали и обеспечивают метод установки, чтобы изменить переменную ...

В принципе, этот пример передает экземпляр p1 на панель ControlPanel, чтобы он имел некоторый контекст, с помощью которого можно было управлять тем, что вы ранее создали.

import datetest.CircleShort.ControlPanel; 
import datetest.CircleShort.CreateCircle; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.Scrollbar; 
import java.awt.event.AdjustmentEvent; 
import java.awt.event.AdjustmentListener; 
import java.awt.geom.Ellipse2D; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JScrollBar; 

public class CircleShort extends JFrame { 

    CreateCircle p1 = new CreateCircle(); 

    public CircleShort() { 
     CreateCircle p1 = new CreateCircle(); 
     JFrame main = new JFrame(); 
     main.setSize(new Dimension(600, 600)); 
     main.setLocationRelativeTo(null); 
     main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     main.setVisible(true); 

     Container c = main.getContentPane(); 
     main.add(p1); 
     JFrame control = new JFrame(); 
     control.setTitle("Control Panel"); 
     control.setSize(new Dimension(300, 300)); 
     control.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     control.setLocationRelativeTo(main); 
     control.setVisible(true); 

     ControlPanel p2 = new ControlPanel(p1); 
     control.add(p2); 

    } 

    static class CreateCircle extends JComponent { 

     int circleX = 100; 
     Ellipse2D.Double circle; 

     public CreateCircle() { 
      circle = new Ellipse2D.Double(circleX, 50, 400, 350); 
     } 

     public void setCircleX(int x) { 
      circleX = x; 
      circle = new Ellipse2D.Double(circleX, 50, 400, 350); 
      repaint(); 
     } 

     public int getCircleX() { 
      return circleX; 
     } 

     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D) g; 
      g2.setColor(Color.red); 
      g2.fill(circle); 
     } 
    } 

    class ControlPanel extends JComponent { 

     private CreateCircle circle; 

     public ControlPanel(CreateCircle value) { 
      circle = value; 
      setLayout(new GridLayout(4, 0)); 
      JButton change = new JButton("Click"); 
      add(change); 
      JLabel info = new JLabel("Click Above To Change Color", 
        JLabel.CENTER); 
      add(info); 
      JLabel info1 = new JLabel("Slide Below To Change Size", 
        JLabel.CENTER); 
      add(info1); 
      JScrollBar slider = new JScrollBar(Scrollbar.HORIZONTAL, 0, 100, 0, 
        300); 
      add(slider); 
      slider.addAdjustmentListener(new AdjustmentListener() { 

       public void adjustmentValueChanged(AdjustmentEvent e) { 
        System.out.println(e.getValue()); 
        circle.setCircleX((circle.getCircleX() + (e.getValue() % 5))); 
       } 

      }); 

     } 
    } 

    static class CircleRun { 

     public static void main(String[] args) { 
      new CircleShort(); 
     } 
    } 
} 

staticstatic злой, пока вы не поймете, как его использовать. Если вы обнаружите, что делаете какое-либо поле или метод static только потому, что не можете понять, как получить к нему доступ, то вы, вероятно, делаете что-то неправильно, будьте осторожны с ним ...

Следующий вопрос, который на самом деле вызывает вот почему?"

JSlider А был бы более соответствующий контроль использования и будет концептуально проще пользователю понять

+0

Awesome, спасибо большое описание, теперь я понимаю, как избежать статического, который является огромная помощь. У меня проблемы с изменением логического значения. Я создал частный экземпляр класса панели управления и пытаюсь изменить логическое значение с помощью \t \t того же метода, однако я продолжаю получать исключения с нулевым указателем. Я создал частный экземпляр класса и попытаюсь установитьBoolean (boolean edit) на основе щелчка мыши, но он продолжает давать мне исключение нулевого указателя. Проходят ли булевы в класс seperete по-разному? – Sam

+0

Можете ли вы добавить пример того, что вы делаете по своему вопросу, это облегчило бы понимание ... – MadProgrammer

+0

Я отредактировал его с разделом рассматриваемого кода. – Sam

Смежные вопросы