2016-10-08 8 views
0

Итак, у меня есть JButton, что, когда вы наводите на него курсор, появляется подчеркивание с использованием HTML. Однако, когда подчеркивание добавляется, он делает бит JButton немного большим, чем предполагалось.Как остановить рост JButton после добавления подчеркивания?

Я попробовал несколько вещей, как

button.setMaximumSize(button.getPreferredSize());

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

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

ОБРАЗЦА КЛАСС

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 
import javax.swing.plaf.metal.MetalButtonUI; 

public class UnderlineSample extends JFrame { 
    public UnderlineSample() { 
     super("Underline Sample"); 
     setLayout(new GridBagLayout()); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setPreferredSize(new Dimension(300, 150)); 

     String text = 
       "<html>" 
        + "<p style = 'border-bottom: 1px solid rgba(0,0,0,0,0); box-sizing: border-box;'>" 
         + "<span style = 'color: rgb(0, 0, 255); font-weight: bold;'>" 
          + "Sample" 
         + "</span> " 
         + " underline button" 
        + "</p>" 
       + "</html>"; 
     JButton button = new JButton(text); 
     button.setFont(new Font("", Font.PLAIN, 18)); 
     button.setFocusable(false); 
     button.setBackground(Color.LIGHT_GRAY); 
     button.setForeground(Color.BLACK); 
     button.setUI(new MetalButtonUI()); 
     button.setHorizontalAlignment(SwingConstants.LEFT); 
     button.setAlignmentX(LEFT_ALIGNMENT); 

     button.addMouseListener(new MouseAdapter() { 
      public void mouseEntered(MouseEvent e) { 
       String s = 
        "<html>" 
         + "<p style = 'border-bottom: 1px solid black; box-sizing: border-box;'>" 
          + "<span style = 'color: rgb(0, 0, 255); font-weight: bold;'>" 
           + "Sample" 
          + "</span> " 
          + " underline button" 
         + "</p>" 
        + "</html>"; 
       button.setText(s); 
      } 

      public void mouseExited(MouseEvent e) { 
       String s = 
        "<html>" 
         + "<p style = 'border-bottom: 1px solid rgba(0,0,0,0,0); box-sizing: border-box;'>" 
          + "<span style = 'color: rgb(0, 0, 255); font-weight: bold;'>" 
           + "Sample" 
          + "</span> " 
          + " underline button" 
         + "</p>" 
        + "</html>"; 
       button.setText(s); 
      } 
     }); 

     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.WEST; 
     gbc.weightx = 1; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.ipady = 10; 
     gbc.insets = new Insets(0, 10, 5, 10); 

     add(button, gbc); 

     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new UnderlineSample(); 
    } 
} 

ответ

2

html/css Предоставление в Swing, не имеет поддержки для всех стилей CSS. Дело в точке rgba не работает (вы можете проверить это самостоятельно, добавив цветную рамку, используя rgba, которую вы ожидаете получить, а не альфа-0, и увидите результат).

Другими словами, граница с rgba не отображается, поэтому изменение размера при добавлении рендерируемого пограничного дна с помощью MouseListener.mouseEntered. Вы можете обмануть его, используя rgb, который имеет тот же цвет, что и цвет фона. Что-то вроде:

<p style = 'border-bottom: 1px solid rgb(200,200,200); box-sizing: border-box;'> 
+0

Спасибо, это сработало. У меня есть последний вопрос. При попытке этого я заметил, что пробелы между значениями rgb заставляют его не работать. Например, в то время как это сработало: 'rgb (4,137,181);', это не было: 'rgb (4, 137, 181);'. вы знаете, почему это так? – Ryan

+0

Рад, что это сработало. «Я заметил, что пробелы между значениями rgb заставляют его не работать». Whitespace [технически разрешено] (https://www.w3.org/TR/css3-color/#rgb-color) - это демонстрация того, что Swing css/html parser далек от совершенства. – copeg

+0

Хорошо, еще раз спасибо – Ryan