JRootPane在全屏模式下调整大小问题

时间:2014-08-20 22:15:03

标签: java swing jpanel fullscreen sizing

我正在尝试使用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;
}
}

1 个答案:

答案 0 :(得分:2)

让我们开始......你不需要创建一个JRootPane,一个JFrame已经有一个,事实上,你真正需要的是要么是TitleScreenPane添加或设置JRootPane contentPane,例如......

//rootPane = new JRootPane();
setContentPane(TitleScreenPanel.getInstance(this));
//add(rootPane, BorderLayout.CENTER);

接下来,JPanel默认使用FlowLayout,所以您看到的实际上就是您应该看到的内容。

为了获得您想要的内容,您需要将TitleScreenPanel的布局管理器更改为BorderLayout ...

作为一个可运行的例子......

FullScreen

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;
        }
    }
}