0

I'm creating a slideshow using swing and trying to place it in the center of my JFrame. The slideshow works fine, but it's taking up the entire center section. How would I limit it to a small place under the banner?

Here's a picture of what it looks like.

Here's a picture of what it looks like.

Here's a picture of what I want it to look like

Here's a picture of what I want it to look like

This is what I have so far, you run this class.

package com.RBV2.engine;

import javax.swing.*;

import com.RBV2.Settings;
import com.RBV2.panels.News;
import com.RBV2.panels.SlideShow;
import com.RBV2.panels.SlideShow.MovingPanel;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;

import java.io.*;
/*
 * Author Jon & David
 * 
 */
@SuppressWarnings("serial")
public class Client extends JFrame implements ActionListener {
    private JPanel bottomPanel, news;
    private JButton launch;
    private JLabel loading, banner;
    private MovingPanel slideshow;

    protected boolean updated = false;

    private void createLayout() {
        createPanel();
        addPanel();
        setVisible(true);
    }   

     private void createPanel() {
         bottomPanel = new JPanel(new BorderLayout());
         news = new News();
         slideshow = new SlideShow.MovingPanel();
         launch = new JButton(new URL("http://www.runerebellion.com/clientImages/launch.png"));
         loading = new JLabel(new URL("http://www.runerebellion.com/clientImages/loader.gif"));
         banner = new JLabel(new URL("http://www.runerebellion.com/clientImages/201457.gif"));
         launch.addActionListener(this);
     }

     private void addPanel() {
         setTitle("RuneRebellionV2 Launcher");
         setDefaultCloseOperation(EXIT_ON_CLOSE);
         setResizable(false);
         //Bottom Panel
         add(bottomPanel, BorderLayout.SOUTH);
         bottomPanel.add(new JLabel(" Launcher, release " + Settings.version), BorderLayout.WEST);
         bottomPanel.setBackground(Color.BLACK);
         bottomPanel.add(launch, BorderLayout.EAST);
         launch.setPreferredSize(new Dimension(120, 40));
         //News Feed
         add(news, BorderLayout.CENTER);
         news.add(banner, BorderLayout.CENTER);
         banner.setPreferredSize(new Dimension(500, 70));
         //slideshow
         slideshow.setPreferredSize(new Dimension(610, 331));
         add(slideshow, BorderLayout.CENTER);
         //Sets size
         setSize(Settings.width, Settings.height);
     }

     public Client() throws IOException {
        createLayout();
    }

    public static void main(String args[]) throws IOException {
        final Client l = new Client();
        l.setVisible(true);
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                l.setVisible(true);
            }
        });

    }

These specific lines of code call the slideshow(I commented out exactly where)

 private void addPanel() {
 setTitle("RuneRebellionV2 Launcher");
 setDefaultCloseOperation(EXIT_ON_CLOSE);
 setResizable(false);
     //Bottom Panel
     add(bottomPanel, BorderLayout.SOUTH);
     bottomPanel.add(new JLabel(" Launcher, release " + Settings.version), BorderLayout.WEST);
     bottomPanel.setBackground(Color.BLACK);
     bottomPanel.add(launch, BorderLayout.EAST);
     launch.setPreferredSize(new Dimension(120, 40));
     //News Feed
     add(news, BorderLayout.CENTER);
     news.add(banner, BorderLayout.CENTER);
     banner.setPreferredSize(new Dimension(500, 70));
     //slideshow here
     slideshow.setPreferredSize(new Dimension(610, 331));
     add(slideshow, BorderLayout.CENTER);
     //Sets size
     setSize(Settings.width, Settings.height);
 }

Here is my slideshow class, you may need this also.

package com.RBV2.panels;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class SlideShow extends JFrame {
    public static class MovingPanel extends JPanel {
        public int i = 0;

    public MovingPanel() {
        Timer timer = new Timer(3000, new TimerListener());
        timer.start();
    }

    protected void paintComponent(Graphics x) {
        super.paintComponent(x);
        int y = i % 25;

        Image showImg = new ImageIcon("bin/slide/" + y + ".png").getImage();
        x.drawImage(showImg, 0, 0, getWidth(), getHeight(), 0, 0, 610, 331, null);
    }

    class TimerListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            i++;
            repaint();
            if (i >= 5)
                i = 1;
        }
    }

}
}

So my question is how would I limit the slideshow to be in a box in the very center under the banner.

mKorbel
  • 109,525
  • 20
  • 134
  • 319
RuneRebellion
  • 149
  • 1
  • 2
  • 12
  • In order to compile it, you could remove the news component, and still probably get the slideshow in the correct place. – RuneRebellion Feb 09 '14 at 19:12
  • To center something, put it as the only component in a `GridBagLayout` with no constraints, as shown [here](http://stackoverflow.com/questions/7180198/centering-a-jlabel-on-a-jpanel/7181197#7181197). For better help sooner, post a [MCTaRE](http://stackoverflow.com/help/mcve) (Minimal Complete Tested and Readable Example). – Andrew Thompson Feb 10 '14 at 00:12

2 Answers2

1

Have a look at this picture (from Border layout Tutorial)

enter image description here

As you are only adding panels to the Center and South(PAGE_END) regions of the layout manager there is no other components to stop the center panel from stretching out as far as it can.

Note this relevant sentence of the tutorial

If the window is enlarged, the center area gets as much of the available space as possible. The other areas expand only as much as necessary to fill all available space. Often a container uses only one or two of the areas of the BorderLayout object — just the center, or the center and the bottom.

You either need to add blank panels on the other sides or make use of an empty border within your Center panel. See here about how to use borders.

Java Devil
  • 10,629
  • 7
  • 33
  • 48
  • In that case wouldn't I have to make West & East transparent? Also, my background image is painted to News, and if I set news to page_start, the slideshow component doesn't show at all. – RuneRebellion Feb 09 '14 at 19:32
0

I painted the background, then painted the images over the background

protected void paintComponent(Graphics x) {
            super.paintComponent(x);
            int y = i % 25;

            Image showImg = new ImageIcon("bin/slide/" + y + ".png").getImage();
            super.paintComponent(x);
            x.drawImage((Settings.background).getImage(), 0, 0, getWidth(), getHeight(), this);
            x.drawImage(showImg, 360, 260, getWidth(), getHeight(), 0, 0, 110, 31, null);
}
RuneRebellion
  • 149
  • 1
  • 2
  • 12