【问题标题】:Making JPanel Highlighted when clicked单击时突出显示JPanel
【发布时间】:2013-05-20 18:23:40
【问题描述】:

所以我的框架中有几个 Jpanel,其想法是,当其中一个面板被选中时,它将突出显示。这只是第一步,因为最后,我希望能够让按钮在面板上起作用,但只有突出显示的那个。

我想在面板上添加某种鼠标侦听器,但我不确定如何实现它以获得我想要的结果。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.Border;

public class CustomComponent {
    Border emptyBorder  = BorderFactory.createEmptyBorder(1,1,1,1);
    Border selectBorder = BorderFactory.createLineBorder(Color.blue);
    JPanel[] panels;

    private JPanel getContent() {
        JLabel label = new JLabel();
        label.setText("fffffffff");
        label.setBounds(5, 5, 25, 25);

        JLabel label2 = new JLabel();
        label2.setText("HHHHHHHHHH");
        label2.setBounds(25, 25, 25, 25);

        JLabel label3 = new JLabel();
        label3.setText("YYYYYYYY");
        label3.setBounds(50, 50, 25, 25);

        JPanel mainPanel = new JPanel();
        mainPanel.setSize(new Dimension(300,300));
        JPanel panel1 = new JPanel();
        panel1.add(label);
        JPanel panel2 = new JPanel();
        panel2.add(label2);
        JPanel panel3 = new JPanel();
        panel3.add(label3);

        panel1.setBackground(Color.WHITE);
        panel2.setBackground(Color.MAGENTA);
        panel3.setBackground(Color.orange);

        panel1.setBorder(emptyBorder);
        panel2.setBorder(emptyBorder);
        panel3.setBorder(emptyBorder);

        panels = new JPanel[] { panel1, panel2, panel3 };

        mainPanel.add(panel1);
        mainPanel.add(panel2);
        mainPanel.add(panel3);
        return mainPanel;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new CustomComponent().getContent());
        frame.pack();
        frame.setVisible(true);
    }
}

【问题讨论】:

  • "当其中一个面板被选中时,它会被高亮显示。这只是第一步,因为最后,我希望能够有按钮.." i> 我会尝试将输入和意识集中在JButton 实例上。它对程序员来说更简单,对用户来说更直观。
  • 按钮只会在其中一个 jpanels 上工作(突出显示的那个)。必须先点击它们
  • 好吧——我会放宽一点。但我的意思是添加一些可聚焦组件,然后当任何可聚焦元素具有焦点时,通过键盘或鼠标(或Robot 等)激活面板“警报颜色”。
  • this 帖子。然后你必须重写mouseEntered 方法并执行突出显示(可能带有边框)
  • 所以我会有一个 mouselistner 来请求关注点击。然后设置 mouseEntered 方法有边框?

标签: java swing jpanel highlight mouse-listeners


【解决方案1】:

这里是一个示例代码,展示了当鼠标悬停在JPanel 之一上时如何实现突出显示。如果您想在单击而不是悬停时突出显示,请实现 mousePressedmouseReleased 方法而不是 mouseEnteredmouseExited

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class MouseHoverDemo
{
    public static void main(String[] args)
    {
        new MouseHoverDemo();
    }

    MouseHoverDemo()
    {
        JFrame jFrame = new JFrame("Mouse Hover Demo");
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jFrame.setLayout(new GridLayout(5,5));
        for(int i=0;i<25;i++) jFrame.add(new CustomPanel());
        jFrame.pack();
        jFrame.setLocationRelativeTo(null);
        jFrame.setVisible(true);
    }

    class CustomPanel extends JPanel implements MouseListener
    {
        Border blackBorder = BorderFactory.createLineBorder(Color.BLACK);
        Border redBorder = BorderFactory.createLineBorder(Color.RED,5);
        CustomPanel()
        {
            addMouseListener(this);
            setBorder(blackBorder);
            setFocusable(true);
        }

        @Override
        public Dimension getPreferredSize()
        {
            return new Dimension(50, 50);
        }

        @Override public void mouseClicked(MouseEvent e){}
        @Override public void mousePressed(MouseEvent e){}
        @Override public void mouseReleased(MouseEvent e){}

        @Override
        public void mouseEntered(MouseEvent e)
        {
            setBorder(redBorder);
        }

        @Override
        public void mouseExited(MouseEvent e)
        {
            setBorder(blackBorder);
        }
    }
}

更新

对于您新需要的功能,将customPanel 的代码更改为此

class CustomPanel extends JPanel implements MouseListener
    {
        boolean isHighlighted;
        Border blackBorder = BorderFactory.createLineBorder(Color.BLACK);
        Border redBorder = BorderFactory.createLineBorder(Color.RED,5);
        CustomPanel()
        {
            addMouseListener(this);
            setBorder(blackBorder);
            setFocusable(true);
        }

        @Override
        public Dimension getPreferredSize()
        {
            return new Dimension(200, 100);
        }

        @Override public void mouseClicked(MouseEvent e)
        {
            if(isHighlighted) setBorder(blackBorder);
            else setBorder(redBorder);
            isHighlighted=!isHighlighted;
        }

        @Override public void mousePressed(MouseEvent e){}
        @Override public void mouseReleased(MouseEvent e){}
        @Override public void mouseEntered(MouseEvent e){}
        @Override public void mouseExited(MouseEvent e){}
    }

【讨论】:

  • 太好了,谢谢。悬停代码工作正常。但是由于某种原因,鼠标单击/释放的代码无法始终如一地工作。有什么想法吗?
  • @user2133337 好的,这是一个错字,你应该实现mousePressed 而不是mouseClicked。顺便说一句,点击是一个由按下和释放组成的复合操作,因此它以前不起作用。
  • 如果我希望按钮在单击后保持突出显示,而不是在松开鼠标单击后返回?然后重新打开第二次点击。
猜你喜欢
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 2012-09-28
  • 1970-01-01
  • 2015-09-03
  • 2010-10-04
  • 1970-01-01
相关资源
最近更新 更多