如何用数字绘制JButton的角落?

时间:2012-01-08 12:04:07

标签: java swing jbutton

我在Java Swing中创建了一个简单的Kakuro应用程序,我使用JButton作为单元格。我已经完成了从生成网格(setBackground(Color.BLACK)setBackground(Color.WHITE))到填充唯一数字的所有内容。

但问题是,我不知道如何在JButton的末尾绘制“线索”。我想要的是类似于:

enter image description here

有时数字可能只出现在3面,2面或甚至1面。

我想过设置背景图片,但不可能,因为数字是动态生成数字的总和(网格是动态的)。

所以任何想法如何获得这种JButton?或者,如果不可能,我还有其他选择吗?

提前多多感谢(我真的被卡住了)。

4 个答案:

答案 0 :(得分:3)

使用JLabels,{/ 1}}向JButton添加BorderLayout非常简单和舒适

import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class FourLabelsInButton {

    private JFrame frame;
    private JButton myButton1;
    private JLabel myButton1_Label_N;
    private JLabel myButton1_Label_E;
    private JLabel myButton1_Label_W;
    private JLabel myButton1_Label_S = new JLabel();

    public FourLabelsInButton() {
        myButton1_Label_N = new JLabel("45");
        myButton1_Label_N.setHorizontalAlignment(JLabel.CENTER);
        myButton1_Label_N.setForeground(Color.red);

        myButton1_Label_E = new JLabel("1");
        myButton1_Label_E.setHorizontalAlignment(JLabel.CENTER);
        myButton1_Label_E.setForeground(Color.red);

        myButton1_Label_W = new JLabel("9");
        myButton1_Label_W.setHorizontalAlignment(JLabel.CENTER);
        myButton1_Label_W.setForeground(Color.red);

        myButton1_Label_S = new JLabel("21");
        myButton1_Label_S.setHorizontalAlignment(JLabel.CENTER);
        myButton1_Label_S.setForeground(Color.red);

        myButton1 = new JButton();
        myButton1.setBackground(Color.black);
        myButton1.setLayout(new BorderLayout());
        myButton1.add(myButton1_Label_N, BorderLayout.NORTH);
        myButton1.add(myButton1_Label_E, BorderLayout.EAST);
        myButton1.add(myButton1_Label_W, BorderLayout.WEST);
        myButton1.add(myButton1_Label_S, BorderLayout.SOUTH);

        frame = new JFrame();
        frame.add(myButton1);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                FourLabelsInButton ggg = new FourLabelsInButton();
            }
        });
    }
}

答案 1 :(得分:2)

  

我想过设置背景图片,但不可能,因为数字是动态生成数字的总和(网格是动态的)。

按钮的图像也可以动态生成。

答案 2 :(得分:2)

您也可以使用自定义组件。对于这种情况,绘画可以非常简单地实现:

class KakuroComponent extends JComponent {

    private final int[] numbers;

    public KakuroComponent(int... numbers) {
        this.numbers = numbers;
    }

    @Override
    public void paintComponent(Graphics g) {
        int w = getWidth();
        int h = getWidth();

        g.setColor(Color.black);
        g.fillRect(0, 0, w, h);

        g.setColor(Color.white);
        g.drawLine(0, 0, w, h);
        g.drawLine(w - 1, 0, 0, h - 1);

        if (numbers[0] > 0) // if there is a top number
            drawStringCentered(g, String.valueOf(numbers[0]), w / 2, h / 6);
        if (numbers[1] > 0) // if there is a left number
            drawStringCentered(g, String.valueOf(numbers[1]), w / 6, h / 2);
        if (numbers[2] > 0) // if there is a right number
            drawStringCentered(g, String.valueOf(numbers[2]), w * 5 / 6, h / 2);
        if (numbers[3] > 0) // if there is a bottom number
            drawStringCentered(g, String.valueOf(numbers[3]), w / 2, h * 5 / 6);
    }

    void drawStringCentered(Graphics g, String s, int x, int y) {
        Rectangle2D bounds = g.getFontMetrics().getStringBounds(s, g);
        g.drawString(s, (int) (x - bounds.getCenterX()), (int) (y - bounds.getCenterY()));
    }
}

答案 3 :(得分:0)

你不应该通过覆盖paint()方法在JButton中简单地绘制任何你想要的东西。

public class KakuroSquare extends JButton
{
   /* ... */

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

       /* Your paint logic. */
   }
}