【问题标题】:Creating a custom button in Java with JButton使用 JButton 在 Java 中创建自定义按钮
【发布时间】:2011-08-10 17:08:14
【问题描述】:

我正在尝试创建一个具有自定义形状(六边形)的按钮,但在其他方面就像普通的 JButton 一样(即与 ActionListener 一起使用)。

我创建了一个扩展 AbstractButton 的类,但是当我单击它时它似乎没有向 ActionListener 发送事件。如果我更改类以扩展 JButton 它可以完美地工作,但它会破坏按钮的显示方式。我假设有一个方法需要重写才能触发事件,但我不知道它是什么。

【问题讨论】:

标签: java swing user-interface jbutton actionlistener


【解决方案1】:

您必须扩展 JButton 类而不是 AbstractButton。试试下面的方法,你就会明白了。

第一步是继承JButton

然后,在您的子类中,首先重新定义paintComponent(Graphics) 方法。如果您想进行任何更改。

然后,覆盖paintBorder(Graphics) 使其成为六边形。

【讨论】:

  • 我已经重新定义了paintComponent和paintBorder,但是如果你点击其中一个按钮,它仍然会绘制一个方形边框。
  • 您是在自定义逻辑之后还是之前调用 super.paintXXX() 方法?
  • 我根本没有调用 super.paint。
  • 刚刚想通了...完全按照你说的做了,但也在构造函数中添加了this.setContentAreaFilled(false);
【解决方案2】:

我知道这个问题已经得到解答,但您可能想看看使用内置方法,并使用图像来绘制不同状态的按钮。

这是我用来生成自定义按钮的一些代码。

BufferedImage startButton = ImageIO.read(getClass().getResource("/icons/standard/buttons/start_backup.png"));
BufferedImage startButtonHover = ImageIO.read(getClass().getResource("/icons/standard/buttons/start_backup_hover.png"));
BufferedImage startButtonActive = ImageIO.read(getClass().getResource("/icons/standard/buttons/start_backup_active.png"));

JButton startBackupButton = new JButton(new ImageIcon(startButton));
startBackupButton.setRolloverIcon(new ImageIcon(startButtonHover));
startBackupButton.setPressedIcon(new ImageIcon(startButtonActive));
startBackupButton.setBorder(BorderFactory.createEmptyBorder());
startBackupButton.setContentAreaFilled(false);
startBackupButton.setFocusable(false);

然后您可以像往常一样为其添加动作侦听器。

