Как я могу сделать JFrame изменить размер автоматически, чтобы отобразить все кнопки - PullRequest
2 голосов
/ 24 ноября 2010

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

Моя проблема, когда я запускаю приложение, во время использования меняется текст на одной из кнопок, что увеличивает его ширину. Однако размер окна не изменяется, чтобы приспособиться к этому, и одна из кнопок исчезает. Я снова подумал о вызове pack (), но JFrame - это локальная переменная в моем конструкторе, и мне не нужно было указывать моей программе изменить размер, верно? Я не смог найти что-либо в Google или здесь, чтобы помочь мне, но должно быть простое решение, что мне не хватает? Код ниже.

    playButton = new JButton("Play");
    pauseButton = new JButton("Pause");
    stopButton = new JButton("Stop");
    curTrackLabel = new JLabel("No Track Selected");

    JFrame myFrame = new JFrame("MediaPlayer");
    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    myFrame.setTitle("MediaPlayer");
    myFrame.setLocation(400,300);

    JPanel topPanel = new JPanel();
    topPanel.setLayout(new BorderLayout());
    myFrame.add(topPanel);
    JPanel buttonPanel = new JPanel(new FlowLayout());

    buttonPanel.add(playButton);
    buttonPanel.add(pauseButton);
    buttonPanel.add(stopButton);
    topPanel.add(buttonPanel, BorderLayout.CENTER);
    topPanel.add(curTrackLabel, BorderLayout.NORTH);

    playButton.addActionListener(new playButtonHandler());
    pauseButton.addActionListener(new pauseButtonHandler());
    stopButton.addActionListener(new stopButtonHandler());

    myFrame.pack();
    myFrame.setVisible(true);

Ответы [ 2 ]

5 голосов
/ 24 ноября 2010

Может быть попробовать

((JFrame) myButton.getTopLevelAncestor ()) упаковка ();.

Где myButton - кнопка, текст которой изменяется во время выполнения.

1 голос
/ 24 ноября 2010

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

В конечном счете, вы используете JPanel с BorderLayout (Flow Layout в порядке, но на самом деле при изменении размера окна это эпически не получается) См. http://download.oracle.com/javase/tutorial/uiswing/layout/border.html, чтобы узнать больше о BorderLayouts.

Теперь для вашей схемы размещения это должно быть что-то вроде:

  1. Контейнер верхнего уровня: JFrame
  2. JFrame содержит JPanel (Назовите это JPanel 1) с BorderLayout.
  3. Три кнопки должны быть в РАЗДЕЛИТЬ jPanel (JPanel 2). JPanel 1 следует добавить три кнопки как BorderLayout.CENTER. В этом случае, размер окна изменится, если кнопка изменяет свою ширину и / или высоту.
  4. JLabel должен быть добавлен как BorderLayout.LINE_START.

Учебное пособие по адресу: http://download.oracle.com/javase/tutorial/uiswing/layout/border.html должно помочь вам в этом. Но в целом используйте следующее:

  • При необходимости используйте JPanel и вкладывайте JPanels
  • BorderLayout.CENTER будет учитывать изменения размера - это ключ! (Экспериментируйте с этим)
  • JFrame следует использовать только в качестве контейнера верхнего уровня (для более сложных графических интерфейсов это действительно так).

Если вам требуется больше гибкости, проверьте JGoodies: http://www.jgoodies.com/. Это больше похоже на создание форм.

...