什麼是居中java.awt.Window
最簡單的方法,如JFrame
或JDialog
?如何在Java中居中一個窗口?
回答
從 blog.codebeach.com/2008/02/center-dialog-box-frame-or-window-in.html(現在死了)
如果您使用的是Java 1.4或更高版本, 您可以用簡單的方法 setLocationRelativeTo(空)的 對話框,畫面,或窗口上居中 它。
正如@kleopatra在另一個答案中所說的,必須在pack()之後調用setLocationRelativeTo(null)才能工作。 – Eusebius 2014-04-19 05:18:35
如下所述,在調用pack()或setSize()之後,必須調用setLocationRelativeTo(null)。 – 2014-05-13 10:11:57
@Eusebius Odd,我跟着一個讓我在`pack()`之前設置它的教程,它將框架的一個角落放在屏幕的中心。將該行移動到`pack()`下方後,它正確居中。 – user1433479 2014-07-06 20:52:09
這應該在Java中
public static void centreWindow(Window frame) {
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) ((dimension.getWidth() - frame.getWidth())/2);
int y = (int) ((dimension.getHeight() - frame.getHeight())/2);
frame.setLocation(x, y);
}
我知道這是相當古老的,但這工作得很好,只要在調用此函數之前設置了框架大小 – 2016-05-27 08:14:11
是的,確保大小應用於之前(例如使用pack()) – Myoch 2017-02-23 13:01:53
注意的所有版本,無論是setLocationRelativeTo(空)和Tookit.getDefaultToolkit()。getScreenSize()技術僅用於主顯示器的工作。如果你是在多顯示器環境中,您可能需要獲得有關特定顯示器的窗口上做這種計算之前的信息。
有時重要,有時不...
關於如何獲得更多的相關信息,請參閱GraphicsEnvironment javadocs。
frame.setLocationRelativeTo(空);
完整的示例:
public class BorderLayoutPanel {
private JFrame mainFrame;
private JButton btnLeft, btnRight, btnTop, btnBottom, btnCenter;
public BorderLayoutPanel() {
mainFrame = new JFrame("Border Layout Example");
btnLeft = new JButton("LEFT");
btnRight = new JButton("RIGHT");
btnTop = new JButton("TOP");
btnBottom = new JButton("BOTTOM");
btnCenter = new JButton("CENTER");
}
public void SetLayout() {
mainFrame.add(btnTop, BorderLayout.NORTH);
mainFrame.add(btnBottom, BorderLayout.SOUTH);
mainFrame.add(btnLeft, BorderLayout.EAST);
mainFrame.add(btnRight, BorderLayout.WEST);
mainFrame.add(btnCenter, BorderLayout.CENTER);
// mainFrame.setSize(200, 200);
// or
mainFrame.pack();
mainFrame.setVisible(true);
//take up the default look and feel specified by windows themes
mainFrame.setDefaultLookAndFeelDecorated(true);
//make the window startup position be centered
mainFrame.setLocationRelativeTo(null);
mainFrame.setDefaultCloseOperation(mainFrame.EXIT_ON_CLOSE);
}
}
以下爲JDK 1.7.0.07不起作用:
frame.setLocationRelativeTo(null);
它把左上角的中心 - 不一樣的定心窗。另一個也不起作用,涉及frame.getSize()和dimension.getSize():
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) ((dimension.getWidth() - frame.getWidth())/2);
int y = (int) ((dimension.getHeight() - frame.getHeight())/2);
frame.setLocation(x, y);
所述的getSize()方法從Component類繼承,因此frame.getSize返回的大小窗戶也是如此。因此減去垂直和水平尺寸一半的垂直和水平尺寸,找到X,這裏放置左上角y座標,爲您提供了中心點,這最終爲中心的窗口以及位置。但是,上述代碼的第一行很有用,「維度...」。只要做到這一點居中:
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
JLabel emptyLabel = new JLabel("");
emptyLabel.setPreferredSize(new Dimension((int)dimension.getWidth()/2, (int)dimension.getHeight()/2));
frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);
frame.setLocation((int)dimension.getWidth()/4, (int)dimension.getHeight()/4);
JLabel設置屏幕大小。它位於Oracle/Sun網站的Java教程中的FrameDemo.java中。我將它設置爲屏幕尺寸高度/寬度的一半。然後,我通過將左上在從左側的畫面尺寸的尺寸的四分之一,並且從頂部開始的屏幕尺寸的尺寸的1/4居中它。你可以使用類似的概念。
另一個也沒有。這些代碼將屏幕的左上角放在中間。 – 2012-09-30 05:46:58
其實幀.getHeight()
和getwidth()
犯規返回值,由System.out.println(frame.getHeight());
檢查它直接把值寬度和高度,然後它會在中心正常工作。例如:如下面
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x=(int)((dimension.getWidth() - 450)/2);
int y=(int)((dimension.getHeight() - 450)/2);
jf.setLocation(x, y);
既450是我的幀寬度爲n高度
setLocationRelativeTo(空)應該被稱爲你要麼使用的setSize(X,Y)後,或使用包()。
在Linux代碼
setLocationRelativeTo(null)
把我的窗口隨機位置每次我啓動它,在多顯示器環境中的時間。 和代碼
setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - getSize().width)/2, (Toolkit.getDefaultToolkit().getScreenSize().height - getSize().height)/2);
「切」窗口中的一半將它的確切中心,這是我的兩個顯示器之間。 我用下面的方法使其居中:
private void setWindowPosition(JFrame window, int screen)
{
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] allDevices = env.getScreenDevices();
int topLeftX, topLeftY, screenX, screenY, windowPosX, windowPosY;
if (screen < allDevices.length && screen > -1)
{
topLeftX = allDevices[screen].getDefaultConfiguration().getBounds().x;
topLeftY = allDevices[screen].getDefaultConfiguration().getBounds().y;
screenX = allDevices[screen].getDefaultConfiguration().getBounds().width;
screenY = allDevices[screen].getDefaultConfiguration().getBounds().height;
}
else
{
topLeftX = allDevices[0].getDefaultConfiguration().getBounds().x;
topLeftY = allDevices[0].getDefaultConfiguration().getBounds().y;
screenX = allDevices[0].getDefaultConfiguration().getBounds().width;
screenY = allDevices[0].getDefaultConfiguration().getBounds().height;
}
windowPosX = ((screenX - window.getWidth())/2) + topLeftX;
windowPosY = ((screenY - window.getHeight())/2) + topLeftY;
window.setLocation(windowPosX, windowPosY);
}
使窗口右邊在第一顯示器的中心出現。 這可能不是最簡單的解決方案。
在Linux,Windows和Mac上正常工作。
public class SwingExample implements Runnable {
@Override
public void run() {
// Create the window
final JFrame f = new JFrame("Hello, World!");
SwingExample.centerWindow(f);
f.setPreferredSize(new Dimension(500, 250));
f.setMaximumSize(new Dimension(10000, 200));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void centerWindow(JFrame frame) {
Insets insets = frame.getInsets();
frame.setSize(new Dimension(insets.left + insets.right + 500, insets.top + insets.bottom + 250));
frame.setVisible(true);
frame.setResizable(false);
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) ((dimension.getWidth() - frame.getWidth())/2);
int y = (int) ((dimension.getHeight() - frame.getHeight())/2);
frame.setLocation(x, y);
}
}
以下代碼將Window
居中放置在當前顯示器的中心(即鼠標指針所在的位置)。
public static final void centerWindow(final Window window) {
GraphicsDevice screen = MouseInfo.getPointerInfo().getDevice();
Rectangle r = screen.getDefaultConfiguration().getBounds();
int x = (r.width - window.getWidth())/2 + r.x;
int y = (r.height - window.getHeight())/2 + r.y;
window.setLocation(x, y);
}
有很簡單的東西,你可能會俯瞰試圖使用中心窗口後要麼setLocationRelativeTo(null)
或setLocation(x,y)
和它最終被一點點偏離中心。
確保您使用的這些方法任何一個後調用pack()
,因爲你最終會使用窗口本身的尺寸計算在何處放置在屏幕上。在調用pack()
之前,維度並不是您想象的那樣,因此將計算放在窗口中央。希望這可以幫助。
我終於拿到了這串代碼,以便使用Swing GUI窗體在NetBeans中工作,中心主要的JFrame:
package my.SampleUIdemo;
import java.awt.*;
public class classSampleUIdemo extends javax.swing.JFrame {
///
public classSampleUIdemo() {
initComponents();
CenteredFrame(this); // <--- Here ya go.
}
// ...
// void main() and other public method declarations here...
/// modular approach
public void CenteredFrame(javax.swing.JFrame objFrame){
Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize();
int iCoordX = (objDimension.width - objFrame.getWidth())/2;
int iCoordY = (objDimension.height - objFrame.getHeight())/2;
objFrame.setLocation(iCoordX, iCoordY);
}
}
OR
package my.SampleUIdemo;
import java.awt.*;
public class classSampleUIdemo extends javax.swing.JFrame {
///
public classSampleUIdemo() {
initComponents();
//------>> Insert your code here to center main jFrame.
Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize();
int iCoordX = (objDimension.width - this.getWidth())/2;
int iCoordY = (objDimension.height - this.getHeight())/2;
this.setLocation(iCoordX, iCoordY);
//------>>
}
// ...
// void main() and other public method declarations here...
}
OR
package my.SampleUIdemo;
import java.awt.*;
public class classSampleUIdemo extends javax.swing.JFrame {
///
public classSampleUIdemo() {
initComponents();
this.setLocationRelativeTo(null); // <<--- plain and simple
}
// ...
// void main() and other public method declarations here...
}
你也可以試試這個。下面
Frame frame = new Frame("Centered Frame");
Dimension dimemsion = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation(dimemsion.width/2-frame.getSize().width/2, dimemsion.height/2-frame.getSize().height/2);
爲在現有的窗口的頂部中心顯示的幀的代碼。
public class SwingContainerDemo {
private JFrame mainFrame;
private JPanel controlPanel;
private JLabel msglabel;
Frame.setLayout(new FlowLayout());
mainFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent windowEvent){
System.exit(0);
}
});
//headerLabel = new JLabel("", JLabel.CENTER);
/* statusLabel = new JLabel("",JLabel.CENTER);
statusLabel.setSize(350,100);
*/ msglabel = new JLabel("Welcome to TutorialsPoint SWING Tutorial.", JLabel.CENTER);
controlPanel = new JPanel();
controlPanel.setLayout(new FlowLayout());
//mainFrame.add(headerLabel);
mainFrame.add(controlPanel);
// mainFrame.add(statusLabel);
mainFrame.setUndecorated(true);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.getRootPane().setWindowDecorationStyle(JRootPane.NONE);
mainFrame.setVisible(true);
centreWindow(mainFrame);
}
public static void centreWindow(Window frame) {
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int) ((dimension.getWidth() - frame.getWidth())/2);
int y = (int) ((dimension.getHeight() - frame.getHeight())/2);
frame.setLocation(x, 0);
}
public void showJFrameDemo(){
/* headerLabel.setText("Container in action: JFrame"); */
final JFrame frame = new JFrame();
frame.setSize(300, 300);
frame.setLayout(new FlowLayout());
frame.add(msglabel);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent windowEvent){
frame.dispose();
}
});
JButton okButton = new JButton("Capture");
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// statusLabel.setText("A Frame shown to the user.");
// frame.setVisible(true);
mainFrame.setState(Frame.ICONIFIED);
Robot robot = null;
try {
robot = new Robot();
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
final Dimension screenSize = Toolkit.getDefaultToolkit().
getScreenSize();
final BufferedImage screen = robot.createScreenCapture(
new Rectangle(screenSize));
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ScreenCaptureRectangle(screen);
}
});
mainFrame.setState(Frame.NORMAL);
}
});
controlPanel.add(okButton);
mainFrame.setVisible(true);
} 公共靜態無效的主要(字串[] args)拋出異常{
new SwingContainerDemo().showJFrameDemo();
}
- 1. 居中整個窗口Java
- 2. 在一個窗口中居中MacGLView
- 3. 如何居中Kendo窗口?
- 4. 如何在Linux中居中SDL窗口?
- 5. 如何在GTK的主窗口中居中對話窗口?
- 6. 如何在頁面上居中顯示一個模態窗口?
- 7. 居中一個JavaScript圖形窗口
- 8. 有一個彈出窗口居中居中父 - Glade,GTK,Python
- 9. 如何居中DIV彈出窗口?
- 10. Tkinter:如何居中窗口標題
- 11. Kendo-Knockout:如何居中窗口
- 12. 如何居中jqGrid popup模態窗口?
- 13. 在Bootstrap中將一個相對div居中置於窗口
- 14. 如何在父窗口窗體中顯示一個窗口?
- 15. 從另一個子窗口顯示一個新的子窗口,但居中它在父窗口
- 16. 如何在一個窗口中打開多個Tkinter窗口
- 17. 在VTK窗口中居中圖像
- 18. 在div中間居中模態窗口
- 19. 在WPF中居中對話窗口
- 20. 在視口中居中一個點/ div
- 21. 居中javascript彈出窗口
- 22. 居中文檔窗口
- 23. 居中窗口python tkinter
- 24. 如何從一個java關閉窗口中返回一個值?
- 25. 這個窗口爲什麼不居中?
- 26. 居中整個窗口視頻
- 27. 如何在項目中打開另一個窗口(Xcode窗口)?
- 28. 在屏幕上居中顯示一個彈出窗口?
- 29. 如何在一個窗格中居中節點javafx
- 30. 如何使用fieldset在div中居中放置一個窗體?
標題應該是「在Swing中」而不是「在Java中」,這樣會更清楚。 – 2008-09-28 01:06:25
@Joe`setLocation()`,`setLocationRelativeTo()`和`setLocationByPlatform()`或者所有的AWT,而不是Swing。 ;) – 2011-09-13 08:58:52