Расширение функциональности простого графического интерфейса

Я пытаюсь научить себя создавать графический интерфейс с помощью Java Swing и Window Builder Pro после просмотра нескольких видеороликов на YouTube, чтения некоторых руководств и задания предыдущего вопроса, расположенного здесь Я сделал следующее.

public class JetstreamFrame extends JFrame {

private static final long serialVersionUID = 1L;
JTabbedPane tabPane;

private JPanel buttonOnePanel;
private JPanel buttonTwoPanel;
private SpringLayout springLayout;
private SpringLayout sl_buttonTwoPanel;
private SpringLayout sl_buttonOnePanel;
private JButton ButtonTwo;
private JButton ButtonOne;
private JScrollPane displayTextPanel;
private JTextArea textArea;
private ScrollPaneLayout sl_displayTextPanel;
private JComboBox<String> comboBox;

public JetstreamFrame() {
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    springLayout = new SpringLayout();
    getContentPane().setLayout(springLayout);

    tabPane = new JTabbedPane(JTabbedPane.TOP);
    setupTabPane();

    buttonOnePanel = new JPanel();
    sl_buttonOnePanel = new SpringLayout();
    setupButtonOnePanel();


    buttonTwoPanel = new JPanel();
    sl_buttonTwoPanel = new SpringLayout();
    setupButtonTwoPanel();

    ButtonOne = new JButton("Click Here!");
    setupButtonOne();

    setupComboBox();

    ButtonTwo = new JButton("Click Here!");
    setupButtonTwo();

    displayTextPanel = new JScrollPane(textArea);
    sl_displayTextPanel = new ScrollPaneLayout();
    setupDisplayTextPanel();

    textArea = new JTextArea();
    displayTextPanel.setViewportView(textArea);
}

private void setupTabPane()
{
    springLayout = new SpringLayout();
    springLayout.putConstraint(SpringLayout.NORTH, tabPane, 0, SpringLayout.NORTH, getContentPane());
    springLayout.putConstraint(SpringLayout.WEST, tabPane, 0, SpringLayout.WEST, getContentPane());
    springLayout.putConstraint(SpringLayout.SOUTH, tabPane, 245, SpringLayout.NORTH, getContentPane());
    springLayout.putConstraint(SpringLayout.EAST, tabPane, 484, SpringLayout.WEST, getContentPane());
    getContentPane().setLayout(springLayout);
    springLayout.putConstraint(SpringLayout.NORTH, tabPane, 0, SpringLayout.NORTH, getContentPane());
    springLayout.putConstraint(SpringLayout.WEST, tabPane, 0, SpringLayout.WEST, getContentPane());
    springLayout.putConstraint(SpringLayout.SOUTH, tabPane, -198, SpringLayout.SOUTH, getContentPane());
    springLayout.putConstraint(SpringLayout.EAST, tabPane, 484, SpringLayout.WEST, getContentPane());
    getContentPane().add(tabPane);
}

private void setupButtonOnePanel()
{
    tabPane.addTab("Tab One", null, buttonOnePanel, null);
    buttonOnePanel.setLayout(sl_buttonOnePanel);
}

private void setupButtonOne()
{
    ButtonOne.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) 
        {
            textArea.append("You pressed button one, ");
            textArea.append("ComboField: " + (String)comboBox.getSelectedItem() + "\n");
        }
    });
    sl_buttonOnePanel.putConstraint(SpringLayout.NORTH, ButtonOne, 99, SpringLayout.NORTH, buttonOnePanel);
    sl_buttonOnePanel.putConstraint(SpringLayout.WEST, ButtonOne, 187, SpringLayout.WEST, buttonOnePanel);
    buttonOnePanel.add(ButtonOne);
}

@SuppressWarnings({ "rawtypes", "unchecked" })
private void setupComboBox()
{
    String[] array = { "1" , "2", "3", "4" };
    comboBox = new JComboBox(array);
    sl_buttonOnePanel.putConstraint(SpringLayout.NORTH, comboBox, 99, SpringLayout.NORTH, buttonOnePanel);
    sl_buttonOnePanel.putConstraint(SpringLayout.WEST, comboBox, 6, SpringLayout.EAST, ButtonOne);
    sl_buttonOnePanel.putConstraint(SpringLayout.EAST, comboBox, 167, SpringLayout.EAST, ButtonOne);
    buttonOnePanel.add(comboBox);
}

