【问题标题】:Java: JPanel Rectangle issue?Java:JPanel 矩形问题?
【发布时间】:2015-06-11 07:40:24
【问题描述】:

我正在制作一个程序,当用户按下鼠标然后再次按下时改变矩形的颜色 按下默认颜色发生我在jpanel上用 油漆组件方法的帮助。我使用鼠标适配器编写了鼠标按下方法。但是如何制作 当用户在矩形上按下鼠标时,将矩形颜色变为红色的功能在再次按下此矩形时也会显示默认颜色。这是图片

代码:

    public class A extends JPanel{
    public void paintComponent(Graphics g){
            super.paintComponents(g);

            g.setColor(Color.BLACK);
            g.fillRect(6, 10, 66, 70);

            addMouseListener(new MouseAdapter(){

            public void mousePressed(MouseEvent e){


            }
            });
            }
    }

主要:

public class Main {

    public static void main(String[] args) {

        JFrame obj = new JFrame();
        A object = new A();
        obj.add(object);

        obj.setSize(450, 400);
        obj.setResizable(false);
        obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        obj.setLocationRelativeTo(null);

        obj.setVisible(true);
        }
}

【问题讨论】:

  • 看起来很不对劲?为什么要在paintComponent 中添加mouseListener?
  • @Gosu 因为如果我错了矩形会在paintComponent上绘制,那么在哪里添加MouseListener

标签: java swing


【解决方案1】:

添加到 Gosu 的答案:

如果您希望仅在单击矩形时切换颜色,则只需在MouseListener 内添加if 语句即可。

    frame.addMouseListener(new MouseAdapter() {

        public void mousePressed(MouseEvent e) {

             // Check if the point where the mouse was clicked is contained
             // within the drawing Rectangle.                          
             if (new Rectangle(6, 10, 66, 70).contains(e.getPoint())) {
                    object.switchColor();
                    object.revalidate();
                    object.repaint();
             }
         }
    });

但是,请记住,在实际应用程序中,您绝不应该对本例中的矩形之类的任何内容进行硬编码。

【讨论】:

    【解决方案2】:

    对于必须改变颜色的正方形,您需要另一个 JPanel(或类似的东西)。否则,您将无法记录在正方形内部发生的鼠标事件以及在外部发生的鼠标事件。 以下是一个小的工作示例。

    public class A extends JPanel {
        private Color currColor = Color.BLACK;
        JPanel p = new JPanel();
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            p.setSize(new Dimension(66,70));
            p.setLocation(6, 10);
            p.setBackground(currColor);
    
            p.addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    switchColor();
                    p.revalidate();
                    p.repaint();
                }
            });
            add(p);
        }
    
        public void switchColor() {
            currColor = (currColor == Color.BLACK) ? Color.RED : Color.BLACK;
        }
    
        public static void main(String [] args) {
            JFrame frame = new JFrame();
            A t = new A();
            frame.add(t);
            frame.setSize(450,400);
            frame.setResizable(false);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    }
    

    【讨论】:

      【解决方案3】:

      试试这个:

      public class QuickTester {
      
          public static void main(String[] args) {
      
              JFrame frame = new JFrame();
              final A object = new A();
              frame.add(object);
      
              frame.setSize(450, 400);
              frame.setResizable(false);
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setLocationRelativeTo(null);
      
              frame.addMouseListener(new MouseAdapter() {
      
                  public void mousePressed(MouseEvent e) {
      
                      object.switchColor();
                      //object.revalidate();
                      object.repaint();
                  }
              });
      
              frame.setVisible(true);
          }
      }
      
      class A extends JPanel {
      
          private Color currColor = Color.BLACK;
      
          public void switchColor() {
              currColor = (currColor == Color.BLACK) ? Color.RED : Color.BLACK;
          }
      
          public void paintComponent(Graphics g) {
              super.paintComponents(g);
      
              g.setColor(currColor);
              g.fillRect(6, 10, 66, 70);
          }
      }
      

      只要您在框架内单击,矩形就会在黑色和红色之间切换。

      【讨论】:

      • 但是点击框架时到处都会发生这种情况
      • @hamel123 它只是在监听鼠标点击,所以您希望仅在单击矩形本身时发生颜色变化?
      • 当点击矩形然后改变颜色而不是全帧点击
      • 你能建议我做什么吗?
      • 你没有改变布局,不需要调用 revalidate
      猜你喜欢
      • 1970-01-01
      • 2013-07-12
      • 2010-09-05
      • 2011-08-07
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多