用Java创建一个自定义的JButton

有没有办法用你自己的按钮图形创建一个 JButton ,而不仅仅是在按钮内部有一个图像?

如果没有,是否有另一种方法在java中创建自定义 JButton

0
额外 编辑
意见: 1

5 答案

当我第一次学习Java,我们不得不作出Yahtzee的,我认为这将是很酷的一个<�代码>的JPanel </代码>创建自定义Swing组件和容器,而不是仅仅绘制的一切。延长的好处<�代码>秋千的组成部分,当然是必须添加的键盘快捷键和其他辅助功能的支持,你不能这样做的能力,只是由具有<�码>的paint()</代码>方法打印一个漂亮的图片。但是,这可能不是最好的方式,但它可能是一个很好的起点。

编辑8/6 - 如果图像不明显,每个Die都是一个可以点击的按钮。这会将其移至下面的 DiceContainer 。查看源代码,您可以看到每个Die按钮都是根据其值来动态绘制的。

alt text
alt text
alt text

以下是基本步骤:

  1. Create a class that extends JComponent
  2. Call parent constructor super() in your constructors
  3. Make sure you class implements MouseListener
  4. Put this in the constructor:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. Override these methods:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. Override this method:

    public void paintComponent(Graphics g)
    

绘制按钮时必须使用的空间量由 getPreferredSize()定义,假定 getMinimumSize()getMaximumSize()返回相同的价值。我还没有尝试过太多,但是,根据您在GUI中使用的布局,您的按钮可能看起来完全不同。

最后,源代码。如果我错过了任何事情。

0
额外
你能把整个代码放在这里吗?
额外 作者 Doug Hauf,
嗨,首先感谢代码!我会建议在你的代码中添加一个'setActionComme(String Command)'。它是在Swing中过滤事件的方法之一。 (但是你可以争辩说有1001件事情可以加入,以使事情稍微好一点:P)
额外 作者 Jason Rogers,
要创建一个你可以按的模子,你可以通过利用setIcon / setPressedIcon以及JButton中的其他图标功能来实际使用一个普通的旧JButton(而不是子类化或创建一个定制的JComponent)
额外 作者 ControlAltDel,

You could always try the Synth look & feel. You provide an xml file that acts as a sort of stylesheet, along with any images you want to use. The code might look like this:

try {
    SynthLookAndFeel synth = new SynthLookAndFeel();
    Class aClass = MainFrame.class;
    InputStream stream = aClass.getResourceAsStream("\\default.xml");

    if (stream == null) {
        System.err.println("Missing configuration file");
        System.exit(-1);                
    }

    synth.load(stream, aClass);

    UIManager.setLookAndFeel(synth);
} catch (ParseException pe) {
    System.err.println("Bad configuration file");
    pe.printStackTrace();
    System.exit(-2);
} catch (UnsupportedLookAndFeelException ulfe) {
    System.err.println("Old JRE in use. Get a new one");
    System.exit(-3);
}

从那里开始,像往常一样添加你的JButton。唯一的变化是你使用setName(string)方法来确定按钮应该映射到xml文件中的内容。

xml文件可能如下所示:


    
    

那里的绑定元素指定要映射到的内容(在此示例中,它将将该样式应用于name属性已设置为“dirt”的任何按钮)。

还有一些有用的链接:

http://javadesktop.org/articles/synth/

http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel /synth.html

0
额外

是的,这是可能的。使用Swing的主要优点之一是抽象控件可以轻松创建和操作。

这是一种快速和肮脏的方式来扩展现有的JButton类以在文本的右侧绘制一个圆。

package test;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MyButton extends JButton {

    private static final long serialVersionUID = 1L;

    private Color circleColor = Color.BLACK;

    public MyButton(String label) {
        super(label);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Dimension originalSize = super.getPreferredSize();
        int gap = (int) (originalSize.height * 0.2);
        int x = originalSize.width + gap;
        int y = gap;
        int diameter = originalSize.height - (gap * 2);

        g.setColor(circleColor);
        g.fillOval(x, y, diameter, diameter);
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension size = super.getPreferredSize();
        size.width += size.height;
        return size;
    }

    /*Test the button*/
    public static void main(String[] args) {
        MyButton button = new MyButton("Hello, World!");

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);

        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new FlowLayout());
        contentPane.add(button);

        frame.setVisible(true);
    }

}

请注意,通过覆盖 paintComponent ,可以更改按钮的内容,但边框由 paintBorder 方法绘制。还需要管理 getPreferredSize 方法以动态支持对内容的更改。测量字体指标和图像尺寸时需要注意。

为了创建一个可以依赖的控件,上面的代码不是正确的方法。尺寸和颜色在Swing中是动态的,并且取决于所使用的外观和感觉。即使默认的 Metal 外观在JRE版本中也发生了变化。实施 AbstractButton 会更好,并符合Swing API规定的准则。一个好的起点是查看 javax.swing.LookAndFeeljavax.swing.UIManager 类。

http://docs.oracle.com/javase/8 /docs/api/javax/swing/LookAndFeel.html

http://docs.oracle.com/javase/8 /docs/api/javax/swing/UIManager.html

Understanding the anatomy of LookAndFeel is useful for writing controls: Creating a Custom Look and Feel

0
额外

自从我早期的CS类以来,我还没有做过SWING开发,但如果它不是内置的,那么您可以继承javax.swing.AbstractButton并创建自己的。将某些东西与现有框架连接起来应该非常简单。

0
额外

我可能会在错误的直接进行一百万英里(但我只是年轻的:P)。但是不能将图形添加到面板,然后添加到图形对象的mouselistener,以便在图形上的用户执行动作时执行。

0
额外
这会起作用,但我宁愿使用标准的JButton,而不是创建我的类型的按钮,如果可能的话。
额外 作者 Anton,