private void setupButtonTwoPanel()
{
    tabPane.addTab("Tab Two", null, buttonTwoPanel, null);
    buttonTwoPanel.setLayout(sl_buttonTwoPanel);
}

private void setupButtonTwo()
{
    ButtonTwo.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) 
        {
            textArea.append("You pressed button two\n");
        }
    });
    sl_buttonTwoPanel.putConstraint(SpringLayout.NORTH, ButtonTwo, 99, SpringLayout.NORTH, buttonTwoPanel);
    sl_buttonTwoPanel.putConstraint(SpringLayout.WEST, ButtonTwo, 187, SpringLayout.WEST, buttonTwoPanel);
    buttonTwoPanel.add(ButtonTwo);
}

private void setupDisplayTextPanel()
{
    springLayout.putConstraint(SpringLayout.NORTH, displayTextPanel, 5, SpringLayout.SOUTH, tabPane);
    springLayout.putConstraint(SpringLayout.WEST, displayTextPanel, 5, SpringLayout.WEST, tabPane);
    springLayout.putConstraint(SpringLayout.SOUTH, displayTextPanel, 195, SpringLayout.SOUTH, tabPane);
    springLayout.putConstraint(SpringLayout.EAST, displayTextPanel, -5, SpringLayout.EAST, tabPane);
    getContentPane().add(displayTextPanel);
    displayTextPanel.setLayout(sl_displayTextPanel);
}

public void start()
{
    this.setSize(500, 500);
    this.setVisible(true);
}
}

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

У меня есть несколько функций, которые я хотел бы реализовать, но я не уверен, как двигаться дальше.

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

Другой вариант, который я хотел бы уточнить, - это редактирование содержимого поля со списком после построения. В идеале я хотел бы иметь возможность добавлять и удалять записи из поля с помощью нажатия кнопок. Я не могу найти метод, который позволяет мне установить содержимое поля, и кажется, что единственный способ сделать это — создавать новое поле со списком каждый раз, когда вносятся изменения. Есть ли более эффективный способ сделать это?


person JME    schedule 02.07.2013    source источник


Ответы (3)


Чтобы ваш фрейм имел фиксированный размер, просто используйте setResizable(false)

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);// <- add this line

Если вы хотите изменить содержимое поля со списком, вы можете использовать один из многих методов, таких как

  • removeItem(item) удалит определенный элемент
  • removeItemAt(index) удалит элемент в указанной позиции (считая с 0)
  • addItem(item) добавит новый элемент в конец списка
  • insertItemAt(item, index) вставит элемент в указанное место, переместив текущий элемент вниз
  • у вас также есть removeAllItems() угадайте, что он делает :)

Вы можете найти много полезной информации в документации этого класса

person Pshemo    schedule 02.07.2013

заключается в отключении возможности изменения размера окна.

frame.setResizable( false );

Поскольку я не могу найти простой способ сохранить относительные поля при изменении размера

Существуют более простые в использовании менеджеры компоновки, чем SpringLayout. Этот макет обычно используется только IDE, потому что он относительно сложен. Вот почему большинство из нас создает GUI вручную, чтобы не ограничиваться IDE.

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

Для замены всего содержимого необходимо заменить модель.

comboBox.setModel(...);

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

person camickr    schedule 02.07.2013

Что касается вашей проблемы JComboBox, вы можете использовать getItemAt(int index) для извлечения вашего элемента (есть дополнительные геттеры), addItem(E item) для добавления в ваш список и, наконец, removeItemAt(int index) для удаления элемента из вашего списка (есть дополнительные методы удаления). Просто убедитесь, что вы вызываете setEditable(true), так как по умолчанию JComboBox не редактируется.

Кроме того, чтобы сделать окно фиксированного размера, вызовите для него setResizable(false);.

person Steve P.    schedule 02.07.2013