Граница JButton не исчезает, даже если установить границу в EmptyBorder

#java #swing #user-interface #jbutton #imageicon

#java #качать #пользовательский интерфейс #jbutton #imageicon

Вопрос:

Я разрабатываю графический интерфейс с использованием Eclipse на Mac, и я хочу JButton , чтобы отображался только значок, который я установил. В Mac OS это выглядит нормально, но когда я экспортирую его в файл jar и запускаю в ОС Windows, JButton выглядит так:

введите описание изображения здесь

Границы — это все EmptyBorder .

Что я сделал не так? Как я могу убрать квадрат сзади?

Комментарии:

1. Звучит как проблема с L amp; F. И, возможно, две операционные системы по-разному интерпретируют прозрачные пиксели в формате файла, который вы используете (хотя мне это кажется маловероятным). Какой формат файла вы используете? Кроме того, если вы можете создать scce , это может оказаться полезным.

2. @Xiaofan Wu просто убедитесь, что это состояние для JButton из Windows или из MAC OS

Ответ №1:

Чтобы правильно ответить на этот вопрос, скорее всего, потребуется SSCCE. В любом случае, я полагаю, что вы захотите вызвать setContentAreaFilled(false) свои JButton экземпляры. Это должно эффективно удалить «квадрат».

Однако важно отметить, что точное поведение вызова этой функции зависит от компонента за компонентом и от L amp; F-по-L amp; F.


 import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public final class JButtonDemo {
    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                createAndShowGUI();             
            }
        });
    }

    private static void createAndShowGUI(){
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JIconButton());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private static final class JIconButton extends JButton{
        private static final long serialVersionUID = 7274140930080397481L;

        public JIconButton(){
            super(UIManager.getIcon("OptionPane.informationIcon"));
            setContentAreaFilled(false);
            setFocusPainted(false);
            setBorder(BorderFactory.createEmptyBorder());
        }
    }
}
  

введите описание изображения здесь

Комментарии:

1. 1 работает com.apple.laf.AquaLookAndFeel , но подсказки пользовательского интерфейса «Включено и нажато» исчезают; для развлечения попробуйте добавить this.setPressedIcon(UIManager.getIcon("OptionPane.warningIcon")) .

2. @mre: setContentAreaFilled(false) работает! но я не писал свой собственный класс JButton, мне просто понравился OKButton.setContentAreaFilled(false); и так далее. Это работает!

Ответ №2:

1) невозможно воспроизвести это, слишком сложно сказать, не видя кода, который вы написали для этого,

2) поскольку вы коснулись XxxButtonUI, и это действительно проблема, связанная с родной ОС, какой внешний вид и ощущения используются для этого

3) что произойдет, если вы переопределите MetalButtonUI?

4) есть ли прозрачный фон, или с каким-либо цветом, или …