我正在尝试使用JRootPane创建一个占据整个屏幕的JFrame,但由于某种原因,JRootPane的内容不会像应该的那样填满屏幕。
我认为问题是JRootPane没有填充其父级,但有可能JRootPane的子面板不会填满根窗格。
这是它目前显示的内容:
Running Application http://i61.tinypic.com/kbu5vs.png
以下是相关代码:
public class Runner {
public static void main(String[] args){
GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] devices = graphicsEnvironment.getScreenDevices();
new MainFrame(devices[0]);
}
}
这是一个带有rootPane的JFrame应该完全填充它:
public class MainFrame extends JFrame{
private GraphicsDevice graphicsDevice;
private DisplayMode origDisplay;
private final JRootPane rootPane;
public MainFrame(GraphicsDevice graphicsDevice){
super();
this.setGraphicsDevice(graphicsDevice);
this.setOrigDisplay(graphicsDevice.getDisplayMode());
rootPane = new JRootPane();
rootPane.setContentPane(TitleScreenPanel.getInstance(this));
this.add(rootPane, BorderLayout.CENTER);
if (graphicsDevice.isFullScreenSupported()){
setUndecorated(true);
setResizable(false);
graphicsDevice.setFullScreenWindow(this);
revalidate();
}else{
System.out.println("Full-screen mode not supported");
}
try {
Theme.loadTheme(new File("res/IS.theme"));
UIManager.setLookAndFeel(new TinyLookAndFeel());
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
SwingUtilities.updateComponentTreeUI(this);
Toolkit.getDefaultToolkit().setDynamicLayout(true);
System.setProperty("sun.awt.noerasebackground", "true");
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
rootPane.revalidate();
}
public DisplayMode getOrigDisplay() {
return origDisplay;
}
public void setOrigDisplay(DisplayMode origDisplay) {
this.origDisplay = origDisplay;
}
public GraphicsDevice getGraphicsDevice() {
return graphicsDevice;
}
public void setGraphicsDevice(GraphicsDevice graphicsDevice) {
this.graphicsDevice = graphicsDevice;
}
}
正在添加到JRootPane的面板:
public class TitleScreenPanel extends JPanel{
private static TitleScreenPanel titleScreenPanel;
private JButton exitButton;
private JButton startButton;
private TitleScreenPanel(final MainFrame context){
startButton = new JButton("START");
startButton.setFont(startButton.getFont().deriveFont(48f));
startButton.setBorder(BorderFactory.createEmptyBorder());
startButton.setContentAreaFilled(false);
exitButton = new JButton("Exit Full-Screen Mode");
exitButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
context.getGraphicsDevice().setDisplayMode(context.getOrigDisplay());
System.exit(0);
}
});
this.add(startButton, BorderLayout.CENTER);
this.add(exitButton, BorderLayout.SOUTH);
}
public static TitleScreenPanel getInstance(MainFrame context){
if(titleScreenPanel == null){
titleScreenPanel = new TitleScreenPanel(context);
}
return titleScreenPanel;
}
}
答案 0 :(得分:2)
让我们开始......你不需要创建一个JRootPane
,一个JFrame
已经有一个,事实上,你真正需要的是要么是TitleScreenPane
添加或设置JRootPane
contentPane
,例如......
//rootPane = new JRootPane();
setContentPane(TitleScreenPanel.getInstance(this));
//add(rootPane, BorderLayout.CENTER);
接下来,JPanel
默认使用FlowLayout
,所以您看到的实际上就是您应该看到的内容。
为了获得您想要的内容,您需要将TitleScreenPanel
的布局管理器更改为BorderLayout
...
作为一个可运行的例子......
import java.awt.BorderLayout;
import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MainFrame extends JFrame {
public static void main(String[] args) {
GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] devices = graphicsEnvironment.getScreenDevices();
new MainFrame(devices[0]);
}
private GraphicsDevice graphicsDevice;
private DisplayMode origDisplay;
// private final JRootPane rootPane;
public MainFrame(GraphicsDevice graphicsDevice) {
super();
this.setGraphicsDevice(graphicsDevice);
this.setOrigDisplay(graphicsDevice.getDisplayMode());
// rootPane = new JRootPane();
setContentPane(TitleScreenPanel.getInstance(this));
// add(rootPane, BorderLayout.CENTER);
if (graphicsDevice.isFullScreenSupported()) {
setUndecorated(true);
setResizable(false);
graphicsDevice.setFullScreenWindow(this);
revalidate();
} else {
System.out.println("Full-screen mode not supported");
}
// try {
// Theme.loadTheme(new File("res/IS.theme"));
// UIManager.setLookAndFeel(new TinyLookAndFeel());
// } catch (UnsupportedLookAndFeelException e) {
// e.printStackTrace();
// }
// SwingUtilities.updateComponentTreeUI(this);
// Toolkit.getDefaultToolkit().setDynamicLayout(true);
System.setProperty("sun.awt.noerasebackground", "true");
// JFrame.setDefaultLookAndFeelDecorated(true);
// JDialog.setDefaultLookAndFeelDecorated(true);
// rootPane.revalidate();
}
public DisplayMode getOrigDisplay() {
return origDisplay;
}
public void setOrigDisplay(DisplayMode origDisplay) {
this.origDisplay = origDisplay;
}
public GraphicsDevice getGraphicsDevice() {
return graphicsDevice;
}
public void setGraphicsDevice(GraphicsDevice graphicsDevice) {
this.graphicsDevice = graphicsDevice;
}
public static class TitleScreenPanel extends JPanel {
private static TitleScreenPanel titleScreenPanel;
private JButton exitButton;
private JButton startButton;
private TitleScreenPanel(final MainFrame context) {
setLayout(new BorderLayout());
startButton = new JButton("START");
startButton.setFont(startButton.getFont().deriveFont(48f));
startButton.setBorder(BorderFactory.createEmptyBorder());
startButton.setContentAreaFilled(false);
exitButton = new JButton("Exit Full-Screen Mode");
exitButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
context.getGraphicsDevice().setDisplayMode(context.getOrigDisplay());
System.exit(0);
}
});
this.add(startButton, BorderLayout.CENTER);
this.add(exitButton, BorderLayout.SOUTH);
}
public static TitleScreenPanel getInstance(MainFrame context) {
if (titleScreenPanel == null) {
titleScreenPanel = new TitleScreenPanel(context);
}
return titleScreenPanel;
}
}
}