Изменение размера JFrame - PullRequest
1 голос
/ 03 декабря 2009

Хорошо, это будет довольно глупо - я делаю графический интерфейс с помощью визуального редактора Eclipse (JFrame с содержимым в нем), в основном с левой стороны есть несколько кнопок, текстовых полей и т. Д., А с правой стороны - 4 JPanels (с некоторой графикой в ​​них).

Проблема в том, что когда я изменяю размер графического интерфейса (JFrame) во время выполнения, компоненты внутри остаются неизменными (по размеру), и я бы хотел, чтобы эти 4 JPanels изменили размеры с JFrame, возможно ли это?

Ответы [ 5 ]

2 голосов
/ 03 декабря 2009

Простой ответ - используйте управление компоновкой, включая вложение нескольких панелей с разными компоновками, чтобы получить желаемый результат. По сути, у вас есть два варианта: (а) использовать менеджер компоновки для управления расположением и размерами компонентов, или (б) делать все вручную. Вы действительно не хотите делать (б).

Возможно, вы захотите начать с учебника по .

Использование макета на основе таблицы может значительно облегчить компоновку , чем стандартные менеджеры компоновки, распространяемые с Java; Есть много доступных бесплатно. Мой на tech.dolhub.com .

Вот пример (из справки в MatrixLayout, но я не помню, действительно ли я когда-либо компилировал код примера ... Полагаю, что однажды это сделал):

+--------------------------------------------------------------------------------+
+                                                                                |
+     Name : |________________________________________________________________|  |
+                                                                                |
+  Address : |________________________________________________________________|  |
+                                                                                |
+            |________________________________________________________________|  |
+                                                                                |
+            |________________________________________________________________|  |
+                                                                                |
+     City : |____________________| State |__| Zip |_____| - |____|              |
+                                                                                |
+    Phone : |___|-|___|-|____|                                                  |
+                                                                                |
+    Notes : |                              |  |                              |  |
+            |                              |  |                              |  |
+            |                              |  |                              |  |
+            |                              |  |                              |  |
+            |                              |  |                              |  |
+            |______________________________|  |______________________________|  |
+            [BOTTOM-LEFT]                                     [ BOTTOM-RIGHT ]  |
+                                                                                |
+                       [      Yes      ]   [      No      ]   [    Abort     ]  |
+                                                                                |
+--------------------------------------------------------------------------------+
private void createContent(Container main){
    String[]                            rows,cols;                                  // row/column specification arrays

    JPanel                              phnpnl,cszpnl,btnpnl;                       // special nested panels

    // create components here...

    // CREATE MAIN PANEL WITH DESIRED ROWS AND COLUMNS
    rows=MatrixLayout.arrayOf(10,"Size=Pref CellAlign=Middle CellInsets=5,0");   // standard row spec
    rows[6]                     ="Size=100% CellAlign=Top    CellInsets=5,0";    // note: row 7 ([6] is index)
    rows[7]                     ="Size=Pref CellAlign=Top    CellInsets=5,0";    // note: row 8 ([7] is index)
    rows[8]                     ="Size=Pref CellAlign=Top    CellInsets=5,0";    // note: row 9 ([8] is index)
    cols=MatrixLayout.arrayOf(3 ,"size=Pref CellAlign=Right  CellInsets=5,0");   // standard column spec
    cols[1]                     ="Size=50%  CellAlign=Left   CellInsets=5,0";    // note: col 2 ([1] is index)
    cols[2]                     ="Size=50%  CellAlign=Left   CellInsets=5,0";    // note: col 3 ([2] is index)
    con.setLayout(new MatrixLayout(rows,cols,"Row=Cur Col=Next"));

    // CREATE SPECIAL NESTED PANELS
    phnpnl=MatrixLayout.singleRowBar(5,false,new DctComponent[]{phnPart1,phnPart2,phnPart3                                   });
    cszpnl=MatrixLayout.singleRowBar(5,1    ,new DctComponent[]{city,createLabel("State"),state,createLabel("Zip"),zip,zipext});
    btnpnl=MatrixLayout.singleRowBar(5,true ,new DctComponent[]{yes,no,cancel                                                });
    phnpnl.setName("PhonePanel");
    cszpnl.setName("CityStateZipPanel");
    btnpnl.setName("ButtonPanel");

    // ADD COMPONENTS TO MAIN PANEL
    con.add(createLabel(   "Name :"),"row=Next col=1"); con.add(name    ,"               hAlign=Fill  hSpan=2                               ");
    con.add(createLabel("Address :"),"row=Next col=1"); con.add(address1,"               hAlign=Fill  hSpan=2                               ");
                                                        con.add(address2,"Row=Next Col=2 hAlign=Fill  hSpan=2                               ");
                                                        con.add(address3,"Row=Next Col=2 hAlign=Fill  hSpan=2                               ");
    con.add(createLabel(   "City :"),"row=Next col=1"); con.add(cszpnl  ,"                            hSpan=2                               ");
    con.add(createLabel(  "Phone :"),"row=Next col=1"); con.add(phnpnl  ,"                            hSpan=2                               ");
    con.add(createLabel(  "Notes :"),"row=Next col=1"); con.add(notes1  ,"Row=Cur  Col=2 hAlign=Fill          vAlign=Fill                   ");
                                                        con.add(notes2  ,"Row=Cur        hAlign=Fill          vAlign=Fill                   ");
                                                        con.add(notes3  ,"Row=Next Col=2 hAlign=Left                      hGroup=NoteButtons");
                                                        con.add(notes4  ,"Row=Cur        hAlign=Right                     hGroup=NoteButtons");
    con.add(btnpnl                  ,"row=Next col=1 hAlign=Right hSpan=3");
    main.setBorder(new DctEmptyBorder(10));
    main.setBackground(SystemColor.window);
    }
