2016-10-01 2 views
1

Après avoir cliqué sur le JComboBox, JComboBox couvre certaines parties de la peinture avec des objets de forme rectangulaire grise, y at-il un problème avec le code et comment le réparer? Merci!JComboBox couvre d'autres choses?

Here's the image.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 

import javax.swing.Box; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class MouseButtonTester extends JFrame implements  MouseMotionListener{ 
    int x,y,r; 
    JComboBox colorChooser; 
    Color color; 
    JTextField red = new JTextField(); 
    JTextField green = new JTextField(); 
    JTextField blue = new JTextField(); 
    JPanel topPanel = new JPanel(); 
    JComboBox pen; 
    int fillKind; 

    Object[] chooseRGB = { 
     "Red: ", red, 
     "Green: ", green, 
     "Blue: ", blue 
    }; 


    public MouseButtonTester(){ 
    super(); 
    this.addMouseMotionListener(this); 
    setResizable(true); 

    setLayout(new BorderLayout()); 
    add(topPanel,BorderLayout.NORTH); 
    topPanel.setLayout(new GridLayout(1,2)); 
    colorChooser = new JComboBox(); 
    pen = new JComboBox(); 
    topPanel.add(pen); 
    topPanel.add(colorChooser); 
    colorChooser.setBackground(Color.WHITE); 
    pen.setBackground(Color.WHITE); 

    pen.addItem("Pen"); 
    pen.addItem("Marker"); 
    pen.addItem("Highlighter"); 
    pen.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      if(pen.getSelectedItem().toString().equals("Pen")){ 
       fillKind = 0; 
       r = 8; 
      }else if(pen.getSelectedItem().toString().equals("Marker")){ 
       fillKind = 0; 
       r = 15; 
      }else if(pen.getSelectedItem().toString().equals("Highlighter")){ 
       fillKind = 1; 

      } 
     } 
    }); 

    colorChooser.setFont(new Font("Serif",Font.PLAIN,14)); 
    colorChooser.addItem("Red"); 
    colorChooser.addItem("Orange"); 
    colorChooser.addItem("Yellow"); 
    colorChooser.addItem("Green"); 
    colorChooser.addItem("Blue"); 
    colorChooser.addItem("Violet"); 
    colorChooser.addItem("Purple"); 
    colorChooser.addItem("Choose RGB"); 
    colorChooser.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      if("Red" == colorChooser.getSelectedItem().toString()){ 
       color = Color.RED; 
      }else if("Orange" == colorChooser.getSelectedItem().toString()){ 
       color = Color.ORANGE; 
      }else if("Yellow" == colorChooser.getSelectedItem().toString()){ 
       color = Color.YELLOW; 
      } 
      else if("Green" == colorChooser.getSelectedItem().toString()){ 
       color = Color.GREEN; 
      } 
      else if("Blue" == colorChooser.getSelectedItem().toString()){ 
       color = Color.BLUE; 
      } 
      else if("Violet" == colorChooser.getSelectedItem().toString()){ 
       color = new Color(180,0,200); 
      } 
      else if("Purple" == colorChooser.getSelectedItem().toString()){ 
       color = new Color(150,0,200); 
      } 
      else if("Purple" == colorChooser.getSelectedItem().toString()){ 

      } 
      else if("Choose RGB" ==  colorChooser.getSelectedItem().toString()){ 
       int option = JOptionPane.showConfirmDialog(null, chooseRGB,  "Choose RGB", JOptionPane.OK_CANCEL_OPTION); 
       if(option == JOptionPane.OK_OPTION){ 
         int redValue = Integer.parseInt(red.getText()); 
         int greenValue = Integer.parseInt(green.getText()); 
         int blueValue = Integer.parseInt(blue.getText()); 
         color = new Color(redValue,greenValue,blueValue); 
        } 
       } 
      } 
     }); 
    } 

    Graphics graphics; 

    public void paint(Graphics g){ 
     graphics = g.create(); 
    } 

    public void mouseDragged(MouseEvent e) { 
     x = e.getX(); 
     y = e.getY(); 

     graphics.setColor(color); 
     if(fillKind == 0){ 
      graphics.fillOval(x, y, r, r); 
     }else if(fillKind == 1){ 
      graphics.fillRect(x, y, 10, 25); 
     } 
     repaint(); 
    } 

    public void mouseMoved(MouseEvent arg0) { 
     //No actions 
    } 
} 
+0

Deviner: cela fait-il une différence si vous configurez complètement votre zone de liste déroulante avant d'ajouter la boîte à son propre panneau? – GhostCat

+0

Ceci n'est pas complet; il n'y a pas de main() ', et quand j'ajoute un' main() 'et que je l'exécute, cela produit une fenêtre repliée, pas comme celle que vous donnez dans votre image. Donc, peu importe ce qui produit cette image, ce n'est pas exactement ce code. – arcy

+0

En regardant à nouveau, je ne vois pas de code pour gérer le cas de la liste déroulante comboBox obscurcissant une partie de votre panneau et se repeindre. Vous aurez besoin de code qui le fait. Il y a un événement (j'oublie lequel) qui informe votre panel que quelque chose l'a obscurci, avec les coordonnées du rectangle qui ont été obscurcies, et c'est à votre panel de repeindre cette partie. – arcy

Répondre

0

Si vous regardez attentivement votre code, le JComboBox dessiné sur JPanel cela signifie sur le dessin dessiné façon area.Simple pour résoudre ce problème créer deux panneaux; premier pour les outils (combobox) et ajouter vos autres outils sur, et un autre panneau à la zone de dessin.

Une autre manière est après que l'élément choisi ait repeint votre panneau.