В Swing GUI, как показать JPanel максимально развернутым, когда пользователь нажимает кнопку? - PullRequest
1 голос
/ 12 ноября 2009

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

Мое требование: у меня есть JFrame с 4 JPanels с именем

  • JPanelA, JPanelB, JPanelC, JPanelD
  • Здесь JPanelD содержит JList и кнопка под ним говорит "МАКСИМАЛЬНО PANEL ". JList имеет JTree внутри . Иногда JList может есть огромный набор данных, и это не хорошо виден пользователю.

Таким образом, ему нужно максимизировать только этот JPanelD, чтобы ясно видеть содержимое JList. Для этого он нажимает кнопку «MAXIMIZE PANEL». После действия щелчка там остается JPanelD в JFrame, также новый JPanel с тем же самым Должны появиться данные JList (т. Е. Копия JPanelD, скажем, JPanelDMaximized). Это то, что я хочу сделать ..

Ответы [ 4 ]

2 голосов
/ 12 ноября 2009

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

Редактировать: учебник Sun должен дать вам то, что вам нужно.

1 голос
/ 13 ноября 2009

Последующие меры по выяснению проблемы:

Возьми мой код и удали:

maximizedFrame.setUndecorated( true );

и увеличьте размер рамки, прежде чем сделать ее видимой. Это должно удовлетворять максимизирующему поведению, которое вам нужно.

Другая проблема в том, что вы не можете добавить JPanelD к двум JFrames. У всплывающего фрейма должен быть свой уникальный объект JPanel (назовем его JPanelE ). Так что вам нужно:

  1. Инициализировать и выложить JPanelE , как вы делаете JPanelD . Это означает предоставление JPanelE собственного JList (и JTree и т. Д.).
  2. Поделиться ListModel из JList JPanelD с JList JPanelE и так далее. Осуществимость и детали успешного выполнения этого зависят от особенностей вашей реализации и выходят за рамки вашей первоначальной проблемы.
1 голос
/ 12 ноября 2009
  1. Создание JWindow (или неокрашенного JFrame) с помощью JPanel. Сначала оставьте JWindow невидимым. (Подключение этой новой JPanel к той же модели данных, которая использовалась в оригинальной JPanel, оставлено в качестве упражнения.)

  2. Когда выполняется ActionListener вашей кнопки максимизирующей панели, он должен:

    2,1. Обновите (невидимое) местоположение и размер JWindow, чтобы они соответствовали (видимому) JFrame.

    2.2. Сделайте свой JFrame невидимым.

    2,3. Сделайте свое окно J видимым.

  3. Когда выполняется ActionListener вашей кнопки unmaximize-панели, он должен:

    3,1. Обновите местоположение и размер (невидимый) JFrame, чтобы он соответствовал (видимому) JWindow.

    3,2. Сделайте свое JWindow невидимым.

    3,3. Сделайте ваш JFrame видимым

Пример:

package stackoverflow;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MaximizingPanelApp extends JFrame {

private JPanel framePanel;
private JPanel windowPanel;
private JFrame maximizedFrame;

public static void main(String[] args) {
    JFrame appFrame = new MaximizingPanelApp();
    appFrame.setVisible( true );
}

public MaximizingPanelApp() throws HeadlessException {
    super( "Application" );
    setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
    initialize();
}

private void initialize() {
    // JFrame
    {
        Container container = getContentPane();
        container.setLayout( new BorderLayout() );

        framePanel = new JPanel();
        framePanel.setBackground( Color.ORANGE );
        container.add( framePanel, BorderLayout.CENTER );

        JButton button = new JButton( new MaximizeAction() );
        container.add( button, BorderLayout.SOUTH );
        setSize( 400, 300 );
    }

    // JWindow
    {
        maximizedFrame = new JFrame();
        Container container = maximizedFrame.getContentPane();
        container.setLayout( new BorderLayout() );

        windowPanel = new JPanel();
        windowPanel.setBackground( Color.ORANGE );
        container.add( windowPanel, BorderLayout.CENTER );

        JButton button = new JButton( new UnMaximizeAction() );
        container.add( button, BorderLayout.SOUTH );
        maximizedFrame.setSize( getSize() );
        maximizedFrame.setUndecorated( true );
    }

}

private class MaximizeAction extends AbstractAction {

    private MaximizeAction() {
        super( "Maximize" );
    }

    public void actionPerformed(ActionEvent e) {
        maximizedFrame.setSize( getSize() );
        maximizedFrame.setLocation( getLocation() );
        setVisible( false );
        maximizedFrame.setVisible( true );
    }
}

private class UnMaximizeAction extends AbstractAction {

    private UnMaximizeAction() {
        super( "Un-Maximize" );
    }

    public void actionPerformed(ActionEvent e) {
        setLocation( maximizedFrame.getLocation() );
        setSize( maximizedFrame.getSize() );
        maximizedFrame.setVisible( false );
        maximizedFrame.dispose();
        setVisible( true );
    }
}
}
0 голосов
/ 12 ноября 2009

Это зависит от используемого вами менеджера компоновки. Если вы добавите JPanel в JFrame с помощью диспетчера макетов по умолчанию, а JFrame содержит только JPanel и ничего больше, вы получите то, что описали.

Вот пример. JPanel зеленый; обратите внимание, как он изменяется при изменении размера JFrame.

import javax.swing.*;
import java.awt.*;

public class ScratchSpace {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Stretchy panel demo");
        final JPanel panel = new JPanel();
        panel.setOpaque(true);
        panel.setBackground(Color.GREEN);
        panel.setPreferredSize(new Dimension(600, 400));
        final JComponent contentPane = (JComponent) frame.getContentPane();
        contentPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
...