2013-12-10 4 views
3

Хорошо, я понял все, что у меня есть, но теперь я действительно застрял. Каждый раз, когда вы выбираете другую фигуру, выбранный ранее исчезает. Как я могу сделать так, чтобы они не исчезали и не оставались на экране до выхода?Формы исчезают

import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
import java.util.*; 
import javax.swing.*; 
public class ShapeStamper extends JFrame{ 
    Random rand = new Random(); 
    public int x; 
    public int y; 
    private JPanel panel1, panel2; 
    private JButton button1, button2, button3, button4; 
    private int option = 0; 

public ShapeStamper(){ 
    super("Shape Stamper!"); 
    panel1 = new JPanel(); 
    button1 = new JButton("Circle"); 
    button2 = new JButton("Square"); 
    button3 = new JButton("Rectangle"); 
    button4 = new JButton("Oval"); 

    button1.addActionListener(
      new ActionListener(){ 
     public void actionPerformed(ActionEvent ae){ 
      option = 1; 
       } 
      } 
    ); 
    button2.addActionListener(
      new ActionListener(){ 
     public void actionPerformed(ActionEvent ae){ 
      option = 2; 
       } 
      } 
    ); 
    button3.addActionListener(
      new ActionListener(){ 
     public void actionPerformed(ActionEvent ae){ 
      option = 3; 
       } 
      } 
    ); 
    button4.addActionListener(
      new ActionListener(){ 
     public void actionPerformed(ActionEvent ae){ 
      option = 4; 
       } 
      } 
    ); 
    panel2 = new JPanel(); 
    panel2.setBackground(Color.WHITE); 
    MouseHandler mouse = new MouseHandler(); 
    setVisible(true); 
    addMouseListener(mouse); 
    addMouseMotionListener(mouse); 
    add(panel2); 
    panel1.add(button1); 
    panel1.add(button2); 
    panel1.add(button3); 
    panel1.add(button4); 

    add(panel1, BorderLayout.SOUTH); 
    setSize(500,500); 
    setVisible(true); 
      } 
private class MouseHandler extends MouseAdapter implements MouseMotionListener{ 
     @Override 
    public void mousePressed(MouseEvent e){ 
     x = e.getX(); 
     y = e.getY(); 

     repaint(); 
    } 
} 
public void paint(Graphics g){ 
    super.paintComponents(g); 
    Graphics2D g2d = (Graphics2D) g; 
    if(option == 0){ 
     g.setFont(new Font("Serif", Font.BOLD, 32)); 
     g.drawString("Shape Stamper!", 150, 220); 
     g.setFont(new Font("Serif", Font.ITALIC, 16)); 
     g.drawString("Programmed by: Chris", 150, 230); 
    } 
    if(option == 1){ 
     Color randColor1 = new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)); 
     g2d.setPaint(randColor1); 
     g2d.drawOval(50, 50, 100, 100); 
      } 
    if(option == 2){ 
     Color randColor2 = new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)); 
     g2d.setPaint(randColor2); 
     g2d.drawRect(50, 50, 100, 100); 
      } 
    if(option == 3){ 
     Color randColor3 = new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)); 
     g2d.setPaint(randColor3); 
     g2d.draw(new Rectangle2D.Double(75,50,150,100)); 
      } 
    if(option == 4){ 
     Color randColor4 = new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)); 
     g2d.setPaint(randColor4); 
     g2d.draw(new Ellipse2D.Double(50, 25, 100, 50)); 
      } 
} 
    public static void main(String[] args) { 
     ShapeStamper application = new ShapeStamper(); 
     application.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 
    } 
+0

' paintComponent' не является методом 'JFrame' ... – Reimeus

+0

@Reimeus Спасибо. Я получил эту часть с дороги :) – Chris

+0

Это должно быть помечено качели, а не netbeans. Код будет делать то же самое, независимо от того, какую IDE вы используете, и это вопрос Swing. – Vitruvius

ответ

1

Вы не должны быть переопределение paint контейнера верхнего уровня, а затем пытается картины поверх компонентов, которые вы уже добавили.

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

Вместо этого создайте пользовательский компонент, простирающийся от чего-то вроде JPanel и переопределите его метод paintComponent и выполните свою обычную роспись. Затем добавьте этот компонент в свой фрейм.

Вы также обнаружите, что обновления красок чище и не будут мерцать при обновлении.

Вы также должны убедиться, что вы звоните repaint на этом пользовательском компоненте, когда-либо изменить одно эти варианты для того, чтобы изменения окрашиваются обратно к компоненту

Посмотри на Performing Custom Painting для получения более подробной информации.

Кроме того, просто чтобы быть ясно, вы не должны называть super.paintComponents от paint (или на самом деле где-нибудь, когда вы переопределить paintComponents ... за исключением того, который действительно должен быть потребность сделать ...)

+0

Должен ли я создать для него еще один класс или я могу просто поместить его в ту, в которой я кодирую? Кроме того, это поможет сделать фигуры не исчезнуть? – Chris

+1

1- В принципе, я бы заменил 'panel2' на пользовательский/расширенный компонент, который содержал контент из вашего текущего метода' paint' (но вызывал правильный супер метод). 2- Нет, он не остановит фигуры от исчезновения, так как это вы закодировали. – MadProgrammer

+0

Oh. Вы знаете, как я могу заставить их не исчезнуть? – Chris

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