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

如果没有,是否有其他方法来创建自定义 JButton 在java中?

有帮助吗?

解决方案

当我第一次学习 Java 时,我们必须制作 Yahtzee,我认为创建自定义 Swing 组件和容器而不是仅仅在一个组件和容器上绘制所有内容会很酷 JPanel. 。延长的好处 Swing 当然,组件的目的是能够添加对键盘快捷键和其他辅助功能的支持,而这些功能仅通过一个组件是无法做到的。 paint() 方法打印一张漂亮的图片。然而,这可能不是最好的方式,但对您来说可能是一个很好的起点。

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

alt text
alt text
alt text

以下是基本步骤:

  1. 创建一个扩展类 JComponent
  2. 调用父构造函数 super() 在你的构造函数中
  3. 确保你的类实现了 MouseListener
  4. 将其放入构造函数中:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. 重写这些方法:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. 重写这个方法:

    public void paintComponent(Graphics g)
    

绘制按钮时必须使用的空间量由以下定义: getPreferredSize(), , 假设 getMinimumSize()getMaximumSize() 返回相同的值。我没有对此进行太多实验,但是根据您用于 GUI 的布局,您的按钮可能看起来完全不同。

最后, 源代码. 。万一我错过了什么。

其他提示

是的,这是可能的。使用 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);
    }

}

请注意,通过覆盖 绘制组件 按钮的内容可以更改,但边框是由 油漆边框 方法。这 获取首选尺寸 方法还需要进行管理,以便动态支持内容的更改。测量字体规格和图像尺寸时需要小心。

对于创建您可以依赖的控件,上面的代码不是正确的方法。Swing 中的尺​​寸和颜色是动态的,并且取决于所使用的外观和感觉。即使是默认的 金属 JRE 版本之间的外观发生了变化。最好实施一下 抽象按钮 并符合 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

了解 LookAndFeel 的结构对于编写控件很有用:创建自定义外观和感觉

您始终可以尝试 Synth 的外观和感觉。您提供一个充当某种样式表的 xml 文件以及您想要使用的任何图像。代码可能如下所示:

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 文件可能如下所示:

<synth>
    <style id="button">
        <font name="DIALOG" size="12" style="BOLD"/>
        <state value="MOUSE_OVER">
            <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
            <insets top="2" botton="2" right="2" left="2"/>
        </state>
        <state value="ENABLED">
            <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
            <insets top="2" botton="2" right="2" left="2"/>
        </state>
    </style>
    <bind style="button" type="name" key="dirt"/>
</synth>

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

还有一些有用的链接:

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

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

我可能走错了一百万英里(但我还年轻:P)。但是您不能将图形添加到面板,然后将鼠标侦听器添加到图形对象,以便当用户在图形上时执行您的操作。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top