2015-11-17 3 views
0

У меня есть Jframe с двумя кнопками: «A» и «B». Нажатие кнопки «A» должно отображать заглавную букву A в JPanel. Проблема здесь в том, что при повторном щелчке мыши предыдущие рисунки не отображаются. Я хочу убедиться, что все, что нарисовано, остается на чертеже. Ниже приведен код моей программы.Refaint() и PaintComponent() не обновляется должным образом

Код для JFrame:

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class DrawFrame extends JFrame{ 
    private final int WIDTH = 500; 
    private final int HEIGHT = 300; 

    private GUIModel model; 

    private JButton number1; 
    private JButton number2; 

    private JPanel numberPanel; 
    private DrawPanel graphicsPanel; 

    public DrawFrame() 
    { 
     this.model = new GUIModel(" "); 

     createSelectionPanel(); 
     createGraphicsPanel(); 

     this.setSize(WIDTH, HEIGHT); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setVisible(true); 
    } 

    private void createSelectionPanel() 
    { 
     numberPanel = new JPanel(); 

     ButtonListener listener = new ButtonListener(); 

     number1 = new JButton("A"); 
     number1.addActionListener(listener); 

     number2 = new JButton("B"); 
     number2.addActionListener(listener); 

     numberPanel.setLayout(new GridLayout(2,2)); 
     numberPanel.add(number1); 
     numberPanel.add(number2); 

     this.add(numberPanel, BorderLayout.WEST); 
    } 

    private void createGraphicsPanel() 
    { 
     //instantiate drawing panel 
     graphicsPanel = new DrawPanel(WIDTH, HEIGHT, model); 
     //add drawing panel to right 
     add(graphicsPanel); 
    } 

    private class ButtonListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent event) { 
      model.setDisplayString(event.getActionCommand()); 
     } 
    } 

    //creates a drawing frame 
    public static void main(String[] args) 
    { 
     DrawFrame draw = new DrawFrame(); 
    } 
} 

Код для JPanel:

import javax.swing.JPanel; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 
import java.util.ArrayList; 
import java.util.List; 

public class DrawPanel extends JPanel{ 
    private static final long serialVersionUID = 3443814601865936618L; 

    private Font font = new Font("Default", Font.BOLD, 30); 

    private static final Color DEFAULT_TEXT_COLOR = Color.BLACK; 
    private static final Color HOVER_TEXT_COLOR = Color.RED; 
    private Color color = DEFAULT_TEXT_COLOR; 

    private List<GUIModel> numberList = new ArrayList<GUIModel>(); 
    private GUIModel model; 
    boolean mouseHover = false; 

    public DrawPanel(int width, int height, GUIModel model){ 
     this.setPreferredSize(new Dimension(width, height)); 
     this.model = model; 

     //set white background for drawing panel 
     setBackground(Color.WHITE); 

     //add mouse listeners 
     MouseHandler mouseHandler = new MouseHandler(); 
     this.addMouseListener(mouseHandler); 
     this.addMouseMotionListener(mouseHandler); 
    } 

// void checkForHover(MouseEvent event) { 
//  FontMetrics metrics = getFontMetrics(font); 
// 
//  Graphics g = getGraphics(); 
//  Rectangle textBounds = metrics.getStringBounds("C", g).getBounds(); 
//  g.dispose(); 
// 
//  int index = 0; 
//  while (index < numberList.size()) { 
//   Double x = numberList.get(index).getCoordinate().getX(); 
//   Double y = numberList.get(index).getCoordinate().getY(); 
//    
//   textBounds.translate(x.intValue(), y.intValue()); 
//    
//   if (textBounds.contains(event.getPoint())) { 
//    color = HOVER_TEXT_COLOR; 
//   } 
//   else { 
//    color = DEFAULT_TEXT_COLOR; 
//   } 
//   index++; 
//  } 
// } 

это мой метод PaintComponent, куда я иду по списку писем я нарисованной в разных координатах и их рисование на холсте

@Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setFont(font); 
     g.setColor(color); 

     int index = 0; 
     while (index < numberList.size()) { 
      Double x = numberList.get(index).getCoordinate().getX(); 
      Double y = numberList.get(index).getCoordinate().getY(); 
      String display = numberList.get(index).getDisplayString(); 
      g.drawString(display, x.intValue(), y.intValue()); 
      index++; 
     } 

     if (model.getCoordinate() != null) { 
      Point p = model.getCoordinate();    
      g.drawString(model.getDisplayString(), p.x, p.y); 
      numberList.add(model); 
     } 
    } 

    //class to handle all mouse events 
    private class MouseHandler extends MouseAdapter implements MouseMotionListener 
    { 
     @Override 
     public void mousePressed(MouseEvent event) 
     { 
      model.setCoordinate(event.getPoint()); 
     } 

     @Override 
     public void mouseReleased(MouseEvent event) 
     { 
      DrawPanel.this.repaint(); 
     } 

//  @Override 
//  public void mouseEntered(MouseEvent event) { 
//   checkForHover(event); 
//  } 
//   
//  @Override 
//  public void mouseMoved(MouseEvent event) { 
//   checkForHover(event); 
//  } 
    } 
} 

Код для GUIModel:

import java.awt.Point; 

public class GUIModel { 
    private String displayString; 
    private Point coordinate; 

    public GUIModel(String displayString) { 
     this.displayString = displayString; 
    } 
    public void setDisplayString(String displayString) { 
     this.displayString = displayString; 
    } 

    public String getDisplayString() { 
     return displayString; 
    } 

    public Point getCoordinate() { 
     return coordinate; 
    } 

    public void setCoordinate(int x, int y) { 
     this.coordinate = new Point(x, y); 
    } 

    public void setCoordinate(Point coordinate) { 
     this.coordinate = coordinate; 
    } 
} 

Любая помощь или предложения будут оценены. Благодарю.

+0

Каждый раз, когда вы щелкаете, вам нужно создать новый GUIModel и добавить его в 'numberList' – MadProgrammer

+0

@MadProgrammer Ваш комментарий был один, который помог мне. Итак, я бы хотел, чтобы кредит проходил там, где это необходимо. На данный момент я ответил на свой вопрос, но если вы опубликуете свой комментарий в качестве ответа, я могу его принять. Благодаря! – IWTL

ответ

0

@MadProgrammer Ваш комментарий помог мне исправить мой код. Как вы сказали, мне нужно создать новый GUIModel и добавить его в мой список номеров.

Я изменил свой метод paintComponent, чтобы отразить это, и теперь он работает. Так что спасибо!

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.setFont(font); 
    g.setColor(color); 

    int index = 0; 
    while (index < numberList.size()) { 
     Double x = numberList.get(index).getCoordinate().getX(); 
     Double y = numberList.get(index).getCoordinate().getY(); 
     String display = numberList.get(index).getDisplayString(); 
     g.drawString(display, x.intValue(), y.intValue()); 
     index++; 
    } 

    if (model.getCoordinate() != null) { 
     Point p = model.getCoordinate();    
     g.drawString(model.getDisplayString(), p.x, p.y); 
     GUIModel number = new GUIModel(); 
     number.setCoordinate(p); 
     number.setDisplayString(model.getDisplayString()); 
     numberList.add(number); 
    } 
} 
Смежные вопросы