在Jlabel上实现简单的悬停效果

时间:2013-12-30 07:23:53

标签: java swing colors jlabel mouselistener

我正在讨论一个侧面项目的一些想法,我想创建一个使用Java swing的GUI,它看起来不像来自Windows95。我正在努力的一个想法是使用JLabel作为按钮而不是标准的JButton。这样我就可以根据需要自定义悬停,拖动和移动效果。

MouseAdapter class的研究应该允许我做我想做的一切,不幸的是我在实现悬停效果方面遇到了一些麻烦,因为JLabel似乎没有更新。我已经尝试通过调用frame.update(getGraphics());直接更新框架,但这似乎不像我认为的那样工作。

我可以就如何正确更新标签获得一些建议。

注意:这只是一个没有努力有效组织代码的例子

public class Window extends JFrame {
    /**
     * 
     */
    private static final long serialVersionUID = 5259700796854880162L;
    private JTextField textField;
    private JLabel lblNewLabel;
    static Window frame;
    int i = 0;

    public Window() {

        JPanel panel = new JPanel();
        getContentPane().add(panel, BorderLayout.CENTER);
        panel.setLayout(null);

        lblNewLabel = new JLabel("New label");
        lblNewLabel.setBackground(Color.LIGHT_GRAY);
        lblNewLabel.setBounds(137, 38, 114, 70);
        panel.add(lblNewLabel);
        lblNewLabel.addMouseListener(new LabelAdapter());

        textField = new JTextField();
        textField.setBounds(122, 119, 86, 20);
        panel.add(textField);
        textField.setColumns(10);

    }

    private class LabelAdapter extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            textField.setText(String.valueOf(i));
            i++;
        }

        @Override
        public void mouseEntered(MouseEvent e) {
            lblNewLabel.setBackground(Color.CYAN);

        }

        @Override
        public void mouseExited(MouseEvent e) {
            lblNewLabel.setBackground(Color.LIGHT_GRAY);
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        frame = new Window();

        frame.setSize(900, 700);
        frame.setVisible(true);
    }
}

3 个答案:

答案 0 :(得分:5)

  1. Windowawt.Window的保留名称,请将此名称更改为例如MyWindow

  2. JPanel已实施FlowLayout,您无法使用NullLayout使用built_in LayoutManager,然后在JFrame.pack()之前使用JFrame.setVisible在屏幕上调整大小

  3. JLabel是透明的,请使用JLabel.setOpaque(true);

  4. 进行更改
  5. 如果Backgroung Color作为Mouse over/hover中的最后一个代码行JLabel.repaint(),则mouse_event无法刷新repaint() JLabel API {{1}} 1}}

答案 1 :(得分:3)

除了mKorbel的回答......

我不知道为什么你会这么努力,当你真的可以让按钮看起来像一个标签。

Button or label?

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ButtonModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class NotALabel {

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

    public NotALabel() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                final JButton btn = new JButton("Am I label or a button?");
                btn.setContentAreaFilled(false);
                btn.setBorderPainted(false);
                btn.setFocusPainted(false);
                btn.setOpaque(true);
                btn.getModel().addChangeListener(new ChangeListener() {
                    @Override
                    public void stateChanged(ChangeEvent e) {
                        ButtonModel model = (ButtonModel) e.getSource();
                        if (model.isRollover()) {
                            btn.setBackground(Color.CYAN);
                        } else {
                            btn.setBackground(null);
                        }
                    }
                });

                btn.addActionListener(new ActionListener() {
                    private int count = 0;

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        count++;
                        ((JButton) e.getSource()).setText("I'm a super button!! Or label...");
                    }
                });

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());
                frame.add(btn);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

您还应该考虑尝试Setting the look and feel甚至可能Modifying the look and feel

答案 2 :(得分:0)

您可以使用 MouseListener 实现此目的。 Here is the sample progrma.看看。