我在應用程式中添加了一個簡單statusBar的。它作業正常,根據解析度調整其大小。
只是通過添加這個狀態欄,應用程式中的其他元素,例如文本欄位或表格,突然失去了“調整元素”的能力。
如果我們在代碼中洗掉這三行,我會丟失狀態欄,但其他元素會根據我的需要進行調整。
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(statusBar, BorderLayout.SOUTH);
如何使兩者statusBar和其他元素都調整大小?
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.sql.SQLException;
public class Menu {
static void MenuBar() throws SQLException, IOException {
JFrame frame = new JFrame("frame");
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
frame.setSize(1600, 1000);
frame.setVisible(true); //If I delete any more, all the content will disappear
frame.setContentPane(new Recipe().Main);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BorderLayout());
JStatusBar statusBar = new JStatusBar();
JLabel leftLabel = new JLabel("App");
statusBar.setLeftComponent(leftLabel);
final JLabel timeLabel = new JLabel();
timeLabel.setHorizontalAlignment(JLabel.CENTER);
statusBar.addRightComponent(timeLabel);
contentPane.add(statusBar, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
uj5u.com熱心網友回復:
作為概念證明,我稍微修改了您的代碼以向您展示我的意思:
public class Menu {
void MenuBar() throws SQLException, IOException {
JFrame frame = new JFrame("frame");
JMenuBar menuBar = new JMenuBar();
menuBar.add(new JMenu("Main Menu"));
frame.setJMenuBar(menuBar);
frame.setSize(600, 400);
JPanel center = new JPanel();
center.add(new JLabel("CENTER"));
Container contentPane = frame.getContentPane();
contentPane.add(center, BorderLayout.CENTER);
JPanel south = new JPanel();
south.add(new JLabel("SOUTH"));
south.setBackground(Color.green);
JLabel leftLabel = new JLabel("App");
// statusBar.setLeftComponent(leftLabel);
final JLabel timeLabel = new JLabel();
timeLabel.setHorizontalAlignment(JLabel.CENTER);
// statusBar.addRightComponent(timeLabel);
contentPane.add(south, BorderLayout.SOUTH);
JPanel east = new JPanel();
east.add(new JLabel("EAST"));
east.setBackground(Color.cyan);
contentPane.add(east, BorderLayout.EAST);
JPanel west = new JPanel();
west.add(new JLabel("WEST"));
west.setBackground(Color.yellow);
contentPane.add(west, BorderLayout.WEST);
JPanel north = new JPanel();
north.add(new JLabel("NORTH"));
north.setBackground(Color.orange);
contentPane.add(north, BorderLayout.NORTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Menu menu = new Menu();
try {
menu.MenuBar();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
上面的代碼產生以下結果(不呼叫pack()以尊重框架的設定大小)

正如您從上面的代碼中看到的那樣,我沒有向框架的內容窗格添加新 內容,因為默認情況下,當您通過. 我只是在使用它并將組件設定在此布局管理器指定的不同區域中。BorderLayoutJFrame
調整框架大小
不同的布局管理器在調整大小事件期間執行不同的行為。這一切都取決于布局管理器。例如,默認JPanel使用FlowLayout。根據面板渲染時的大小,您將看到 a 內的組件JPanel從左到右排列。當沒有更多空間(由面板的邊界定義)時,您將看到組件排列在第一個組件下方的“行”上。這意味著,如果您在調整大小期間減小面板的寬度,您應該會看到組件在此面板內被包裹并堆疊在其他組件之上。相反,如果您使用GridLayout并調整面板大小,行為完全不同。您甚至可以設定最小和/或最大尺寸來限制組件應該調整多少或多少,以及首選大小屬性,當首選“無布局管理器”時,該屬性與容器的“大小”屬性不同. 這稱為“絕對定位”,當您想要完全控制組件應放置的實際 ( x, y ) 坐標并且布局管理器設定為null時完成. 當然,這不是優選的。最好(在我看來)將此責任委托給 Java Swing 附帶的各種布局管理器,或者自己撰寫一個(撰寫一個可能說起來容易做起來難)。我說了這么多,就是說我在評論部分發表的同樣的話:
花一些時間閱讀有關布局管理器的 Oracle 教程,以了解不同 Swing 組件默認提供的布局管理器。
這也將幫助您了解(例如)發生調整大小事件時預期的行為以及您需要在代碼中執行的操作以調整此行為以滿足您的需求。例如,如果您需要創建一個跳棋或國際象棋應用程式,很明顯您將需要一個帶有GridLayout管理器的容器。但是您可以對其進行調整以定義最小和最大尺寸、首選尺寸等。
此外,Andrew Thompson 提到的一些非常重要的事情......您需要知道何時呼叫某些方法。他特別提到了何時打電話pack()和setVisible()。像這樣的小事情(不是真的很小)可以有所作為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/416538.html
標籤:
