I am having some difficulty figuring out why there is a difference between the results I see on the Title Screen and the Setup Screen. I copy/pasted the majority of the code before tweaking each... it clearly has to do with something in my outer frame, but I don't know what. The problem I am seeing is that although the Title Screen comes up at the correct size of 1024x768 with the background correctly displayed, the Setup Screen comes up as a very small window as though I had not just set it's size. The background image is also only shown in that sliver of space, even if the box is resized.

I have removed all of the elements inside of Title Screen but it still maintains its size. Can someone help? Thanks

OuterFrame

public class OuterFrame extends JFrame {

public OuterFrame(String windowHeading) {

int WIDTH = 1024;
int HEIGHT = 768;
final Dimension screenSize = new Dimension(WIDTH,HEIGHT);

setDefaultCloseOperation(DISPOSE_ON_CLOSE);

JPanel title = new TitleScreen();
title.setLayout(new BoxLayout(title, BoxLayout.PAGE_AXIS));
JButton matchButton = new JButton("New Match");
    //Add action listener to button
    matchButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            //Execute when button is pressed
            removeAll();
            JPanel setupScreen = new SetupScreen();             

            add(setupScreen);
            pack();
        }
    });         
JButton exitButton = new JButton("Exit to Windows");
    //Add action listener to button
    exitButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            //Execute when button is pressed
            System.exit(0);
        }
    }); 
matchButton.setAlignmentX(title.CENTER_ALIGNMENT);
exitButton.setAlignmentX(title.CENTER_ALIGNMENT);

title.setPreferredSize(screenSize);
title.add(matchButton);
title.add(Box.createRigidArea(new Dimension(0,25)));
title.add(exitButton);

add(title);

pack();
}
}

Title Screen

public class TitleScreen extends JPanel {
public BufferedImage background;

public TitleScreen() {
    try {
        InputStream is = new BufferedInputStream(new FileInputStream("images/datascreen.png"));
        Image image = ImageIO.read(is);
        background = (BufferedImage)image; 
    } catch (Exception a) {
    }
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;

    g2.drawImage(background,0,0,1024,768,null);
}
}

SetupScreen

public class SetupScreen extends JPanel {
public BufferedImage background;

public SetupScreen() {
    try {
        InputStream is = new BufferedInputStream(new FileInputStream("images/datascreen.png"));
        Image image = ImageIO.read(is);
        background = (BufferedImage)image; 
    } catch (Exception a) {
    }
    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;

    g2.drawImage(background,0,0,1024,768,null);
}
}

Sorry about the formatting.. I can't for the life of me make it keep the indention I use in my code.

Edit:

@Override
public Dimension getPreferredSize() {
    return new Dimension(1024, 768);
}

I added the above to both the title and the setup classes, as well as removing the hard coded resize. The issue still occurs - the window is sized correctly for the title but not the setup. Any help would be appreciated..

有帮助吗?

解决方案

Read the Swing tutorial on Custom Painting for the basics. In this case the problem is that you don't override the getPreferredSize() method of your custom component, so the layout manager basically uses 0.

The reason your first screen displays is because you hardcoded:

title.setPreferredSize(screenSize);

This is a no-no (for too many reasons to go into detail here). The component should return its preferred size as mentioned above and then the pack() statement will work properly.

其他提示

Figured out that the problem was the removeAll() statement. I added getContentPane. to it and it worked fine.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top