0 голосов
/ 08 февраля 2017

Ну, это может быть ужасной работой без менеджера по раскладке, но если вы хотите этого ... вот и мы.

  1. Добавьте ComponentListener к вашему кадру, чтобы прослушать его изменение размера, где вы можете получить размер окон после изменения размера.

Как:

frame.addComponentListener(new ComponentListener() {

    @Override
    public void componentShown(ComponentEvent e) {

    }

    @Override
    public void componentResized(ComponentEvent e) {
        if (e.getSource() instanceof JFrame) {
              JFrame frame = (JFrame)(e.getSource());
              frame.repaintElements(frame.getWidth(), frame.getHeight());
        }
    }

    @Override
    public void componentMoved(ComponentEvent e) {

    }

    @Override
    public void componentHidden(ComponentEvent e) {

    }
});
  1. В вашем JFrame классе (в этом случае вы должны сделать его дочерним классом JFrame, чтобы добавить свой собственный метод), определите метод repaintElements(int w, int h), взяв в качестве аргументов новую высоту и новую ширину .

  2. В repaintElements(int x, int y) реализуйте свою логику, чтобы изменить местоположение и размер каждого элемента. Я использую setBound(int x, int y, int w, int h). x и y определяют местоположение левого верхнего угла элемента относительно его контейнера, а w и h определяют его размер.

В конце концов, я заставил его работать в моем проекте, но это все утомительно. Подумайте об этом:

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

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

label1.setBounds(5, 0, x-5, 30);

так что каждый раз, когда окна изменяют размер, метка располагается на 5 пикселей с самого левого края, 0 пикселей с самого верха, x-5 пикселей с шириной (чтобы оставить место для границы) и всегда на 30 пикселей высоты.

Теперь у меня есть JScrollPane, содержащий JTable. Я хочу, чтобы он расширялся вместе с окном, поэтому:

table.setBounds(5, 30, x-15, y-30-60-5);

Поскольку по вертикали я должен оставить место для надписи выше (30 пикселей) и панели внизу (60 пикселей) и кнопки внизу (5 пикселей), а расположение этой таблицы определяется высотой и шириной надписи выше (5 и 30, если без границ ...). На столе есть вертикальная прокрутка, поэтому я тоже должен оставить для нее место (так что x-15 вместо x-5. Святое дерьмо.)

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

panel.setBounds(5, y-30-60-5+30, x-10, 60); //the y value is "y coordinate of the element above" + "width of the element above"

Наконец, кнопка. Я решил не увеличивать его размер, а просто оставить его в углу, поэтому:

button.setBounds(x-20, y-10, 15, 5); //the button is 15*5 pixels. extra space is for border.

Легко? Вроде бы так, но вам нужно много тестировать ........ И если размер границы изменится, еще один адский тест ... На самом деле вы тратите время на некоторые тривиальные вещи и вскоре вам становится скучно. Итак, воспользуйтесь менеджером макетов.

0 голосов
/ 03 декабря 2009

Хорошо, да, я знаю, что должен использовать менеджер макетов и т. Д., Но все же я решил построить его с помощью визуального редактора Eclipse (в котором нет всех существующих менеджеров макетов), потому что у меня мало времени для этого проекта, и я подумал, что так будет быстрее.

В основном этот экран показывает, как должна выглядеть программа - некоторые случайные кнопки ввода / слева (добавленные случайные кнопки на данный момент) и 4 JPanels справа - они очень важны для меня.

экран http://img130.imageshack.us/img130/5282/screenmy.png

0 голосов
/ 03 декабря 2009

Используйте менеджер раскладки. Если вы не используете его, вам придется изменить его размер самостоятельно (что будет включать установку нового местоположения каждый раз)

LayoutManagers кажется проблематичным, и на самом деле это так.

В Java 1.6 был добавлен менеджер GroupLayout , и я думаю, что он довольно полезен и достаточно прост.

alt text

Сила менеджеров макета высвобождается при использовании в сочетании с другими. Вот Визуальное руководство для менеджеров по макету .

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

0 голосов
/ 03 декабря 2009

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

JFrame frame = new JFrame();
Container cp = frame.getContentPane();
cp.setLayout(new GridLayout(2, 2));
cp.add(new JButton("one"));
cp.add(new JButton("two"));
cp.add(new JButton("three"));
cp.add(new JButton("four"));
frame.pack();
frame.setVisible(true);

однако вы можете использовать много разных менеджеров раскладки. прочитайте это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...