2010-02-20 4 views
2

Есть ли способ создать класс границы с кнопками на нем? Например: exampleРазмещение кнопки на границе панели

Одно важное условие - кнопки должны быть выровнены по положению границы, потому что панель может изменить ее размер. Так что imho LayeredPane не подходит для этого - на нем нет никаких агиментов.

Есть одна идея - имитировать кнопки:

  • создать свой класс для панели
  • переопределения paintComponent() и краски изображение кнопки над границей
  • переопределения события мыши для него и использовать его кнопки, как

Но. Может быть, есть способ поставить реальные кнопки на границе?

ответ

1

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

Но, если вы готовы пойти на реализацию таможенной границы, можно подделать границы, например:

private class BorderFaker extends JPanel 
{ 
    public BorderFaker() 
    { 
    add(new JButton("Faked!")); 
    } 

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

    private void drawFauxBorder(Graphics g) 
    { 
    g.setColor(UIManager.getColor("border")); 
    g.drawRect(15, 15, getWidth() - 30, getHeight() - 30); 
    } 
} 

Это показывает, как вы могли сделать это, но он вводит много проблем, таких как различие между компонентами, которые вы хотите видеть внутри границы или на границе (я только жестко запрограммировал кнопку «Faked!» для демонстрации). И вам еще предстоит организовать компоновку компонентов относительно «границы». Это потребует некоторой осторожной обработки компонентов и удобной компоновки - как первоначально предлагалось @trashgod.

Тем не менее, я не знаю, я бы предпочел сделать что-то подобное и подделать границу, чем подделка, нарисовав кнопку. Если вы нарисуете свою собственную кнопку, вы потеряете соответствие текущему виду и ощущению, и, если вы не будете делать все, что делает пользовательский интерфейс кнопки (обрабатывать опрокидывания, вооруженное состояние и т. Д.), Вряд ли он будет выглядеть хорошо.

+0

Спасибо. Как я думал ... Ну, кажется, я выбрал правильный путь - собираюсь использовать изображения. Это будет компонент качания для netbeans. Вот почему. Легче создать класс ImageButton (с состояниями, опрокидываниями и т. Д.). И более удобно для моих целей. Кроме того, эти кнопки определенно будут маленькими значками. Итак ... В любом случае, еще раз спасибо :) – imp

0

Обязательно посмотрите на Using Layout Managers. Второй пример в How to Use BoxLayout очень похож на ваш пример.

Addendum: Возможно, возможно продлить AbstractBorder, как описано в Creating Custom Borders, для достижения желаемого эффекта. Вы можете передать слушателю кнопки, как обсуждалось here, или сохранить свой собственный список слушателей.

+0

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

+0

Извините, я пропустил суть вашего вопроса. – trashgod

+0

Да, я подумал об этом. Но этот способ имеет те же проблемы :) Все уже решили использовать изображения. Спасибо. – imp

1

Класс Component Border был разработан таким образом, чтобы вы могли добавлять компонент в качестве границы к любому компоненту.

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

// component.setLocation((int)x2, (int)y2); 
component.setLocation(10, 0);