JLabel center drawString () текст для разных размеров - PullRequest
3 голосов
/ 20 сентября 2011

Мой код для пользовательской кнопки:

public class GreyButton extends JLabel {

    private int     ButtonWidth,
                    ButtonHeight;
    String          ButtonText;

    public GreyButton(String BText, int BWidth, int BHeight) {
        super(BText);
        this.ButtonHeight   =   BHeight;
        this.ButtonWidth    =   BWidth;
        this.ButtonText     =   BText;
        setGreyButton();
    }

    private void setGreyButton() {
        this.setPreferredSize(new Dimension(this.ButtonWidth, this.ButtonHeight));
        this.setBackground(Color.LIGHT_GRAY);
        this.setOpaque(false);
        this.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
        this.setForeground(Color.WHITE);
        this.setHorizontalAlignment(SwingConstants.CENTER); //This line
    }

    @Override
    public void paint(Graphics g) {
        paintComponent(g);
    }

    @Override
    public void paintComponent(Graphics g) {
        Graphics2D  Shape                   =   (Graphics2D) g;

        AlphaComposite newComposite         =   AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f);
        Shape.setComposite(newComposite);

        Color[]         FillArray           =   {Color.WHITE, Color.GRAY};
        float[]         Distribution        =   {0.85f, 1.0f};
        GradientPaint   Fill                =   new GradientPaint(10, 8, Color.BLACK, 10, 72, Color.WHITE);         
        Paint           OldPaint            =   Shape.getPaint();

        Shape.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        Shape.setPaint(Fill);
        Shape.fillRect(0, 0, ButtonWidth, ButtonHeight);
        Shape.setPaint(OldPaint);
        Shape.setFont(new Font("Monospace", Font.BOLD, 14));
        Shape.drawString(ButtonText, 0, 0); //This line
    }

}

Это для создания JLabel с пользовательской 2D-графикой. Проблема в том, что я пытаюсь центрировать текст в JLabel, и это должно быть допустимо для любого размера, используемого в конструкторе.

В настоящее время мне нужно вычислить значения и установить второй и третий параметры drawString соответственно.

Вопрос : Существует ли общий способ центрирования текста на JLabel, размер которого может отличаться в зависимости от каждого экземпляра?

Ответы [ 4 ]

4 голосов
/ 21 сентября 2011

Не переопределяйте метод paint () при выполнении пользовательского рисования.Вы никогда не переопределите метод для вызова метода paintCompnent ().

Если вы просто пытаетесь нарисовать собственный фон, то я думаю, что вы бы:

  1. PaintВаш градиентный фон в начале метода paintComponent ().

  2. Затем вызовите super.paintComponent (g).Обычный код рисования будет располагать текст на основе свойства горизонтального выравнивания.

4 голосов
/ 20 сентября 2011

Вы можете получить ширину строки, используя FontMetrics .

    Shape.getFontMetrics().stringWidth(ButtonText);
2 голосов
/ 20 сентября 2011

Альтернатива 1:

Имейте свою кнопку, чтобы расширить JButton. Вызвать setContentAreaFilled (false) для этой кнопки. Переопределите метод paintComponent () кнопки и нарисуйте фон так, как вам хотелось бы, а затем вызовите super.paintComponent () для рисования текста / метки.

Альтернатива 2:

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

То, что я бы сделал, это разрешил GreyButton расширить JPanel. Затем я создал бы класс, расширяющий PanelUI для рисования JPanel, и установил бы этот класс в качестве пользовательского интерфейса JPanel.

После этого я установил GridBagLayout в качестве менеджера по расположению на JPanel и добавил JLabel к JPanel. Менеджер по расположению гарантирует, что JLabel заполняет весь JPanel по горизонтали и вертикали. Таким образом, текст станет центром по центру JPanel.

Другими словами, в конструкторе JPanel я обязательно добавлю JLabel, используя что-то вроде:

    JLabel label = new JLabel("Label");
    GridBagLayout l = new GridBagLayout();
    setLayout(l);

    GridBagConstraints c = new GridBagConstraints();
    c.gridx = 0;
    c.gridy = 0;
    c.fill = GridBagConstraints.BOTH;
    add(label, c0);

Скорее всего, вам придется немного поэкспериментировать с ограничениями, но вышеприведенный фрагмент кода должен послужить хорошим началом.

1 голос
/ 20 сентября 2011

Похоже, вы хотите нарисовать свой собственный JComponent с JButton функциональностью.

1) Не изобретать велосипед; во многих случаях необходимо изменить Look and Feel в Java . Здесь возможно все, например, с Substance, Synthetica и Nimbus.

Если вы действительно хотите взломать JButton в деталях,

2) Вы можете пойти по этому пути с пользовательским ButtonUI; Заметьте, что переопределяет только определенные методы.

3) В некоторых случаях требуется только изменение "Button.background" .

...