2013-11-21 3 views
0

У меня есть две панели внутри рамки. Верхняя панель управления имеет меню с тремя объектами, квадратом, кругом и треугольником. Моя рамка реализует код с верхней панели. На данный момент у меня возникают проблемы с отображением фигур на экране, когда я выбираю их из меню. Я прикрепил свою верхнюю панель управления и класс MyFrame. Спасибо за любую помощь, это очень ценится. Благодарю.Невозможно отобразить чертежи на экране при нажатии пункта меню.

Вот мой класс MyFrame.

public class MyFrame extends javax.swing.JFrame implements ActionListener, ChangeListener { 

public static Shapes shape1; 
private JMenuItem Square; 
private JMenuItem Triangle; 
private JMenuItem Circle; 
private jPanelTop d1 = new jPanelTop(); 
public MyFrame() { 
    initComponents(); 

    MyControlPanel controlPanelShapes = new MyControlPanel(); 
    controlPanelShapes.setSize(1000, 1000); 
    controlPanelShapes.setLocation(0, 20); 
    add(controlPanelShapes); 

    d1.setSize(400, 400); 
    d1.setVisible(true); 
    this.add(d1); 

    JMenuBar jBarShape = new JMenuBar(); 
    JMenu Shape = new JMenu(); 
    Shape.setText("Shape"); 

    Square = new JMenuItem(); 
    Square.setText("Square"); 
    Shape.add(Square); 
    Square.addActionListener(this); 

    Triangle = new JMenuItem(); 
    Triangle.setText("Triangle"); 
    Shape.add(Triangle); 
    Triangle.addActionListener(this); 

    Circle = new JMenuItem(); 
    Circle.setText("Circle"); 
    Shape.add(Circle); 
    Circle.addActionListener(this); 

    jBarShape.add(Shape); 
    setJMenuBar(jBarShape); 

} 

@Override 
public void stateChanged(ChangeEvent e) { 
    throw new UnsupportedOperationException("Not supported yet."); 
} 

@Override 
public void actionPerformed (ActionEvent e) { 
    if (e.getSource() == Circle) { 
     shape1 = new Circle(); 
     d1.setCircle(); 
    } else if (e.getSource() == Triangle) { 
     shape1 = new Triangle(); 
    } else if (e.getSource() == Square) { 
     shape1 = new Square(); 
     d1.setSquare(); 
    } 
} 

}

Вот мой JPanel класс:

public class jPanelTop extends javax.swing.JPanel { 
public jPanelTop() { 
    initComponents(); 
} 
private int xPosition = 50; 
private int yPosition = 50; 
private Graphics g; 

public void paintComponent() { 
    super.paintComponent(g); 
    g.drawRect(xPosition, yPosition, 70, 70); 
    g.drawOval(xPosition, yPosition, 70, 70); 
} 

public void setSquare() 
{ 
    super.paintComponent(g); 
    g.drawRect(xPosition, yPosition, 70, 70); 
    repaint(); 
} 
public void setCircle() 
{ 
    super.paintComponent(g); 
    g.drawOval(xPosition, yPosition, 70, 70); 
    repaint(); 
} 

}

Я очень благодарен за любую помощь! :) Благодаря!

+1

Этот вопрос относится к ** [этот другой] (http: // stackoverflow.ком/вопросы/20076884/имеющая Трудность-с-ActionListener-JSlider-jmenus-и-JLabels/20080133 # 20080133) **? Этот код мне знаком. Если вы прочитали ** [мой ответ] (http://stackoverflow.com/questions/20076884/having-difficulty-with-actionlistener-jslider-jmenus-and-jlabels/20080133#20080133) ** в конечном итоге пришли к * * [этот пример] (http://stackoverflow.com/questions/20037558/adjust-shape-dimensions-using-a-jscrollbar/20058272#20058272) **, где показана реализация 'paintComponent'. – dic19

ответ

3

Ваш paintComponent совершенно не прав, поскольку его подпись не соответствует характеристике суперкласса. Он должен принять параметр Graphics. И ваш класс JPanel должен не иметь поле графики.

Для магии рисования ваши методы рисования должны переопределять методы рисования JComponents. Вы можете проверить, что вы этого не делаете, добавив аннотацию @Override до вашего метода paintComponent. Сделайте это, и компилятор будет жаловаться вам, что метод, который, по вашему мнению, является переопределением, на самом деле не является (поэтому использование этой аннотации регулярно является очень хорошей идеей - вы хотите, чтобы компилятор помог вам с вашей кодировкой, а возможное). Если ваш метод не отменяет метод супер, он никогда не будет вызван JVM.

Кроме того, вы не должны пытаться использовать Graphics непосредственно в ваших методах setSquare и setCircle, как вы это делаете. Опять же, пожалуйста, прочитайте учебники, чтобы узнать, как это сделать правильно.

Вы хотите прочитать учебники о том, как рисовать. Основные ссылки учебника:


На дальнейшей оценке коды и задач, рассмотрит:

  • дающего ваши рисование булевых переменных JPanel, например boolean drawCircle и boolean drawSquare и установите для них значение false.
  • В вашем правильном методе перекрытия paintComponent нарисуйте круг, если drawCircle истинно, и то же самое для square/drawSquare.
  • В вашем методе setCircle установите drawCircle на true, drawSquare на false и переименуйте вызов.
  • Сделайте обратное в вашем методе setSquare.
  • Узнайте и следуйте соглашениям об именах Java: все имена классов должны начинаться с буквы верхнего регистра. Все имена методов и полей/переменных должны начинаться с буквы нижнего регистра.
+0

Эта реализация 'paintComponent' выглядит как воздушный шар на воздушной подушке, полный угрей ... – brimborium

+0

Hovercraft Full Eels выглядит как' paintComponent'. –

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