【讨论】:

    【解决方案3】:

    如果你想创建一个CustomButtonUI那么你必须看看

    注意没有paintComponent()。错了,就用paint()的方法,

    如果可能的话,下面只是一个简单的例子(对于金属 JButton)。请注意,仅针对 Metal LaF,我很懒惰,没有关于覆盖 paintText、paintIcon、paintFocus、paintBorder(对于所有功能,您必须检查 BasicButtonUI 中的可用方法)以及我放入 ButtonModel 的东西,只是为了我的享受。

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.AbstractBorder;
    import javax.swing.border.Border;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    import javax.swing.plaf.ComponentUI;
    import javax.swing.plaf.metal.MetalButtonUI;
    
    public class TextAreaInButton {
    
        private JFrame frame = new JFrame("sssssssss");
        private JButton tip1Null = new JButton(" test button ");
    
        public TextAreaInButton() {
            Border line, raisedbevel, loweredbevel, title, empty;
            line = BorderFactory.createLineBorder(Color.black);
            raisedbevel = BorderFactory.createRaisedBevelBorder();
            loweredbevel = BorderFactory.createLoweredBevelBorder();
            title = BorderFactory.createTitledBorder("");
            empty = BorderFactory.createEmptyBorder(1, 1, 1, 1);
            final Border compound;
            Color crl = (Color.blue);
            compound = BorderFactory.createCompoundBorder(empty, new OldRoundedBorderLine(crl));
            Color crl1 = (Color.red);
            final Border compound1;
            compound1 = BorderFactory.createCompoundBorder(empty, new OldRoundedBorderLine(crl1));
            Color crl2 = (Color.black);
            final Border compound2;
            compound2 = BorderFactory.createCompoundBorder(empty, new OldRoundedBorderLine(crl2));
            tip1Null.setFont(new Font("Serif", Font.BOLD, 14));
            tip1Null.setForeground(Color.darkGray);
            tip1Null.setPreferredSize(new Dimension(50, 30));
            tip1Null.addActionListener(new java.awt.event.ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                }
            });
            tip1Null.setBorderPainted(true);
            tip1Null.setFocusPainted(false);
            tip1Null.setBorder(compound);
            tip1Null.setHorizontalTextPosition(SwingConstants.CENTER);
            tip1Null.setVerticalTextPosition(SwingConstants.BOTTOM);
            tip1Null.setUI(new ModifButtonUI());
    
            tip1Null.getModel().addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    ButtonModel model = (ButtonModel) e.getSource();
                    if (model.isRollover()) {
                        tip1Null.setBorder(compound1);
                    } else {
                        tip1Null.setBorder(compound);
                    }
                    if (model.isPressed()) {
                        tip1Null.setBorder(compound2);
                    }
                }
            });
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(tip1Null, BorderLayout.CENTER);
            frame.setLocation(150, 150);
            frame.setPreferredSize(new Dimension(310, 75));
            frame.setLocationRelativeTo(null);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String args[]) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    TextAreaInButton taib = new TextAreaInButton();
                }
            });
        }
    }
    
    class OldRoundedBorderLine extends AbstractBorder {
    
        private final static int MARGIN = 5;
        private static final long serialVersionUID = 1L;
        private Color color;
    
        OldRoundedBorderLine(Color clr) {
            color = clr;
        }
    
        public void setColor(Color clr) {
            color = clr;
        }
    
        @Override
        public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
            ((Graphics2D) g).setRenderingHint(
                RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.setColor(color);
            g.drawRoundRect(x, y, width, height, MARGIN, MARGIN);
        }
    
        @Override
        public Insets getBorderInsets(Component c) {
            return new Insets(MARGIN, MARGIN, MARGIN, MARGIN);
        }
    
        @Override
        public Insets getBorderInsets(Component c, Insets insets) {
            insets.left = MARGIN;
            insets.top = MARGIN;
            insets.right = MARGIN;
            insets.bottom = MARGIN;
            return insets;
        }
    }
    
    class ModifButtonUI extends MetalButtonUI {
    
        private static final ModifButtonUI buttonUI = new ModifButtonUI();
    
        ModifButtonUI() {
        }
    
        public static ComponentUI createUI(JComponent c) {
            return new ModifButtonUI();
        }
    
        @Override
        public void paint(Graphics g, JComponent c) {
            final Color color1 = new Color(230, 255, 255, 0);
            final Color color2 = new Color(255, 230, 255, 64);
            final Color alphaColor = new Color(200, 200, 230, 64);
            final Color color3 = new Color(
                alphaColor.getRed(), alphaColor.getGreen(), alphaColor.getBlue(), 0);
            final Color color4 = new Color(
                alphaColor.getRed(), alphaColor.getGreen(), alphaColor.getBlue(), 64);
            super.paint(g, c);
            Graphics2D g2D = (Graphics2D) g;
            GradientPaint gradient1 = new GradientPaint(
                0.0F, (float) c.getHeight() / (float) 2, color1, 0.0F, 0.0F, color2);
            Rectangle rec1 = new Rectangle(0, 0, c.getWidth(), c.getHeight() / 2);
            g2D.setPaint(gradient1);
            g2D.fill(rec1);
            GradientPaint gradient2 = new GradientPaint(
                0.0F, (float) c.getHeight() / (float) 2, color3, 0.0F, c.getHeight(), color4);
            Rectangle rec2 = new Rectangle(0, c.getHeight() / 2, c.getWidth(), c.getHeight());
            g2D.setPaint(gradient2);
            g2D.fill(rec2);
        }
    
        @Override
        public void paintButtonPressed(Graphics g, AbstractButton b) {
            paintText(g, b, b.getBounds(), b.getText());
            g.setColor(Color.red.brighter());
            g.fillRect(0, 0, b.getSize().width, b.getSize().height);
        }
    
        public void paintBorder(Graphics g) {
        }
    
        @Override
        protected void paintFocus(Graphics g, AbstractButton b,
            Rectangle viewRect, Rectangle textRect, Rectangle iconRect) {
        }
    }
    

    【讨论】:

    • Errrrgh,谁能解释一下,这个生物有什么错误的字符拆分代码,只需从 IDE 复制 + 粘贴
    • 只需缩进四个空格,例如NetBeans 的control-shift-right。在 SO 编辑器中,选择并单击 {} 图标。 +1 示例,顺便说一句。
    • 我从另一个论坛尝试了 all know woodoo,也许是 Stars Imports "*" ... 手和我的脑袋之间有问题,无论如何谢谢
    • 重新格式化代码以恢复先前编辑中丢失的行;如果不正确请还原。在 Mac OS X 上,我使用-Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel 来查看完整效果。感谢这个非常好的例子。 +1
    • 我冒昧地添加了您的ButtonUI 的图像。
    【解决方案4】:

    尝试使用 Jlabel 并将图像用于任何形状!

        JLabel lbl = new JLabel("");
        lbl.setIcon(new ImageIcon("shape.png"));
        lbl.setBounds(548, 11, 66, 20);
        contentPane.add(lbl);
    
        lbl.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                System.exit(0);
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2010-09-05
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2011-11-06
      • 2010-12-23
      • 2016-12-27
      相关资源
      最近更新 更多