Как покрасить углы JButton числами? - PullRequest
2 голосов
/ 08 января 2012

Я делаю простое приложение Kakuro на Java Swing, и я использовал JButton s в качестве ячеек. Я сделал все, от создания сетки (setBackground(Color.BLACK) и setBackground(Color.WHITE)) до заполнения уникальными числами.

Но проблема в том, что я не знаю, как нарисовать «подсказки» на концах JButton с. То, что я хочу, похоже на:

enter image description here

Иногда числа могут появляться только на 3 сторонах, 2 сторонах или даже 1 стороне.

Я думал о настройке фоновых изображений, но это невозможно, поскольку числа представляют собой суммы динамически генерируемых чисел (сетка является динамической).

Так есть идеи, как получить этот вид JButton? Или, если это невозможно, какие еще есть варианты?

Заранее большое спасибо (я действительно застрял).

Ответы [ 4 ]

3 голосов
/ 08 января 2012

очень простой и удобный способ добавить JLabels к 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();
            }
        });
    }
}
2 голосов
/ 08 января 2012

Я думал о настройке фоновых изображений, но это невозможно, так как числа представляют собой суммы динамически генерируемых чисел (сетка является динамической).

Изображения для кнопок также могут бытьгенерируется динамически.

2 голосов
/ 08 января 2012

Вы также можете использовать пользовательский компонент. Для этого случая картина может быть реализована довольно просто:

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()));
    }
}
0 голосов
/ 08 января 2012

Не должно быть никаких причин, по которым вы не можете просто нарисовать что-либо в JButton, переписав метод paint().

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

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

       /* Your paint logic. */
   }
}
...