2009-05-15 5 views
1

В настоящее время я собираю панель калькулятора с использованием Java Swing. Тем не менее, это крайняя PAIN, чтобы выровнять все кнопки, потому что они всегда изменяют размер и перемещают themseleves всякий раз, когда я добавляю новую кнопку или изменяю размер кнопки.Можете ли вы сохранить положение объектов на панели Java Swing?

Есть ли тип макета или что-то, что может «заблокировать» кнопки в таком положении, чтобы они не затрагивались, когда я перемещаю/изменяю размер/добавляю другие кнопки?

Спасибо, Боб

+0

GridLayout? GridBagLayout? Я не уверен, что я точно понимаю вопрос; как кнопки перемещаются и меняют размер? –

ответ

0

Вы можете использовать GridBagLayout, чтобы держать их в сетке, но позволяет им изменять размер

1

Я предлагаю вместо добавления и удаления кнопок, изменить их свойство видимости (setVisible). Некоторые диспетчер компоновки игнорируют невидимые компоненты, поэтому вам может потребоваться добавить компонент non-opqaue (или соответствующий фон) в той же позиции, которая будет следовать за предпочтительными/минимальными/максимальными размерами исходного компонента. Более простой, вы можете использовать OverlayLayout.

3

EXTENDING что сказал Том ...

Чтобы компонент, чтобы стать невидимым еще держать свое место, вы можете поместить его в CardLayout вместе с пустой меткой и только своп, который виден.

Вы можете создать класс для этого, как показано ниже. В основном показан пример, где, если вы нажмете кнопку, она будет удалена, сохранив ее положение. Я вставляю showComponent/hideComponent и setVisible (t/f) - зависит от стиля, который вам нравится.

Это может не точно ответить на то, что вы ищете, но может быть полезным для части вашего приложения.

public class Placeholder extends JPanel { 
    private static final long serialVersionUID = 1L; 
    private CardLayout cardLayout_; 
    public Placeholder(JComponent component) { 
     cardLayout_ = new CardLayout(); 
     setLayout(cardLayout_); 
     add(component, "visible"); // the component 
     add(new JLabel(), "hidden"); // empty label 
    } 
    public void showComponent() { 
     cardLayout_.show(this, "visible"); 
    } 
    public void hideComponent() { 
     cardLayout_.show(this, "hidden"); 
    } 
    public void setComponentVisible(boolean visible) { 
     if (visible) 
      showComponent(); 
     else 
      hideComponent(); 
    } 
    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     f.setLayout(new GridLayout(2,0)); 
     for (int n = 1; n < 10; n++) { 
      JButton b = new JButton(n + ""); 
      final Placeholder placeholder = new Placeholder(b); 
      f.add(placeholder); 
      b.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        placeholder.hideComponent(); 
       } 
      }); 
     } 
     f.pack(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.setVisible(true); 
    } 
} 
+0

Это работает! Как сделать JLabel прозрачным, чтобы ничего не отображалось, когда компонент скрыт? – ATOzTOA

+0

Игнорировать мой вопрос, у заполнителя был непрозрачный фон :) – ATOzTOA

0

EXTENDING то, что другие сказали ...

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

Помимо вышеупомянутых макетов, есть некоторые свободно доступные, такие как TableLayout и универсальный MigLayout.

0

Возможно, это зависит от среды разработки, которую вы используете.

В Netbeans вы можете щелкнуть правой кнопкой мыши контейнер управления (форма/панель) и выбрать из нескольких вариантов компоновки. «Абсолютная компоновка» позволит вам позиционировать элементы управления без их автоматического изменения, хотя это не позволит вам размещать элементы управления друг над другом.

0

Предлагаю вам проверить A Visual Guide to Layout Managers. В зависимости от вида и функциональности, которые вы хотите, есть разные макеты, которые могут сработать для вас. Если основной проблемой является операция изменения размера (из исходной JFrame o JPanel, которую я предполагаю), то Spring Layout позволяет установить ограничения относительно относительного места компонентов.

Смежные вопросы