Заполнение JButton внутри JPanel - PullRequest
0 голосов
/ 15 ноября 2018

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

enter image description here

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

enter image description here

, поскольку вы можете видеть, что цвет заполнен в пределах всего бара.Я хотел бы воссоздать это.

Итак, вот код, следующий за Custom JButtonClass для создания эффекта наведения.

public class LynxButton extends JButton {
    public LynxButton(){
        super.setContentAreaFilled(false);
    }

    public LynxButton(String text) {
        super(text);
        super.setContentAreaFilled(false);
    }

    @Override
    protected void paintComponent(Graphics g) {
        Color pressedColor = ThemeManager.red_LYNX.darker();
        if (getModel().isPressed()) {
            g.setColor(pressedColor);
        } else if (getModel().isRollover()) {
            g.setColor(pressedColor);
        } else {
            g.setColor(getBackground());
        }
        g.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(g);
    }


    @Override
    public void setContentAreaFilled(boolean b) {
    }
}

, а затем мы определяем код, используя

    LynxButton exitButton = new LynxButton();
    exitButton.setIcon(...);
    exitButton.setBorder(null);

Я попытался установить поле, чтобы посмотреть, исправит ли это проблему, но опять не повезло с этим.

exitButton.setMargin(new Insets(0, 0, 0, 0));

Редактировать: Забыл показать определение JPanel

JPanel buttonContainer = new JPanel(new FlowLayout(FlowLayout.RIGHT));

buttonContainer заполняет всю верхнюю панель, подтвердил это, удалив вызов setBackgroundColor.

enter image description here

1 Ответ

0 голосов
/ 15 ноября 2018

Вы не вычислили hgap и vgap из FlowLayout дюйма. Они действуют как естественная граница.

Все, что вам нужно сделать, это изменить инициализацию вашего JPanel на new JPanel(new FlowLayout(FlowLayout.RIGHT), 0, 0)

Пример кода:

public static void main(String[] args) {
    JFrame f = new JFrame();
    TestA b = new TestA("X");
    JPanel buttonContainer = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));
    buttonContainer.setBackground(Color.GREEN);
    buttonContainer.add(b);
    f.add(buttonContainer);
    f.pack();
    f.setVisible(true);
}

TestA ваш LynxButton

class TestA extends JButton {
    public TestA() {
        super.setContentAreaFilled(false);
    }

    public TestA(String text) {
        super(text);
        super.setContentAreaFilled(false);
    }

    @Override
    protected void paintComponent(Graphics g) {
        Color pressedColor = Color.RED;
        if (getModel().isPressed()) {
            g.setColor(pressedColor);
        } else if (getModel().isRollover()) {
            g.setColor(pressedColor);
        } else {
            g.setColor(getBackground());
        }
        g.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(g);
    }

    @Override
    public void setContentAreaFilled(boolean b) {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...